Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Probestudium / 2011 / WS I: 3D-Programmierung / Arbeitsgruppen / 3D-Shooter / PvPshooter1.py


Inhaltsbereich

PvPshooter1.py

PvPshooter1.py — text/python-source, 7 KB (7952 bytes)

Dateiinhalt

#-*- coding: utf-8 -*-
# Teststadt für Rundgang
# 2010-03-08

from visual import *
from visual.text import *
from random import *
import socket

PORT=8007
service = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#service.bind(("", PORT))
HOST="localhost"
scene.title = "Shooter" # Fenstertitel
scene.x = 0	                    # Fensterpos v. links
scene.y = 0	                    # Fensterpos v. oben
scene.height =1000                  # Fensterhöhe
scene.width = 1500                  # Fensterbreite
scene.range = (1,1,1)               # Abstand
scene.center = (0,5,50)             # Festlegung Blickziel
scene.userspin = False              # Blickwechsel abgeschaltet
scene.userzoom = False              # Benutzerzoom abgeschaltet
scene.fov = 1.5                     # Kamerawinkel
scene.background = (0.8,0.85,1)     # Farbe Hintergrund
scene.stereodepth = 2               # Stereotiefe
scene.show_rendertime = True        # Anzeige der Berechnungszeiten
scene.fullscreen = False            # Vollbildmodus
haus_anzahl = 12                    # Konstante: Anzahl der Häuser
haeuser=[]                          #Feld
for i in range(haus_anzahl):        #Feldfüllung für hauskoordinaten
    haeuser.append(i)               #Feld um i Feldpots erweitern

                # graue Bodenplatte
floor = box(pos=(0,0,0), width=200, height=1, length=200, color=color.gray(0.4),material=materials.rough)
Kaefig = box (pos=(0,15,0),width=200,height=30,length=200,material=materials.wood)#Kaefig um Spieler herum
Gebilde=frame()#Zielfläche für Schüsse
Figur1=pyramid(pos=(0,5,53.8),axis=(0,0,-1),size=(4, 5, 5),color=color.red, material=materials.emissive)                       #Spielfigur =)
Figur2=pyramid(pos=(0,5,53.8))
Figuren=[Figur1,Figur2] 
text(pos=(0, 20, -104), string="SPIELERPUNKTZAHL", color=color.blue, depth=1, height=5, justify="center")                       #Schriftzug
text(pos=(0, 12.5, -104), string="SPIELER 1:               SPIELER 2:", color=color.blue, depth=1, height=5, justify="center")  #Schriftzug
ScoreSpieler1=0
Score1='%s' %(ScoreSpieler1)
Score2='NICHT DEFINIERT'
punkteanzeige=text(pos=(0, 5, -104), string=Score1+"                                   ", color=color.red, depth=1, height=5, justify="center") #Punkte Sp1+2


    
for i in range(haus_anzahl):    # Häuser durch Zufall generieren
    zufallsvariable = random()
    haeuser[i]=cylinder \
    (pos=(random()*200-100, 0,random()*200-100),\
    axis=(0,30,0),radius=(8) ,\
    color=color.gray(float(i/2)/10),material=materials.wood,\
    frame=Gebilde)
    

rhairs = 0.025 # half-length of crosshairs
dhairs = 2 # how far away the crosshairs are
maxcosine = dhairs/sqrt(rhairs**2+dhairs**2) # if ray inside crosshairs, don't move
haircolor = color.black
roam=False

#-Zweitfenster für topview---
#zweitfenster = display(width=300,height=320, title="Minimap",\
 #                      center=(0,5,0), forward=(0,-5,0), x=700, y=0,\
  #                     background=(0.8,0.85,1))
#zweitfenster.range = 75
#zweitfenster.select()
#for obj in scene.objects:
#    try:
#        obj.__copy__(display=zweitfenster).opacity=0.5
#    except:
 #       pass
#walker = sphere(radius=2, color=color.white, pos=scene.center, material=materials.emissive)
  # walker.trail = curve(opacity=1)#farbe 

Treffer=0


anzeige = label(pos=(30,0,30), text="Abgefeuerte Schuesse", \
    box=False, line=False, yoffset=150, height=10)


while True:
    rate(50) 
    
    Figur1.axis=scene.forward#Figurfolgt dem Spieler die ganze Zeit
    Figur1.pos = scene.center-scene.forward*2*mag(scene.center-scene.mouse.camera)
    
    

    # Toggle roam option
    #if scene.mouse.events:
    #    m = scene.mouse.getevent()
    
    roam = True

    # If in roaming mode, change center and forward according to mouse position
    if roam:
        ray = scene.mouse.ray
        if abs(dot(ray,scene.forward)) < maxcosine: # do something only if outside crosshairs
            newray = norm(vector(ray.x, 0, ray.z))
            angle = arcsin(dot(cross(scene.forward,newray),scene.up))
            newforward = rotate(scene.forward, axis=scene.up, angle=angle/25)
           # scene.center = scene.mouse.camera+newforward*mag(scene.center-scene.mouse.camera)
            scene.forward = newforward
            #scene.center = scene.center+scene.forward*ray.y/2.
            #zweitfenster.select()
            #walker.pos = scene.center
            #walker.trail.append(pos=walker.pos, retain=5000)

    # Falls Tastatur gedrückt...
    if scene.kb.keys:
        s = scene.kb.getkey()       
        
        if   s == 'w':     # vorwärtsgehen
            naheshaus=haeuser[0]
            for i in range (haus_anzahl):
                if(mag(scene.center-naheshaus.pos)>=mag(scene.center-haeuser[i].pos)):
                    naheshaus=haeuser[i]
            if (mag(scene.center-naheshaus.pos)-12)<(mag(scene.center-scene.center+scene.forward*mag(scene.center-scene.mouse.camera))): #entfernung Radius<entfernung die mit schritt zurückgelegt wird
                pass
                
            else:
                scene.center = scene.center+scene.forward*mag(scene.center-scene.mouse.camera)
        elif s == 's':   # rückwärtsgehen
            naheshaus=haeuser[0]
            for i in range (haus_anzahl):
                if(mag(scene.center-naheshaus.pos)>=mag(scene.center-haeuser[i].pos)):
                    naheshaus=haeuser[i]
            if (mag(scene.center-naheshaus.pos)<12):
                scene.center = (scene.center+scene.forward*mag(scene.center-scene.mouse.camera))
            else:
                scene.center = scene.center-scene.forward*mag(scene.center-scene.mouse.camera)
        elif s == 'a':   # links gehen
            naheshaus=haeuser[0]
            for i in range (haus_anzahl):
                if(mag(scene.center-naheshaus.pos)>=mag(scene.center-haeuser[i].pos)):
                    naheshaus=haeuser[i]
            if (mag(scene.center-naheshaus.pos)<12):
                scene.center+=cross(scene.forward,scene.up)#rightbackpush
            else:
                scene.center-=cross(scene.forward,scene.up) 
        elif s == 'd':   # rechtsgehen gehen
            naheshaus=haeuser[0]
            for i in range (haus_anzahl):
                if(mag(scene.center-naheshaus.pos)>=mag(scene.center-haeuser[i].pos)):
                    naheshaus=haeuser[i]
            if (mag(scene.center-naheshaus.pos)-12)<(mag(scene.center-(scene.center+cross(scene.forward,scene.up)))): #entfernung Radius<entfernung die mit schritt zurückgelegt wird
                pass
                
                #scene.center-=cross(scene.forward,scene.up)#leftbackpush
            else:
                scene.center+=cross(scene.forward,scene.up) 



#Schuss:!!!!!!!!!!
   
    if scene.mouse.events:
    # Maus-Event in Variable speichern
        Linksklick = scene.mouse.getevent()
       
    # zielen auf Gebilde
        try:  
            if Linksklick.pick.radius and Linksklick.press:# in haeuser[]:# and Linksklick                 
                Treffer += 1
                #Treffer landen auf Gebilde
                sphere(pos=Gebilde.world_to_frame(Linksklick.pickpos), color=color.white, \
                radius=0.2, material=materials.emissive)   
                anzeige.text="Du hast"+str(Treffer)+ "Schuesse abgefeuert!! "
                ScoreSpieler1=ScoreSpieler1+1
                punkteanzeige.visible=False
                del punkteanzeige
                Score1='%s' %(ScoreSpieler1)
                punkteanzeige=text(pos=(0, 5, -104), string=Score1+"                                   ", color=color.red, depth=1, height=5, justify="center")
        except:
            pass
            
    #service.sendto("Figur1.pos=(%s,%s,%s),Figur1.axis=(%s)"%(Figur1.x,Figur1.y,Figur1.z,scene.forward),(HOST,PORT)) #Sendedaten
    #try:
    #    data,HOST = service.recvfrom(100)
    #    exec(data)
    #except:
    #    pass

Funktionsleiste