#!/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.]) follow=1 screen = pygame.display.set_mode(size) class satellite(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) 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)) 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)] """for element in elements: element.pos=np.array([random.randint(0,width), random.randint(0,height)], dtype='float64') 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 elements[2].mass=30 elements[2].speed[1]=100 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) ori = elements[-1].pos ori_spe = elements[-1].speed for element in elements: element.pos = element.pos - ori element.speed = element.speed - ori_spe 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) if tick[2]%60 == 0 : print(elements[follow].pos)