Raumschiff
steuerbares Objekt
Raumschiff.py — text/python-source, 6 KB (6255 bytes)
Dateiinhalt
from visual import *
from Objects import *
from math import *
from random import *
from time import *
class Raumschiff(MovingObject):
def __init__ (self,pos,speed,col_radius=3,focus=False):
MovingObject.__init__(self,pos,speed,col_radius, focus)
#self.rahmen = frame(pos=self.pos)
self.rumpf_1 = pyramid(frame=self.rahmen,pos=(-0,0,-0) ,axis=(1,0,0) ,size=(4,0.25,2),color=(1,0,0))
self.rumpf_2 = pyramid(frame=self.rahmen,pos=(-2,0,-0) ,axis=(1,0,0) ,size=(4,1,6),color=(1,0,0))
self.heck_1 = pyramid(frame=self.rahmen,pos=(-3.5,0,-0) ,axis=(1,0,0) ,size=(3,1.5,4),color=(0.7,0,0))
self.heck_2 = pyramid(frame=self.rahmen,pos=(-3.49,0,-0) ,axis=(1,0,0) ,size=(1.5,3,0.5),color=(0.2,0,0))
self.duese_1 = cylinder(frame=self.rahmen,pos=(-3.6,0,1) ,axis=(0.2,0,0),radius=0.2, color=(0,0,0))
self.duese_2 = cylinder(frame=self.rahmen,pos=(-3.6,0,-1) ,axis=(0.2,0,0),radius=0.2, color=(0,0,0))
self.cockpit = pyramid(frame=self.rahmen,pos=(2,0.05,-0) ,axis=(1,0,0) ,size=(1.5,0.25,0.5),color=(0,0,0))
self.merk1 = vector((0,0,0))
self.merk2 = vector((0,0,0))
self.a=1.0
def eventInteraction(self):
if scene.kb.keys:
while scene.kb.keys:
s=scene.kb.getkey()
if s == 'up':
self.acceleration= self.a/sqrt(self.speed[0]**2+self.speed[2]**2)*(self.speed[1]*self.speed/sqrt(self.speed[0]**2+self.speed[1]**2+self.speed[2]**2)-sqrt(self.speed[0]**2+self.speed[1]**2+self.speed[2]**2)*vector((0,1,0)))
try:
if self.merk1[0]/abs(self.merk1[0])==-self.acceleration[0]/abs(self.acceleration[0]) and self.merk1[2]/abs(self.merk1[2])==-self.acceleration[2]/abs(self.acceleration[2]) and (norm(self.speed)[1]<-0.5 or norm(self.speed)[1]>0.5):
self.a=-1*self.a
self.acceleration= self.a/sqrt(self.speed[0]**2+self.speed[2]**2)*(self.speed[1]*self.speed/sqrt(self.speed[0]**2+self.speed[1]**2+self.speed[2]**2)-sqrt(self.speed[0]**2+self.speed[1]**2+self.speed[2]**2)*vector((0,1,0)))
except:
pass
self.merk1=self.acceleration
elif s == 'down':
self.acceleration=-1*self.a/sqrt(self.speed[0]**2+self.speed[2]**2)*(self.speed[1]*self.speed/sqrt(self.speed[0]**2+self.speed[1]**2+self.speed[2]**2)-sqrt(self.speed[0]**2+self.speed[1]**2+self.speed[2]**2)*vector((0,1,0)))
try:
if self.merk2[0]/abs(self.merk2[0])==-self.acceleration[0]/abs(self.acceleration[0]) and self.merk2[2]/abs(self.merk2[2])==-self.acceleration[2]/abs(self.acceleration[2]) and (norm(self.speed)[1]<-0.5 or norm(self.speed)[1]>0.5):
self.a=-1*self.a
self.acceleration=-1*self.a/sqrt(self.speed[0]**2+self.speed[2]**2)*(self.speed[1]*self.speed/sqrt(self.speed[0]**2+self.speed[1]**2+self.speed[2]**2)-sqrt(self.speed[0]**2+self.speed[1]**2+self.speed[2]**2)*vector((0,1,0)))
except:
pass
self.merk2=self.acceleration
if s == 'left':
self.acceleration= 1.0*(self.speed[2]/sqrt(self.speed[0]**2+self.speed[2]**2)*vector((1,0,0))-self.speed[0]/sqrt(self.speed[0]**2+self.speed[2]**2)*vector((0,0,1)))
elif s == 'right':
self.acceleration=-1.0*(self.speed[2]/sqrt(self.speed[0]**2+self.speed[2]**2)*vector((1,0,0))-self.speed[0]/sqrt(self.speed[0]**2+self.speed[2]**2)*vector((0,0,1)))
if s== 'w':
self.acceleration= 1.0*norm(self.speed)
elif s== 's':
self.acceleration=-1.0*norm(self.speed)
if s== 'f':
scene.forward=self.speed+vector((0,-10,0))
if s== 'q':
self.focus=False
scene.userzoom=1
scene.userspin=1
if s== 't':
self.focus=True
scene.userzoom=1
scene.userspin=1
else: self.acceleration=vector((0,0,0))
# collisions
while self.collision:
y = self.getCollision()
if y.__class__.__name__ == "Planet":
self.engine.interrupted=True
self.rahmen.visible=0
label(pos=self.rahmen.pos,text="GAME OVER!!!",height=50)
Teilchen = []
Teilchengeschwindigkeit = []
for i in range(100):
Teilchen.append(sphere(pos=(self.rahmen.pos+(2*random()-1,2*random()-1,2*random()-1)),radius=0.5,color=(1,0,0),material=materials.emissive))
for i in range(100):
Teilchengeschwindigkeit.append(vector((0.2*random()-0.1,0.2*random()-0.1,0.2*random()-0.1)))
while True:
for i in range(100):
Teilchen[i].pos += Teilchengeschwindigkeit[i]
Teilchengeschwindigkeit[i] *= 0.999
sleep(0.01)
if abs(self.position) > 1000:
self.engine.interrupted=True
self.rahmen.visible=0
label(pos=self.rahmen.pos,text="GAME OVER!!!",height=50)
Teilchen = []
Teilchengeschwindigkeit = []
for i in range(100):
Teilchen.append(sphere(pos=(self.rahmen.pos+(2*random()-1,2*random()-1,2*random()-1)),radius=0.5,color=(1,0,0),material=materials.emissive))
for i in range(100):
Teilchengeschwindigkeit.append(vector((0.2*random()-0.1,0.2*random()-0.1,0.2*random()-0.1)))
while True:
for i in range(100):
Teilchen[i].pos += Teilchengeschwindigkeit[i]
Teilchengeschwindigkeit[i] *= 0.999
sleep(0.01)
if __name__ == "__main__":
r = Raumschiff((0,0,0),(0,0,0))