old_gravity/main.py

95 lines
3.3 KiB
Python
Raw Permalink Normal View History

2020-01-27 16:21:31 +01:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 25 20:54:34 2020
@author: suwako
"""
import sys, pygame, time, random
import numpy as np
pygame.init()
black=(0,0,0)
size = width, height = 1366, 720
TICK_RATE=60
camera=np.array([0.,0.])
origin=camera=np.array([0.,0.])
2020-01-28 11:00:33 +01:00
follow=1
2020-01-27 16:21:31 +01:00
screen = pygame.display.set_mode(size)
class satellite(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
2020-01-31 17:44:20 +01:00
self.image = pygame.image.load("assets/ship.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (self.image.get_rect().width*5, self.image.get_rect().height*5))
2020-01-27 16:21:31 +01:00
self.position = self.image.get_rect()
self.speed=np.array([0.,0.])
self.pos = np.array([0.,0.])
self.mass=1
self.G=0.0000001
def tick(self, camera=np.array([0.,0.]), origin=np.array([0.,0.])):
self.pos += self.speed
def apply(self, camera=np.array([0.,0.]), origin=np.array([0.,0.])):
self.position.x, self.position.y = map(int, self.pos-camera-origin)
def apply_gravity(self, elements):
for element in elements:
if element != self:
d=(element.pos - self.pos )
u=d/np.linalg.norm(d)
norm = self.G * element.mass*(d[0]**2+d[1]**2)
self.speed+=norm*u
premier = satellite()
#premier.position.center = (width/2, height/2)
tick=(time.time(), time.time(), 0)
def clip(val, minval, maxval):
return min(max(val, minval), maxval)
elements=[satellite() for _ in range(3)]
2020-01-28 11:00:33 +01:00
"""for element in elements:
2020-01-27 16:21:31 +01:00
element.pos=np.array([random.randint(0,width), random.randint(0,height)], dtype='float64')
2020-01-28 11:00:33 +01:00
element.speed=np.array([random.randint(0,50), random.randint(0,50)], dtype='float64')"""
elements[1].pos= np.array([-500.,0.])
elements[0].pos= np.array([-100.,0.])
elements[0].speed[1]=20
elements[1].mass=300
2020-01-27 16:21:31 +01:00
elements[2].mass=30
2020-01-28 11:00:33 +01:00
elements[2].speed[1]=100
2020-01-27 16:21:31 +01:00
keys=set()
while 1:
dtick=tick
tick=(tick[0], time.time(), int((time.time() - tick[0])*TICK_RATE))
dtick=tick[2] - dtick[2]
if dtick>2:
print(dtick)
for _ in range(dtick):
for event in pygame.event.get():
#print(event.type)
if event.type == pygame.QUIT: sys.exit()
if event.type == pygame.KEYDOWN:
keys.update({event.key})
print(event.key)
if event.key == 102:
follow = (follow + 1)%len(elements)
if event.type == pygame.KEYUP:
if event.key in keys:
keys.remove(event.key)
screen.fill(black)
for key in keys:
if key in [275,276,273,274]:
exec("camera" + ("[0]+","[0]-","[1]-","[1]+")[[275,276,273,274].index(key)] + "=30")
for element in elements:
element.apply_gravity(elements)
element.tick(camera=camera)
2020-02-01 12:29:45 +01:00
ori = elements[-1].pos
ori_spe = elements[-1].speed
2020-01-28 11:00:33 +01:00
for element in elements:
2020-02-01 12:29:45 +01:00
element.pos = element.pos - ori
element.speed = element.speed - ori_spe
2020-01-27 16:21:31 +01:00
origin=elements[follow].pos
for element in elements:
element.apply(camera=camera, origin=origin)
screen.blit(element.image, element.position)
pygame.display.flip()
time.sleep(0.001)
2020-01-28 11:00:33 +01:00
if tick[2]%60 == 0 : print(elements[follow].pos)