Top Gun für Arme (Non-Multiplayer Beta)
Obwohl "beta", noch nicht lauffähig. Es gibt noch zu tun:
- Kollisionsabfrage + Health Change
- Schießen fixen
- Sinusfunktion fixen
Top Gun.py — text/python-source, 7 KB (7309 bytes)
Dateiinhalt
# -*- coding: utf-8 -*-
from visual import *
from threading import Thread
import socket
projectname = 'Top Gun für Arme'
projectstatus = 'Multiplayer Demo'
# Portnummer und Hostadresse des Fremdservers: bei Bedarf aendern
FremdPORT=8000 # Port des Fremdservers
HOST="141.84.220.92" # Adresse des Gegenueber
EigenPORT=8001 # Port des eigenen Servers
scene.title = projectname+' '+projectstatus # Fenstertitel
scene.x = 0 # Fensterpos v. links
scene.y = 0 # Fensterpos v. oben
scene.height = 480 # Fensterhöhe
scene.width = 640 # Fensterbreite
scene.range = (1,1,1) # Abstand
scene.userspin = False
scene.userzoom = False
scene.background = (0.8,0.85,1) # Farbe Hintergrund
scene.stereodepth = 2 # Stereotiefe
scene.show_rendertime = False # Anzeige der Berechnungszeiten
scene.fullscreen = False # Vollbildmodus
b1=box(pos=(10,0,-100),color=color.red) #Boxen im 1.Fenster
b2=box(pos=(-10,0,-500),color=color.red)
b3=box(pos=(10,0,-100)) #Boxen im 2.Fenster
b4=box(pos=(-10,0,-500))
def xgeben (frame, local):
x_axis = norm(frame.axis)
z_axis = norm(cross(frame.axis, frame.up))
y_axis = norm(cross(z_axis, x_axis))
return x_axis
def ygeben (frame, local):
x_axis = norm(frame.axis)
z_axis = norm(cross(frame.axis, frame.up))
y_axis = norm(cross(z_axis, x_axis))
return y_axis
def zgeben (frame, local):
x_axis = norm(frame.axis)
z_axis = norm(cross(frame.axis, frame.up))
y_axis = norm(cross(z_axis, x_axis))
return z_axis
class Spieler(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 fuer Clientfunktion
self.f = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# UDP-Socket fuer Eigenserver
self.e = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.e.bind(("",eport))
def run(self): # interne Startmethode des Threads
while True: # Endlosschleife der Serverausgabe (50 Zeichen)
try: # Versuch, die Nachricht vom Gegenueber umzusetzen
info = self.e.recvfrom(50)[0]
exec(info)
except:
print "Fehler beim Ausfuehren von Serveranweisung"
class Bullet(Thread, frame):
def __init__(self, p=(0,0,0), axis=(0,0,0)):
Thread.__init__(self)
frame.__init__(self, pos=p, axis = (0,0,1))
self.jacket = sphere(radius=(0.1), pos=self.pos+vector(0,5,0), frame=self)
self.v = vector(0,0,-10)
def fly (self):
self.pos = self.pos+self.v
class Jet (Thread, frame):
def __init__(self, p=(0,0,0), axis=(0,0,0), c=color.white, leading=true):
Thread.__init__(self)
frame.__init__(self, pos=p, axis = (0,0,1))
self.achse = vector(0,0,1)
self.body = cylinder(radius = 2, axis=(-10,0,0), pos=(0,0,0), material=materials.wood, color=c, frame=self)
self.wing = box (length=3, height=1, width=15, pos=(-6,0,0), material=materials.wood, color=c, frame=self)
self.bullets = [Bullet]
self.bulletMax = 40
self.health = 100
self.xchange = 0
self.ychange = 0
self.zchange = 0
self.v = vector(0,0,-1)
self.t = 0.0
def fly (self):
vvec = vector(self.xchange,self.ychange,self.zchange)
vchange = self.v+vvec # SINUSPROBLEM! FRAGEN!
self.pos = self.pos+vchange # Jet-Bewegung
print self.pos
def nose (self, positive):
self.t = self.t+0.1
if positive == True:
self.ychange = sin(self.t)
self.rotate(angle = -0.1*(pi/3), axis = zgeben(self, self.body), origin = self.body.pos+vector(0,0,6))
else:
self.ychange = -sin(self.t)
self.rotate(angle = 0.1*(pi/3), axis = zgeben(self, self.body), origin = self.body.pos+vector(0,0,6))
def roll(self, vturn):
self.rotate(angle = vturn, axis=self.axis)
def shoot (self):
if len(self.bullets) < self.bulletMax:
self.bullets.append(Bullet(axis=self.axis))
else:
print 'LADE NACH!'
del self.bullets
self.bullets = [Bullet]
if __name__ == "__main__":
print 'Initializing "',projectname,' ', projectstatus
print 'By Darko Jankovic & Felix Schneider'
print 'LMU Probestudium Informatik 2012'
print '-------------------------------------------'
print 'Initializing network...'
#s1 = Spieler() # Adressen, Ports!
#s2 = Spieler()
print 'Initializing Jet 1...' # DEF ACTION! TODO!
j1 = Jet()
print '...successful! Jet 1 awaiting orders.'
print ''
print 'Initializing Jet 2...'
j2 = Jet(p=(0,0,-30), c=(0.5,0.5,0.5))
print '...successful! Jet 2 awaiting orders.'
print '-------------------------------------------'
print 'CONTROLS:'
print 'Key | Function'
print '======================'
print '. | accelerate'
print ', | decelerate'
print '[up] | Nose up'
print '[down] | Nose down'
print '[left] | Roll left'
print '[right] | Roll right'
print '- | Shoot'
print '-------------------------------------------'
print 'Press the any key to start the game!'
scene.center = (0,5,10)
scene.autoscale = False
bodenplatte = box (pos=(0,-1000,0), size=(1000,1,1000), color=(0.5,1,0.5))
himmelplatte = box (pos=(0,1000,0), size=(1000,1,1000), color=(0,0,1))
if scene.kb.getkey() > 0: # hier Abfrage nach dem Any-Key
running = True
while running == True:
key = scene.kb.getkey()
rate(50)
j1.fly()
#j1.bullets[0:(j1.bulletMax-1)].fly()
scene.center = j1.axis+j1.pos+#(0,5,5) #Kamera fixen?
scene.forward = -j1.axis
scene.up = j1.axis
print 'Health: ',str(j1.health),'| Ammo: ',str(j1.bulletMax-(len(j1.bullets)-1))
#if mag(j1.pos-j2-pos)<2: #unsupported operand type!
# print 'Double Fail! Game over.'
# break
#elif mag(j1.pos-object(Bullet).pos)<2: #Kollisionsabfrage TODO!
# j1.health = j1.health-10
#elif mag(j2.pos-object(Bullet).pos)<2:
# j2.health = j2-health-10
if key == '.' and mag(j1.v)<4.0: #Beschleunigung
j1.v = j1.v*1.1
elif key == ',' and mag(j1.v)>0.5: #Bremsung
j1.v = j1.v*0.9
if key == 'left':
j1.roll(vturn=pi/90)
elif key == 'right':
j1.roll(vturn=-pi/90)
if key == 'up':
j1.nose(False)
elif key == 'down':
j1.nose(True)
if key == '-':
j1.shoot()
if j1.health == 0:
print 'Winner: Jet #2! Congrats, mate!'
break
elif j2.health == 0:
print 'Winner: Jet #1! Congrats, mate!'
break