#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue Jan 28 10:54:33 2020 @author: suwako """ import mecha import pygame import sys import numpy as np class Obj(): def __init__(self, **keyargs): self.mecha = mecha.Player(**keyargs) self.image = pygame.image.load("assets/planet.gif") self.position = self.image.get_rect() self.dimension = np.array((self.position.width, self.position.height)) def dimension(self): return np.array((self.position.width, self.position.height), dtype='float64') def draw(self, screen, scale=1, reference=np.array((0, 0), dtype='float64'), size=(0, 0)): npsize=np.array(size, dtype='float64') scaled_pos = scale * (self.mecha.pos - reference + npsize/(2*scale)) if np.linalg.norm(scaled_pos - npsize/2) > max(size): return if min(self.position.size)*scale < 1 : return scaled_dimension = (scale*self.dimension()).astype(int) scaled_image = pygame.transform.scale(self.image, scaled_dimension) scaled_image = pygame.transform.rotate(scaled_image, self.mecha.orientation%360) scaled_position = scaled_image.get_rect() scaled_position.center = tuple(map(int, scaled_pos)) screen.blit(scaled_image, scaled_position) class Star(Obj): def __init__(self, **keyargs): self.mecha = mecha.Mass(**keyargs) self.image = pygame.image.load("assets/ship/loop/00001.png") self.position = self.image.get_rect() class Planet(Obj): def __init__(self, **keyargs): self.mecha = mecha.Player(**keyargs) self.image = pygame.image.load("assets/planet/loop/00001.png") self.position = self.image.get_rect() class Player(Obj): def __init__(self, **keyargs): self.mecha = mecha.Player(**keyargs) self.image = pygame.image.load("assets/ship/loop/00001.png").convert_alpha() self.position = self.image.get_rect() class Projectile(Obj): def __init__(self, **keyargs): self.mecha = mecha.Projectile(**keyargs) self.image = pygame.image.load("assets/projectile/loop/00001.png") self.position = self.image.get_rect() if __name__ == "__main__": import time pygame.init() black = (0, 0, 0) size = width, height = 1366, 720 TICK_RATE = 60 keys = set() tick = (time.time(), time.time(), 0) screen = pygame.display.set_mode(size, flags=pygame.RESIZABLE) elements = [Player(speed=(5, 0), pos=(10, -200)), Player(speed=(-5, 0), pos=(10, 200), mass = 1), Planet(mass=7000), Planet(mass=200, pos=(0,20), speed=(-1,0)), Planet(mass=150, pos = (0, 1000), speed = (15, 0)), Player(mass=5, pos = (0, 1010), speed = (15, 1))] reference = 2 joy=[1, 1] 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 i in range(dtick): size = pygame.display.get_surface().get_size() for event in pygame.event.get(): #print(event.type) if event.type == pygame.VIDEORESIZE: size = width, height = event.size screen =screen = pygame.display.set_mode(size, flags=pygame.RESIZABLE) if event.type == pygame.QUIT: sys.exit() if event.type == pygame.KEYDOWN: keys.update({event.key}) print(event.key) if event.key == 102: reference = (reference + 1)%len(elements) if event.key == (32): elements[1].mecha.action(thrust=True) if event.key == 119: elements[1].mecha.action(fire = True) if event.type == pygame.KEYUP: if event.key in keys: keys.remove(event.key) if event.key == (32): elements[1].mecha.action(thrust=False) if event.key == 119: elements[1].mecha.action(fire = False) screen.fill(black) for key in keys: if key in [275,276,273,274]: exec("joy" + ("[0]+","[0]-","[1]+","[1]-")[[275,276,273,274].index(key)] + "=1") elements[1].mecha.orientation=joy[0]*(-3) for element in elements: element.mecha.apply_forces([element.mecha for element in elements]) j = 0 while j < len(elements): if type(elements[j]) is mecha.visual.Projectile and elements[j].mecha.ticks > 25*30: del elements[j] j-=1 j+=1 j = 0 while j < len(elements): elements[j].mecha.fire(elements) j+=1 for element in elements: element.mecha.tick() ori,speed=origin=np.array(elements[0].mecha.pos), np.array(elements[0].mecha.speed) for element in elements: element.mecha.ref(origin=ori, speed=speed) if i < 2: while 10**(joy[1]*0.05) > max(size)/60: joy[1] -= 1 while 10**(joy[1]*0.05) < 0.08 : joy[1] += 1 for element in elements: element.draw(screen, scale=10**(joy[1]*0.05), reference=elements[reference].mecha.pos, size=screen.get_size()) pygame.display.flip() # for element in elements: # element.apply(camera=camera, origin=origin) # screen.blit(element.image, element.position) time.sleep(0.001) #if tick[2]%60 == 0 : print(elements[2].mecha.pos, elements[2].mecha.speed)