Multiplayer_1_Schuss
Umgebung_multi.py — text/python-source, 11 KB (11269 bytes)
Dateiinhalt
# -*- coding: utf-8 -*- # Ein Koordinatensystem mit visual # Einbinden des 3D-Moduls import socket from visual import * from threading import Thread from random import random from time import sleep # Szene-Einstellungen scene.userzoom = False # User darf zoomen? scene.userspin = False # User darf rotieren? #scene.forward = (-1,-1,-1) # Kameraposition scene.autoscale = False # Autoskalierung aktiv? scene.range = (1,1,1) # Kameraabstand von scene.center scene.center = (0,5,50) # Kamerablickpunkt: norm. (0,0,0) scene.up = (0,1,0) # Rotationsachse Kamera: norm. (0,1,0) scene.background = color.black # Hintergrundfarbe scene.fov = 2 # Kamerawinkeloeffnung: norm. 1 scene.fullscreen = False # Vollbild? norm. False scene.title = "Koordinaten" # Fenstertitel scene.width = 640 # Fensterbreite: norm. 200 scene.height = 1000 # Fensterhoehe: norm 200 scene.x = 0 # x-Koordinate d. Fensters: norm. 0 scene.y = 0 # y-Koordinate d. Fensters: norm. 0 FremdPORT=8000 # Port des Fremdservers HOST="141.84.220.104" # Adresse des Gegenueber EigenPORT=8001 # Port des eigenen Servers lastaction = "up" # -------------- Thread Umgebung ------------ class Umgebung(Thread): def __init__(self): Thread.__init__(self) def run(self): global zufall for i in range (haus_anzahl): zufall.append(random()) zufall.append(random()) saeule.append(box(pos=(zufall[i-1]*100-50, 6,zufall[i]*100-50),\ width=5+zufall[i-1]*5, height=12, length=7+zufall[i]*3, \ material=materials.bricks)) saeulentreffer.append(0) # -------------- Thread Spieler ------------ class Spieler(Thread): """Schnelle Verbindung zu Server""" def __init__(self, host=HOST, fport=FremdPORT, eport=EigenPORT): Thread.__init__(self) if self.__class__.__name__ == "Spieler": self.eport = eport # UDP-Socket fuer Eigenserver self.e = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.e.bind(("",eport)) self.host = host self.fport = fport self.f = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) def run(self): # interne Startmethode des Threads if self.__class__.__name__ == "Spieler": while True: # Endlosschleife der Serverausgabe (50 Zeichen) try: # Versuch, die Nachricht vom Gegenueber umzusetzen info = self.e.recvfrom(100)[0] print info exec(info) except: print "Fehler beim Ausfuehren von Serveranweisung" def action(self,num): # startet den Client, indem self.start() global lastaction global saeule u = Umgebung() u.start() if num == 0: objekte[num].visible=False # eigene Sphere fuer sich selber unsichtbar objekte[num+1].visible=True # gegnerische Sphere sichtbar else: objekte[num].visible=False # eigene Sphere fuer sich selber unsichtbar objekte[num-1].visible=True # gegnerische Sphere sichtbar while True: rate(50) if scene.kb.keys: # event waiting to be processed? s = scene.kb.getkey() # get keyboard info print s if s == 'up': # vorwaerts scene.center = scene.center+scene.forward*mag(scene.center-scene.mouse.camera) objekte[num].pos=scene.center lastaction = "up" elif s == 'down': # rueckwaerts scene.center = scene.center-scene.forward*mag(scene.center-scene.mouse.camera) objekte[num].pos=scene.center lastaction = "down" elif s == 'left': # links drehen newforward = rotate(scene.forward, axis=scene.up, angle=radians(5)) scene.center = scene.mouse.camera+newforward*mag(scene.center-scene.mouse.camera) scene.forward = newforward objekte[num].pos=scene.center elif s == 'right': # rechts drehen newforward = rotate(scene.forward, axis=scene.up, angle=radians(-5)) scene.center = scene.mouse.camera+newforward*mag(scene.center-scene.mouse.camera) scene.forward = newforward objekte[num].pos=scene.center elif s == 'k': # schiessen geschosse.append(Kugel()) # neuen Thread Kugel in geschosse setzen geschosse[-1].start() # letzte Kugel starten elif s == 'l': for i in range(10): scene.center = scene.center+scene.forward*mag(scene.center-scene.mouse.camera) scene.center.y = scene.center.y+0.5 objekte[num].pos=scene.center sleep(0.01) for i in range(10): scene.center = scene.center+scene.forward*mag(scene.center-scene.mouse.camera) scene.center.y = scene.center.y-0.5 objekte[num].pos=scene.center sleep(0.01) elif s == ' ': for i in range(10): scene.center.y = scene.center.y+0.5 objekte[num].pos=scene.center sleep(0.01) sleep(0.1) for i in range(10): scene.center.y = scene.center.y-0.5 objekte[num].pos=scene.center sleep(0.01) self.f.sendto("objekte[%s].pos=(%s,%s,%s)"\ %(num,objekte[num].x,objekte[num].y,objekte[num].z),\ (self.host, self.fport)) # Versand der Anweisung an Gegenueber for y in range(len(saeule)): if mag(objekte[num].pos-saeule[y].pos) < 7: if lastaction == "up": scene.center = scene.center-scene.forward*mag(scene.center-scene.mouse.camera) objekte[num].pos=scene.center elif lastaction == "down": scene.center = scene.center+scene.forward*mag(scene.center-scene.mouse.camera) objekte[num].pos=scene.center if aussenwand[0].pos[2]-objekte[num].pos[2] < 3 or \ aussenwand[1].pos[2]-objekte[num].pos[2]+3 > 1 or \ aussenwand[2].pos[0]-objekte[num].pos[0] < 3 or \ aussenwand[3].pos[0]-objekte[num].pos[0]+3 > 1: if lastaction == "up": scene.center = scene.center-scene.forward*mag(scene.center-scene.mouse.camera) objekte[num].pos=scene.center elif lastaction == "down": scene.center = scene.center+scene.forward*mag(scene.center-scene.mouse.camera) objekte[num].pos=scene.center # -------------- Thread Kugel ------------ class Kugel(Spieler): def __init__(self): Spieler.__init__(self) def run(self): global saeule global sauelentreffer global num self.geschoss = sphere(pos=scene.center) self.f.sendto("geschoss = sphere(pos=(%s,%s,%s))" %(scene.center.x, scene.center.y, scene.center.z), (self.host, self.fport)) direction = scene.forward.astuple() stop = False for x in range(0,100,1): if stop: break rate(50) self.geschoss.pos += vector(direction)*2.1 self.f.sendto("geschoss.pos=(%s,%s,%s)"\ %(self.geschoss.x,self.geschoss.y,self.geschoss.z),\ (self.host, self.fport)) """if num == 0: if mag(self.geschoss.pos - objekte[num+1].pos) < 5: print "Got him!" self.geschoss.visible = False del self.geschoss sleep(5) break if mag(self.geschoss.pos - objekte[num].pos) < 5: print "HIT" self.geschoss.visible = False del self.geschoss sleep(5) break elif num == 1: print "eins!" if mag(self.geschoss.pos - objekte[num-1].pos) < 5: print "Got him!" self.geschoss.visible = False del self.geschoss sleep(5) break if mag(self.geschoss.pos - objekte[num].pos) < 5: print"HIT" self.geschoss.visible = False del self.geschoss sleep(5) break """ for y in range(len(saeule)): kaputt = False if stop: break position = saeule[y].pos.astuple() position = vector(position) position[1] = 5 if mag(saeule[y].pos - self.geschoss.pos) < 5: self.geschoss.visible=False if saeulentreffer[y] == 0: saeule[y].material = materials.wood elif saeulentreffer[y] == 1: saeule[y].opacity = 0.5 else: saeule[y].visible=False del saeule[y] kaputt = True del saeulentreffer[y] del self.geschoss if kaputt != True: saeulentreffer[y] = saeulentreffer[y] +1 stop = True break haus_anzahl=40 floor = box(pos=(0,0,0), width=120, height=1, length=120, color=(0.4,0.4,0.4), material=materials.marble) ceiling = box(pos=(0,12,0), width=120, height=1, length=120, color=(0.4,0.4,0.4), material=materials.marble) aussenwand = [] aussenwand.append(box(pos=(0,6,60), length=120, width=1, height=12, material=materials.bricks)) aussenwand.append(box(pos=(0,6,-60), length=120, width=1, height=12, material=materials.bricks)) aussenwand.append(box(pos=(60,6,0), length=1, width=120, height=12, material=materials.bricks)) aussenwand.append(box(pos=(-60,6,0), length=1, width=120, height=12, material=materials.bricks)) saeule = [] saeulentreffer = [] objekte = [sphere(radius=2, color=color.green, pos=scene.center),\ sphere(radius=2, color=color.red, pos=scene.center)] geschosse = [] zufall = [] num = 0 if __name__ == "__main__": a=Spieler() a.action(1)