Multi_RN
multi.py — Python Source, 9 KB (10152 bytes)
Dateiinhalt
# -*- coding: utf-8 -*- # Client und Server gleichzeitig import socket # Modul für Netzwerkverbindung from threading import Thread # Modul für Nebenläufigkeit from visual import * # 3D-Modul from random import * # Portnummer und Hostadresse des Servers: bei Bedarf aendern FremdPORT=8001 HOST="141.84.220.97" EigenPORT=8000 a = 100 b = 100 scene.title = "Robin City" # Fenstertitel scene.x = 300 # Fensterpos v. links scene.y = 400 # Fensterpos v. oben ##scene.height = 320 # Fensterhöhe ##scene.width = 700 # Fensterbreite scene.range = (5,10,10) # Abstand #scene.scale = (1,0.1,100) #scene.center = (0,10,2) # Wohin schaut die Kamera - wo ist die Mitte des Fensters? Normalerweise (0,0,0) # kann sich aber auch mit einem Objekt mitbewegenFestlegung Blickziel scene.userspin = False # Blickwechsel abgeschaltet scene.userzoom = False # Benutzerzoom abgeschaltet scene.fov = 2 # Kamerawinkel ##scene.background = (0.8,0.85,1) # Farbe Hintergrund scene.stereodepth = 1 # Stereotiefe scene.show_rendertime = False # Anzeige der Berechnungszeiten #scene.fullscreen = True # Vollbildmodus hausAnzahl = 30 #Inhalte des Fensters scene.userspin = False # Kann der Benutzer die Kamera bewegen? class Feld(frame): def __init__(self): frame.__init__(self) self.Platte = box(frame = self, pos = (0,0,0), length = a, height = 0.3, width = b, color = color.white, material = materials.silver) class Rahmen(frame): def __init__(self): frame.__init__(self) self.RandUnten = box(frame = self, pos = (0,1.35,b/2), length = a, height = 3, width = 0.3, color = color.white, material = materials.bricks) self.RandOben = box(frame = self, pos = (0,1.35,-b/2), length = a, height = 3, width = 0.3, color = color.white, material = materials.bricks) self.RandRechts = box(frame = self, pos = (a/2,1.35,0), length = 0.3, height = 3, width = b, color = color.white, material = materials.bricks) self.RandLinks = box(frame = self, pos = (-a/2,1.35,0), length = 0.3, height = 3, width = b, color = color.white, material = materials.bricks) class Spielfigur(frame): def __init__(self,farbe): frame.__init__(self) self.kegel = cone( frame = self, pos=(0,0.1,0), axis=(0,1,0), radius = 0.5, color = farbe) self.kugel = sphere( frame = self, pos=(0,1.2,0), radius = 0.4, color = farbe) self.pfeil = arrow( frame = self, pos= (0,1,0), axis = (1,0,0), color = color.yellow) self.rotate(frame = self, angle = pi/2, axis = (0,1,0)) ##class haus(): ## def __init__(self): ## for i in range(hausAnzahl): # Häuser durch Zufall generieren ## zufall = random() ## box(pos=(random()*100-50, (10+zufall*5)/2,random()*100-50),\ ## width=5+random()*5, height=10+zufall*5, length=7+random()*3, \ ## color=color.hsv_to_rgb(((float(i)/hausAnzahl),1,1))) class city(frame): def __init__(self, farbe): frame.__init__(self) #Moeglichkeit 2: Material aus einem *Bild* erzeugen #(Hoehe und Breite des Bilds im unkomprimierten tga/targa-Format muessen 2er-Potenzen sein, zB 1024x2048 tex3 = materials.texture(data=materials.loadTGA("haus.tga"), mapping = "spherical") #tex3 = materials.texture(data=Image.open("Bethlehem.tga"), mapping = "spherical") self.haus1 = box(frame = self, pos =(40,3.8,34), length = 13, height = 7, width = 9, color = farbe, material = tex3) self.haus2 = box(frame = self, pos =(7,12.8,20), length = 13, height = 25, width = 9, color = farbe, material = tex3) self.haus3 = box(frame = self, pos =(46,7.8,40), length = 13, height = 15, width = 9, color = farbe, material = tex3) self.haus4 = box(frame = self, pos =(25,2.8,40), length = 13, height = 5, width = 9, color = farbe, material = tex3) self.haus5 = box(frame = self, pos =(35,3.3,30), length = 13, height = 6, width = 9, color = farbe, material = tex3) self.haus6 = box(frame = self, pos =(40,4.3,25), length = 13, height = 8, width = 9, color = farbe, material = tex3) self.haus7 = box(frame = self, pos =(37,6.3,10), length = 13, height = 12, width = 9, color = farbe, material = tex3) self.haus8 = box(frame = self, pos =(10,3.8,37), length = 13, height = 7, width = 9, color = farbe, material = tex3) self.haus9 = box(frame = self, pos =(18,4.3,9), length = 13, height = 8, width = 9, color = farbe, material = tex3) self.haus10= box(frame = self, pos =(2,3.8,12), length = 13, height = 7, width = 9, color = farbe, material = tex3) self.Haus1 = box(frame = self, pos =(-10,0,38), length = 13, height = 20, width = 9, material = tex3) self.Haus2 = box(frame = self, pos =(-37,0,8), length =13, height = 16, width = 9, material = tex3) self.Haus3 = box(frame = self, pos =(-22,0,-40), length = 13, height =17, width = 9, material = tex3) self.Haus4 = box(frame = self, pos =(-45,0,26), length = 13, height =20, width = 9, material = tex3) self.Haus5 = box(frame = self, pos =(-2,0,-17), length =13, height = 15, width = 9, material = tex3) self.Haus6 = box(frame = self, pos =(0,0,7), length = 13, height = 16, width = 9, material = tex3) self.Haus7 = box(frame = self, pos =(-18,0,25), length = 13, height = 19, width = 9, material = tex3) self.Haus8 = box(frame = self, pos =(-38,0,-16), length=13, height =20, width = 9, material = tex3) self.Haus9 = box(frame = self, pos =(-20,0,45), length =13, height =20, width =9, material = tex3) self.Haus10= box(frame = self, pos =(-9,0,14), length = 13, height = 14, width = 9, material = tex3) ##class Haus(frame): ## ## def __init__(self, farbe): ## frame.__init__(self) ## self.haus = box( frame = self, pos=(0,3.3,0), length = 10, height = 6, width = 6, color = farbe) ## # self.dach = pyramid( frame = self,color= farbe, pos=(30,10,20), size=(8,15,10),axis = (0,1,0)) Feld = Feld() Rand = Rahmen() objekte = [Spielfigur(color.blue),\ Spielfigur(color.red)] #haus = haus() stadt = city(color.white) #Haus = Haus(color.cyan) class Client(Thread): """Schnelle Verbindung zu Server""" def __init__(self, host=HOST, fport=FremdPORT, eport=EigenPORT): Thread.__init__(self) self.host = host self.fport = fport self.eport = eport # UDP-Socket für Clientfunktion self.f = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP-Socket für Eigenserver self.e = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.e.bind(("",eport)) def run(self): # interne Startmethode des Threads while 1: # Endlosschleife der Serverausgabe (50 Zeichen) try: # Info vom Server hören und umsetzen #print self.f.recvfrom(50)[0] info = self.e.recvfrom(50)[0] exec(info) except: print "Fehler beim Ausführen von Serveranweisung" def action(self,obj): # startet den Client, indem self.start() # der Thread aufgerufen wird while True: # Endlosschleife bis Nachricht versandt rate(50) if scene.kb.keys: s = scene.kb.getkey() print s ## Collision_Detection: Falls ein Objekt berührt wird springe um n*axis zurück if objekte[obj].x <= 7.5 and objekte[obj].z <= 11.5 and objekte[obj].z >= 2.5 and objekte[obj].x >= -7.5 or \ objekte[obj].x <= 7.5 and objekte[obj].z <= 11.5 and objekte[obj].z >= 2.5 and objekte[obj].x >= -7.5 or \ objekte[obj].x <= 7.5 and objekte[obj].z <= 11.5 and objekte[obj].z >= 2.5 and objekte[obj].x >= -7.5 or \ objekte[obj].x <= 7.5 and objekte[obj].z <= 11.5 and objekte[obj].z >= 2.5 and objekte[obj].x >= -7.5 or \ objekte[obj].x <= 7.5 and objekte[obj].z <= 11.5 and objekte[obj].z >= 2.5 and objekte[obj].x >= -7.5 or \ objekte[obj].x <= 7.5 and objekte[obj].z <= 11.5 and objekte[obj].z >= 2.5 and objekte[obj].x >= -7.5 : objekte[obj].pos = objekte[obj].pos - 3*objekte[obj].axis elif s == 'left': # links objekte[obj].rotate (angle = pi/2, axis = (0,1,0)) elif s == 'right': # right objekte[obj].rotate (angle = -pi/2, axis = (0,1,0)) elif s == 'up': # vor objekte[obj].pos = objekte[obj].pos + 0.7*objekte[obj].axis elif s == 'down': # zurück objekte[obj].pos = objekte[obj].pos - 0.8*objekte[obj].axis elif s == '0': # zurück auf Ursprung setzen; Geschw. null; Kamera ran objekte[obj].pos = (0,0,0) self.f.sendto("objekte[%s].pos=(%s,%s,%s)"\ %(obj,objekte[obj].x,objekte[obj].y,objekte[obj].z),\ (self.host, self.fport)) scene.center = objekte[obj].pos + objekte[obj].axis #- vector(0,0.5,0) scene.forward = objekte[obj].axis + vector(0,-0.5,0) ## ## Collision_Detection: Falls ein Objekt berührt wird springe um n*axis zurück ## if objekte[obj].x <= 7.5 and objekte[obj].z <= 11.5 and objekte[obj].z >= 2.5 and objekte[obj].x >= -7.5: ## objekte[obj].pos = objekte[obj].pos - 3*objekte[obj].axis # Hier Hostadresse, FremdPort, Eigenport dem Konstruktor übergeben c = Client("141.84.220.97", 8000, 8001) # 0 = Blaues Hütchen, 1 = Rot #for i in range (6): c.action(1) #"141.84.220.97", 8000, 8001