Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Probestudium / 2012 / WS I: 3D-Programmierung / Arbeitsgruppen / Asteroid / Mit Levelausgabe


Inhaltsbereich

Mit Levelausgabe

raumschiff-level.py — text/python-source, 10 KB (10400 bytes)

Dateiinhalt

# astroid

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

# Szene-Einstellungen
scene.userzoom = True           # User darf zoomen?
scene.userspin = True           # 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 = "Koordinaten"     # 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
#
class Munitionskiste(frame):
    def __init__ (self, pos=(0,0,0)):
        frame.__init__(self, pos=pos)
        self.kiste=box(color=(0.2,0.2,1), opacity=(0.4), frame=self)
        self.symbol=cylinder(radius=(0.055), pos=(-0.3,-0.3,0.3), length=(1), color=(0.2,1,0.2), material=materials.emissive, frame=self)
        self.symbol.rotate(angle=(pi/3.3), axis=(0,1,1), origin=self.symbol.pos)


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
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))
label1.height=100
label3=label(height=50, visible=False, text=("Name eingeben und mit Enter bestaetigen"))
label4=label(height=50, visible=False)
restart=1
munitionszaehler=0#
label6=label(pos=(4,-4,12), height=30, text=("Munition: "+str(munitionszaehler)))#
level=1#
label7=label(pos=(-4,-4,12), height=30, text=("Level: "+str(level)))#
while scharfesS==0:
    if restart==1:
        restart=0
        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:
        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))

    
###
#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
                
#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 kollision
        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
# 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:
        key = scene.kb.getkey()
        if key=="1":
            restart=1
        else:
            scharfesS=1
        label2.visible=False


Funktionsleiste