Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Probestudium / 2012 / WS I: 3D-Programmierung / Arbeitsgruppen / Asteroid / AsteroidgameV.1


Inhaltsbereich

AsteroidgameV.1

asteroid-game.py — text/python-source, 12 KB (12743 bytes)

Dateiinhalt

# asteroid

# Einbinden des 3D-Moduls
from visual import *
from math import *
from random import *
import time

# Szene-Einstellungen
scene.userzoom = False           # User darf zoomen?
scene.userspin = False           # User darf rotieren?
scene.forward = (0,0,-1)      # Kameraposition
scene.autoscale = False         # Autoskalierung aktiv?
scene.range = 12                # Kameraabstand von scene.center
scene.center = (0,0,0)          # Kamerablickpunkt: norm. (0,0,0)
scene.up = (0,1,0)              # Rotationsachse Kamera: norm. (0,1,0)
scene.background = color.black  # Hintergrundfarbe
scene.fov = 1                   # Kamerawinkeloeffnung: norm. 1
scene.fullscreen = true        # Vollbild? norm. False
scene.title = "Asteroid_Game"     # Fenstertitel
scene.width = 200               # Fensterbreite: norm. 200
scene.height = 200              # Fensterhoehe: norm 200
scene.x = 50                    # x-Koordinate d. Fensters: norm. 0
scene.y = 25                    # y-Koordinate d. Fensters: norm. 0

#frame()=gruppe
#class Name:    def __init__(varaiblen):
#loeschen von objekten mit:  1. objekt.visible= False
#                           2. del Objektname
#

feuerkugel=sphere(pos=(-10,-10,-100), radius=(30), color=(0.75,0.21,0), material=materials.emissive)
feuerringe=frame()
feuerring=ring(pos=(-10,-10,-100), radius=(35), color=(1,0,0), thickness=(2), material=materials.BlueMarble, frame=feuerringe)
feuerring2=ring(pos=(-10,-10,-100), radius=(37), color=(1,0,0), thickness=(2), material=materials.BlueMarble, frame=feuerringe)
planet=sphere(pos=(15,15,-80), radius=(12), color=(0,1,0), material=materials.earth)
        
raumschiff=frame()
nase=cone(pos=(0,0,0), axis=(0.5,0,0), radius=(0.1), material=materials.blazed, frame=raumschiff)
rumpf=box(pos=(-0.35,-0.01,0), size=(0.8,0.2,0.4), material=materials.plastic, color=(0.4,0.4,0.4), frame=raumschiff)
cockpit=ellipsoid(pos=(-0.15,0.07,0), size=(0.4,0.2,0.2), color=(0.5,0.8,0), material=materials.chrome, frame=raumschiff)
fluegel1=pyramid(pos=(-0.75,-0.01,0), size=(0.8,1.8,0.005), material=materials.plastic, color=(0.4,0.4,0.4), frame=raumschiff)
fluegel1.rotate(angle=0.65*pi,axis=(1,0,0), origin=(fluegel1.pos))
fluegel2=pyramid(pos=(-0.75,-0.01,0), size=(0.8,1.8,0.005), material=materials.plastic, color=(0.4,0.4,0.4), frame=raumschiff)
fluegel2.rotate(angle=1.35*pi,axis=(1,0,0), origin=(fluegel2.pos))
turbine1=frame(frame=raumschiff)
turbinenfront1=cone(pos=(-0.4,-0.015,0.2), length=(0.15), radius=(0.07), material=materials.blazed, frame=turbine1)
turbinenrohr1=cylinder(pos=(-0.75,-0.015,0.2), length=(0.35), radius=(0.07), material=materials.blazed, frame=turbine1)
turbinenrohrende1=cylinder(pos=(-0.751,-0.015,0.2), length=(0.001),radius=(0.06),material=materials.plastic, color=(0.4,0.4,0.4), frame=turbine1)
turbinenstrahl1=cone(pos=(-0.78,-0.015,0.2), length=(0.1), radius=(0.08), opacity=(0.6), color=(0.3,0.3,1), material=materials.emissive, frame=turbine1)
turbine2=frame(frame=raumschiff)
turbinenfront2=cone(pos=(-0.4,-0.015,-0.2), length=(0.15), radius=(0.07), material=materials.blazed, frame=turbine2)
turbinenrohr2=cylinder(pos=(-0.75,-0.015,-0.2), length=(0.35), radius=(0.07), material=materials.blazed, frame=turbine2)
turbinenrohrende2=cylinder(pos=(-0.751,-0.015,-0.2), length=(0.001),radius=(0.06),material=materials.plastic, color=(0.4,0.4,0.4), frame=turbine2)
turbinenstrahl2=cone(pos=(-0.78,-0.015,-0.2), length=(0.1), radius=(0.08), opacity=(0.6), color=(0.3,0.3,1), material=materials.emissive, frame=turbine2)
#raumschiff richtig drehen
raumschiff.rotate(angle=pi/2, axis=(0,1,0), origin=(rumpf.pos))
raumschiff.pos=(0,0,12)

class Asteroid (frame):
    def __init__ (self,n=0,g=1,x=0,y=0,z=-50):
        frame.__init__(self,pos=(x,y,z))
        self.objekt1=sphere(frame=self,color=(0.5,0.5,0.5),radius=(g/1.4))
        self.objekt2=box(frame=self,color=(0.5,0.5,0.5),length=g, height=g, width=g)
        self.objekt3=box(frame=self,color=(0.5,0.5,0.5),length=g, height=g, width=g)
        self.objekt3.rotate(angle=pi/4, axis=(1,0,0), origin=(0,0,0))
        self.objekt3.rotate(angle=pi/4, axis=(0,1,0), origin=(0,0,0))
        self.entfernung=g+0.2

class Gegner(frame):
    def __init__ (self,x=0,y=0,z=-50):
        frame.__init__(self,pos=(x,y,z))
        self.maxi=ellipsoid(frame=self,length=4*0.7, height=1*0.7, width=4*0.7,material=materials.chrome)
        self.boe=ellipsoid(frame=self,length=2.5*0.8*0.8, height=2*0.8*0.8, width=2.5*0.8*0.8,color=(0.2,0.4,1))
'''
test1=Asteroid(z=12,x=3,g=2.5)
test2=Gegner(z=12,x=-3)
'''
scharfesS=0
zeit=0
liste =[]
listenlaenge=0
f=frame()
i=0
d=0
p=0
b=0.1
zaehler=0
punkte=0
jakob=0
adolf=0
liste2=[]
listenlaenge2=0
laserliste=[]
laserlistenlaenge=0
label2=label(pos=(0,0,0),height=50,text=" verloren \n nochmal spielen: 1 \n beenden: Esc")
label2.visible=False
label1 = label (pos = (4,4,12),box=False)
label1.height=100
label3=label(height=50, visible=False, text=("Name mit maximal 5 Zeichen eingeben \n         und mit Enter bestaetigen"))
label4=label(height=50, visible=False)
restart=1
highscore=0
label5=label(pos=(-4,3.5,12),height=40)
name=[]
level=1
label7=label(pos=(-4,-4,12), height=30, text=("Level: "+str(level)))
while scharfesS==0:
    if restart==1:
        restart=0
        b=0.1
        if highscore<punkte:
            highscore=punkte
        label5.text=(str (highscore)+"\n"+str(name) )
        p=0
        name=[]
        namein=0
        label3.visible=True
        while namein==0:
            if scene.kb.keys:
                key = scene.kb.getkey()
                if key=="\n":
                    namein=1
                else:
                    name.append(key)
        label3.visible=False
        label4.visible=True
        label4.text=(str(name))
        time.sleep(2)
        label4.visible=False
        while 0<listenlaenge:
            liste[listenlaenge-1].visible=False
            del liste[listenlaenge-1]
            listenlaenge=listenlaenge-1
        while 0<listenlaenge2:
            liste2[listenlaenge2-1].visible=False
            del liste2[listenlaenge2-1]
            listenlaenge2=listenlaenge2-1
        punkte=0
        zeit=0
    while p==0:
#laser abschiesen
        if scene.mouse.clicked:
            m = scene.mouse.getclick()
            a=cylinder(radius=(0.055), length=(0.35), color=(0.2,1,0.2), material=materials.emissive, opacity=0.7,x=raumschiff.x,y=raumschiff.y,z=12)
            laserliste.append(a)
            laserliste[laserlistenlaenge].rotate(angle=pi/2, axis=(0,1,0), origin=laserliste[laserlistenlaenge].pos)
            laserlistenlaenge=laserlistenlaenge+1
            if laserlistenlaenge>10:
                laserliste[10].visible=False
                del laserliste[10]
                laserlistenlaenge=laserlistenlaenge-1
        zaehler=zaehler+0.001
        punkte=punkte+1
        label1.text= (str(punkte))
#hintergrund
        planet.rotate(angle=pi/450, axis=(0.3,1,0), origin=planet.pos)
        feuerringe.rotate(angle=pi/800, axis=(1,0,0), origin=feuerring.pos)
        feuerringe.rotate(angle=pi/750, axis=(0,1,0), origin=feuerring.pos)
        feuerringe.rotate(angle=pi/4000, axis=(0,0,1), origin=feuerring.pos)
###
        time.sleep(0.001)
        zeit=zeit+0.01
#Bewegung
    
        mauspos = scene.mouse.project(normal=(0,0,1), point=(0,0,13))
        raumschiffx=(mauspos.x-raumschiff.x)*0.02
        raumschiffy=(mauspos.y-raumschiff.y)*0.02
        raumschiff.pos=(raumschiff.x+raumschiffx,raumschiff.y+raumschiffy,12)
    
###

#Asteroid erzeugen
    
        if zeit > b:
            jakob=random()
            if jakob>=adolf:
                a=Asteroid(x=(random()-0.5)*16,y=(random()-0.5)*14,z=-50,g=2.0)
                liste.append(a)
                listenlaenge=(listenlaenge+1)
            else:
                a=Gegner(x=(random()-0.5)*16,y=(random()-0.5)*14)
                liste2.append(a)
                listenlaenge2=(listenlaenge2+1)
            zeit=0
        
###
#die komplette liste nach vorne verschieben
    
        i=0
        while i < listenlaenge:
            i=i+1
            liste[i-1].pos=(liste[i-1].x,liste[i-1].y,(liste[i-1].z+0.25))

        i=0
        while i < listenlaenge2:
            i=i+1
            liste2[i-1].pos=(liste2[i-1].x,liste2[i-1].y,(liste2[i-1].z+0.25))

        i=0
        while i < laserlistenlaenge:
            i=i+1
            laserliste[i-1].pos=(laserliste[i-1].x,laserliste[i-1].y,(laserliste[i-1].z-0.25))
        

    
###
#Asteroiden, die nicht mehr gesehen werden, loeschen
        if listenlaenge==1:
            if liste[0].z>40:
                liste[0].visible=False
                del liste[0]
                listenlaenge=listenlaenge-1
        else:
            if listenlaenge>1:
                if liste[0].z>40:
                    d=0
                    while d<(listenlaenge-1):
                        liste [d].pos=(liste[d+1].x,liste[d+1].y,liste[d+1].z)
                        d=d+1
                    liste[listenlaenge-1].visible=False
                    del liste[listenlaenge-1]
                    listenlaenge=listenlaenge-1
#Gegner loeschen
        if listenlaenge2==1:
            if liste2[0].z>40:
                liste2[0].visible=False
                del liste2[0]
                listenlaenge2=listenlaenge2-1
        else:
            if listenlaenge2>1:
                if liste2[0].z>40:
                    d=0
                    while d<(listenlaenge2-1):
                        liste2 [d].pos=(liste2[d+1].x,liste2[d+1].y,liste2[d+1].z)
                        d=d+1
                    liste2[listenlaenge2-1].visible=False
                    del liste2[listenlaenge2-1]
                    listenlaenge2=listenlaenge2-1

#Laserstrahlern loeschen
        if laserlistenlaenge==1:
            if laserliste[0].z<-40:
                laserliste[0].visible=False
                del laserliste[0]
                laserlistenlaenge=laserlistenlaenge-1
        else:
            if laserlistenlaenge>1:
                if laserliste[0].z<-40:
                    d=0
                    while d<(laserlistenlaenge-1):
                        laserliste [d].pos=(laserliste[d+1].x,laserliste[d+1].y,laserliste[d+1].z)
                        d=d+1
                    laserliste[laserlistenlaenge-1].visible=False
                    del laserliste[laserlistenlaenge-1]
                    laserlistenlaenge=laserlistenlaenge-1
                
#Kollision berechnen
        d=0
        if listenlaenge>0:
            while liste[d].z>11:
                if liste[d].z<13:
                    if mag(liste[d].pos-raumschiff.pos)<1.9:
                        p=1
                        print punkte
                        print "verloren"
                        break
                d=d+1
                if d==listenlaenge:
                    break
#Gegner
        d=0
        if listenlaenge2>0:
            while liste2[d].z>11:
                if liste2[d].z<13:
                    if mag(liste2[d].pos-raumschiff.pos)<1:
                        p=1
                        print punkte
                        print "verloren"
                        break
                d=d+1
                if d==listenlaenge2:
                    break
# Laserkollision
        '''
        d=0
        sepp=0
        if laserlistenlaenge>0:
            while d<laserlistenlaenge:
                sepp=0
                while sepp < listenlaenge:
                    if laserliste[d].z==liste[sepp].z:
                        if mag(laserliste[d].pos-liste[sepp].pos)<3:
                            o=sphere(pos=liste[sepp].pos ,color=color.red)
                            
                            liste[sepp].visible=False
                            andi=sepp
                            while andi<listenlaenge-1:
                                liste[andi].pos=(liste[andi+1].x,liste[andi+1].y,liste[andi+1].z)
                                andi=andi+1
                            liste[listenlaenge-1].visible=False
                            del liste[listenlaenge-1]
                            listenlaenge=listenlaenge-1
                            o.visible=False
                            del o
                            while 
                    sepp=sepp+1
                d=d+1
'''
# punkte und leveln
        if zaehler>3:
            b=b*0.8
            print "Level up"
            level=level+1
            label7.text=("Level: "+str(level))
            zaehler=0
###
    label2.visible=True
    if scene.kb.keys: # event waiting to be processed?
        key = scene.kb.getkey() # get keyboard info
        if key=="1":
            restart=1
        else:
            scharfesS=1
        label2.visible=False

Funktionsleiste