old_gravity/visual.py

148 lines
5.9 KiB
Python
Executable File

#!/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)