SpaceTraveler
Kompletter Code in einer Datei
SpaceTraveler.py — text/python-source, 19 KB (19673 bytes)
Dateiinhalt
from math import *
from random import random
from visual import *
from math import *
from random import *
from time import *
from time import *
from threading import *
from visual import *
import math
class MovingObject(object):
def __init__ (self, position=vector((0,0,0)), speed=vector((0,0,0)), col_radius=1, focus = False ):
self.position = position
self.speed = speed
self.acceleration = vector((0,0,0))
self.col_radius = col_radius
self.focus = focus
self.collision = False
self.collisions = []
#self.adjustFrameToDir = True
self.rahmen = frame(pos=self.position)
#if self.adjustFrameToDir:
#self.rahmen.rotate(angle = math.atan2((-1)*speed[2], (-1)*speed[0]), axis = (0,1,0))
#i = math.sqrt(speed[0]**2 + speed[2]**2)
#self.rahmen.rotate(angle = (-1) * math.atan2(speed[1], i), axis = (1,0,0))
self.i = 0
def collisionWith(self,x):
self.collision = True
self.collisions.append(x)
def getCollision(self):
y = self.collisions.pop()
if self.collisions == []:
self.collision = False
return y
def step(self,dtime):
self.eventInteraction()
self.speed += self.acceleration
self.position += self.speed*dtime
self.rahmen.pos = self.position
self.rahmen.axis = self.speed
#print self.position, "\t", self.speed, "\t", self.i
self.i += 1
if self.focus:
scene.center = self.position
scene.range=(18,18,18)
scene.forward = self.speed+vector((0,-10,0))
def eventInteraction(self):
# abstract Method
pass
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)
from visual import *
from threading import *
from math import *
import time
from random import random
# Sonne (km,km,kg):
s_radius=16
s_masse=30
# Merkur (km,d,d):
mer_radius=20
mer_umkreiszeit=40
mer_rotzeit=10
s_abstand_merkur=200
def scale_dist(rohdaten):
"globale Hilfsfunktion: skaliert Entfernungen"
return sqrt(rohdaten)
def scale_rad(rohdaten):
"globale Hilfsfunktion: skaliert Radien"
return sqrt(rohdaten)
class Planet(MovingObject):
"Klasse erstellt Planetenobjekte"
def __init__(self, pos = (0, 0, 0), axis = 0 , radius=mer_radius, color=(1,1,1), umkreiszeit=365, zentrum=None,\
abstand_zentrum=0, material=materials.wood):
MovingObject.__init__(self,vector(0,0,0),vector(0,0,0),col_radius=radius)
self.axis = axis
self.position = vector(pos)
self.planet = sphere(pos = self.position)
self.f = frame(pos=self.position)
self.planet.material = material
self.planet.radius = radius
self.planet.color = color
self.umkreiszeit = umkreiszeit
self.zentrum=zentrum
self.abstand_zentrum = abstand_zentrum
self.x = 90.0
def step(self,dtime):
if self.zentrum:
'''
self.planet.pos = (self.zentrum.f.pos.x+self.abstand_zentrum*cos(self.x/self.umkreiszeit)+self.axis, \
self.zentrum.f.pos.y + self.abstand_zentrum*cos(self.x/self.umkreiszeit)*cos(self.axis/(2*pi)*360)+self.axis ,\
self.zentrum.f.pos.z+self.abstand_zentrum*cos(self.x/self.umkreiszeit)+self.axis)
self.position = vector(self.planet.pos)
'''
self.planet.pos = (self.f.pos.x * sin(self.x+self.axis), \
self.f.pos.y * sin (self.x + self.axis),\
self.f.pos.z * cos(self.x+self.axis))
self.position = vector(self.planet.pos)
self.x += 0.005
#(self.f.pos.y + sin(self.x)*self.abstand_zentrum)*cos(self.axis)
class Engine(Thread):
def __init__ (self,FPS):
Thread.__init__(self)
self.objectList=[]
self.FPS=FPS
self.interrupted = False
def addObject(self,obj):
self.objectList.append(obj)
obj.engine = self
def run(self):
while not self.interrupted:
for i in self.objectList:
i.step(1.0/self.FPS)
for x in self.objectList:
if (i.col_radius + x.col_radius) > abs(i.position - x.position) and i != x:
i.collisionWith(x)
sleep(1.0/self.FPS)
#scene.stereo ="redcyan"
import Image
name = "moon"
width = 1024
height = 512
im = Image.open(name+".tga")
materials.saveTGA(name,im)
mondtextur = materials.texture(data=im, mapping="spherical")
engine = Engine(25)
scene.autoscale=0
r=Raumschiff(vector((100,100,100)),vector((1.1,1.1,-3.1)),3,1 )
engine.addObject(r)
b=box(material=materials.earth)
s = sphere(pos = (0, 0, 0, ), radius = 1000, color = (0, 0, 1), material = mondtextur)
scene.lights=[distant_light(direction=(0.22, 0.44, 0.88), color=color.gray(0.4))] # nur schwaches 'Weltraumlicht'
sonne = Planet(pos=(0,0,0),radius=75, color = (1,1,0), material=materials.emissive)
sonnenlicht = local_light(pos=(0,0,0), color=color.white)
color1 = (1,0.7,0.3)
asteroid1 = Planet(pos = (-500, -400, -450), axis =2*pi*random(),radius = 25, \
color = color1, material = mondtextur, umkreiszeit=50, zentrum=sonne, abstand_zentrum=sqrt(500**2+400**2+450**2))
asteroid2 = Planet(pos = (400, -540, -650), axis =2*pi*random(),radius = 55, \
color = color1, material=mondtextur, umkreiszeit=100, zentrum=sonne, abstand_zentrum=sqrt(400**2+540**2+650**2))
asteroid4 = Planet(pos = (-730, -500, 550), axis =2*pi*random(),radius = 42, \
color = color1, material=mondtextur, umkreiszeit=150, zentrum=sonne, abstand_zentrum=sqrt(730**2+500**2+550**2))
asteroid5 = Planet(pos = (-650, 450, -550), axis = 2*pi*random(),radius = 30, \
color = color1, material=mondtextur, umkreiszeit=90, zentrum=sonne, abstand_zentrum=sqrt(650**2+450**2+550**2))
asteroid6 = Planet(pos = (600, -500, 450), axis =2*pi*random(),radius = 40, \
color = color1, material=mondtextur, umkreiszeit=70, zentrum=sonne, abstand_zentrum=sqrt(600**2+500**2+450**2))
asteroid7 = Planet(pos = (600, 770, -650), axis =2*pi*random(),radius = 35, \
color = color1, material=mondtextur, umkreiszeit=60, zentrum=sonne, abstand_zentrum=sqrt(600**2+770**2+650**2))
asteroid8 = Planet(pos = (-450, 450, 500), axis =2*pi*random(),radius = 46, \
color = color1, material=mondtextur,umkreiszeit=66, zentrum=sonne, abstand_zentrum=sqrt(450**2+450**2+500**2))
asteroid9 = Planet(pos = (450, 500, 350), axis =2*pi*random(),radius = 15, \
color = color1, material=mondtextur, umkreiszeit=80, zentrum=sonne, abstand_zentrum=sqrt(450**2+500**2+350**2))
asteroid10 = Planet(pos = (-650,-680, -654), axis =2*pi*random(),radius = 10,\
color = color1, material=mondtextur,umkreiszeit=100, zentrum=sonne, abstand_zentrum=sqrt(650**2+680**2+654**2))
asteroid11 = Planet(pos = (-290, -200, 200), axis =2*pi*random(),radius = 16, \
color = color1, material=mondtextur, umkreiszeit=110, zentrum=sonne, abstand_zentrum=sqrt(290**2+200**2+200**2))
asteroid12 = Planet(pos = (-420, 300, -500), axis =2*pi*random(),radius = 17, \
color = color1, material=mondtextur, umkreiszeit=120, zentrum=sonne, abstand_zentrum=sqrt(420**2+300**2+500**2))
asteroid13 = Planet(pos = (400, -500, -540),axis =2*pi*random(),radius = 20, \
color = color1, material=mondtextur, umkreiszeit=50, zentrum=sonne, abstand_zentrum=sqrt(400**2+500**2+540**2))
asteroid14 = Planet(pos = (-450, 590, 600), axis =2*pi*random(),radius = 25, \
color = color1, material=mondtextur, umkreiszeit=40, zentrum=sonne, abstand_zentrum=sqrt(450**2+590**2+600**2))
asteroid15 = Planet(pos = (650,660, -500), axis =2*pi*random(),radius = 26, \
color = color1, material=mondtextur, umkreiszeit=30, zentrum=sonne, abstand_zentrum=sqrt(650**2+660**2+500**2))
asteroid16 = Planet(pos = (400, -650, 680), axis =2*pi*random(),radius = 10, \
color = color1, material=mondtextur, umkreiszeit=70, zentrum=sonne, abstand_zentrum=sqrt(400**2+650**2+680**2))
asteroid17 = Planet(pos = (500, 453, 660), axis =2*pi*random(),radius = 45, \
color = color1, material=mondtextur, umkreiszeit=90, zentrum=sonne, abstand_zentrum=sqrt(500**2+453**2+660**2))
asteroid18 = Planet(pos = (-650, -600, 540), axis =2*pi*random(),radius = 24, \
color = color1, material=mondtextur,umkreiszeit=80, zentrum=sonne, abstand_zentrum=sqrt(650**2+600**2+540**2))
asteroid19 = Planet(pos = (580, -400, -650),axis =2*pi*random(),radius = 40, \
color = color1, material=mondtextur,umkreiszeit=70, zentrum=sonne, abstand_zentrum=sqrt(580**2+400**2+650**2))
asteroid20 = Planet(pos = (-450, 500, -350), axis =2*pi*random(),radius = 30, \
color = color1, material=mondtextur,umkreiszeit=60, zentrum=sonne, abstand_zentrum=sqrt(450**2+500**2+350**2))
asteroid21 = Planet(pos = (-250, -450, 250), axis =2*pi*random(),radius = 34, \
color = color1, material=mondtextur,umkreiszeit=60, zentrum=sonne, abstand_zentrum=sqrt(250**2+450**2+250**2))
asteroid22 = Planet(pos = (450, -350, 350),axis =2*pi*random(),radius = 29, \
color = color1, material=mondtextur,umkreiszeit=60, zentrum=sonne, abstand_zentrum=sqrt(450**2+350**2+350**2))
asteroid23 = Planet(pos = (-120, 160,250), axis =2*pi*random(),radius = 50, \
color = color1, material=mondtextur,umkreiszeit=60, zentrum=sonne, abstand_zentrum=sqrt(120**2+160**2+250**2))
asteroid24 = Planet(pos = (500, 400, -450), axis =2*pi*random(),radius = 45, \
color = color1, material=mondtextur,umkreiszeit=80, zentrum=sonne, abstand_zentrum=sqrt(500**2+400**2+450**2))
asteroid25= Planet(pos = (180, 190, 210), axis =2*pi*random(),radius = 40, \
color = color1, material=mondtextur,umkreiszeit=120, zentrum=sonne, abstand_zentrum=sqrt(180**2+190**2+210**2))
asteroid26 = Planet(pos = (-230, -170, -250), axis =2*pi*random(),radius = 66, \
color = color1, material=mondtextur,umkreiszeit=40, zentrum=sonne, abstand_zentrum=sqrt(230**2+170**2+250**2))
asteroid27 = Planet(pos = (-500, 460, -450), axis =2*pi*random(),radius = 34, \
color = color1, material=mondtextur,umkreiszeit=180, zentrum=sonne, abstand_zentrum=sqrt(500**2+460**2+450**2))
asteroid28 = Planet(pos = (-380, -360, 280), axis =2*pi*random(),radius = 46, \
color = color1, material=mondtextur,umkreiszeit=190, zentrum=sonne, abstand_zentrum=sqrt(380**2+360**2+280**2))
asteroid29 = Planet(pos = (380, -510, -450), axis =2*pi*random(),radius = 22, \
color = color1, material=mondtextur,umkreiszeit=170, zentrum=sonne, abstand_zentrum=sqrt(380**2+510**2+450**2))
asteroid30 = Planet(pos = (690, -560, 490), axis =2*pi*random(),radius = 22, \
color = color1, material=mondtextur,umkreiszeit=160, zentrum=sonne, abstand_zentrum=sqrt(690**2+560**2+490**2))
asteroid31 = Planet(pos = (-550, 450, 450), axis =2*pi*random(),radius = 26, \
color = color1, material=mondtextur,umkreiszeit=140, zentrum=sonne, abstand_zentrum=sqrt(550**2+450**2+450**2))
asteroid32 = Planet(pos = (400, 200, -300), axis =2*pi*random(),radius = 20, \
color = color1, material=mondtextur,umkreiszeit=200, zentrum=sonne, abstand_zentrum=sqrt(400**2+200**2+300**2))
asteroid33 = Planet(pos = (350, 400, 350), axis =2*pi*random(),radius = 15, \
color = color1, material=mondtextur,umkreiszeit=150, zentrum=sonne, abstand_zentrum=sqrt(350**2+400**2+350**2))
engine.addObject(sonne)
engine.addObject(asteroid1)
engine.addObject(asteroid2)
engine.addObject(asteroid4)
engine.addObject(asteroid5)
engine.addObject(asteroid6)
engine.addObject(asteroid7)
engine.addObject(asteroid8)
engine.addObject(asteroid9)
engine.addObject(asteroid10)
engine.addObject(asteroid11)
engine.addObject(asteroid12)
engine.addObject(asteroid13)
engine.addObject(asteroid14)
engine.addObject(asteroid15)
engine.addObject(asteroid16)
engine.addObject(asteroid17)
engine.addObject(asteroid18)
engine.addObject(asteroid19)
engine.addObject(asteroid20)
engine.addObject(asteroid21)
engine.addObject(asteroid22)
engine.addObject(asteroid23)
engine.addObject(asteroid24)
engine.addObject(asteroid25)
engine.addObject(asteroid26)
engine.addObject(asteroid27)
engine.addObject(asteroid28)
engine.addObject(asteroid29)
engine.addObject(asteroid30)
engine.addObject(asteroid31)
engine.addObject(asteroid32)
engine.addObject(asteroid33)
engine.start()
scene.ambient = 0.5
scene.userzoom = 0
scene.userspin = 0
a = sphere(pos=(100,200,100),radius= 15, color = (0,0,1))
counter = 0
lab = label(heigth = 50, pos=(0,0,0),text="Punkte")
while 1:
if 18 > abs(r.position - a.pos):
a.pos =(random()*500, random()*500, random()*500)
counter += 1
lab.text = "Punkte: " + str(counter)
sleep(0.5)
scene.fullscreen=1