tunnelrennen5a.py
Für das Spiel textur2.tga in das selbe Verzeichnis wie das Skript kopieren!
tunnelrennen5a.py — text/python-source, 12 KB (12499 bytes)
Dateiinhalt
#! /bin/bash /usr/bin/python2.6
# -*- coding: utf-8 -*-
'''
Created on 15.04.2011 - 20-04-2011, Probestudium Informatik LMU 2011
@author: Florian
Der Spieler faehrt auf einem sich drehenden Ring. Mit der Maus kann das Auto um den Ring rotiert werden. Es geht darum, moeglich
'''
###
from visual import*
from visual.controls import *
from random import*
from math import *
import thread
import Image
class tunnelrennen():
def __init__(self):
self.scene = display(height = 1000,\
width = 1000,\
fullscreen=True,\
forward=(-1,-0.5,0) ,\
up = (-1,0,0),\
fov = 2,\
center=(0,0,0),\
range = 1.5,\
userspin = False,\
userzoom = False,\
autoscale = False) # Programmfenster
### Erstellung der Textur fuer den Tunnel
#textur = "textur"
#im = Image.open("textur.tga") # Oeffnen des Bildes
#materials.saveTGA(textur,im) # Speichern des Bildes intern
#self.pano = materials.texture(data=im, mapping="spherical") # Darstellungsart
textur2 = "textur2"
im2 = Image.open("textur2.tga") # Oeffnen des Bildes
materials.saveTGA(textur2,im2) # Speichern des Bildes intern
self.pano2 = materials.texture(data=im2, mapping="spherical") # Darstellungsart
self.scene.title=("Weiche den Hindernissen aus!")
self.welt = frame()
self.system = frame(frame = self.welt)
self.bahn = ring(frame = self.system, axis=(0,1,0), radius = 20, thickness = .8, material = materials.diffuse, twosided = false , opacity = 0.5)
self.tunnel = ring(frame = self.system, axis = (0,1,0), radius = 20, thickness = 3, material = self.pano2)
self.auto = box(frame = self.welt,color = color.red, length = 1, height = .3, width = .3, y = self.bahn.thickness+.15, z = self.bahn.radius)
self.hitL = label(frame = self.welt,text="Rundenpunkte: \n Gesamtpunkte:", space=0.2, pos = self.auto.pos, opacity=0.25, yoffset = 10)
self.StartL = label(line = false,frame = self.welt,space = 0.2, pos = self.auto.pos, opacity = 0.25, text = "Sammle moeglichst viel Hits!! \n Start mit Leertaste",yoffset = 70)
self.origin = vector(0,0,self.bahn.radius)
self.mode = 1
self.start = 0
self.ListHindernisse = []
#lamp = local_light(pos=(0,0,0), color=color.yellow)
self.scene.center=self.auto.pos
self.drehwinkel = 0
self.hits = 0
self.hits2 = 0
self.round = 1
if self.scene.fullscreen==False:
self.cwindow = controls(title = "Einstellungen", height = 400, width = 400)
view = menu(text = "Sichtmodus", pos = (0,50), height = 20, width = 140)
view.items.append(("Bewegung mit Auto", lambda: self.sichtModus(1)))
view.items.append(("Unbewegter Beobachter", lambda: self.sichtModus(0)))
def fahren(self):
self.auto.rotateWinkel=0
self.auto.rotateWinkel2 =0
while true:
rate(60)
if self.start == 1:
x=self.scene.center
y = self.scene.mouse.pos.z
rotateWinkel = radians(6*(self.scene.mouse.pos.z-x.z))
if rotateWinkel >=0.08 or rotateWinkel <=-0.08:
rotateWinkel = abs(rotateWinkel)/rotateWinkel*0.07
if rotateWinkel >=0.12 or rotateWinkel <=-0.12:
rotateWinkel = 0
#print rotateWinkel
self.auto.rotate(angle=rotateWinkel, axis = (1,0,0), origin = (0,0,self.bahn.radius))
if self.mode == 1:
self.welt.rotate(angle=-rotateWinkel, axis =(1,0,0), origin = (0,0,self.bahn.radius))
self.system.rotate(angle=radians(0.4*(sqrt(self.round)/1.5)), axis = (0,1,0))
self.drehwinkel = self.drehwinkel + 0.4*(sqrt(self.round)/1.5)
self.scene.center=(self.welt.frame_to_world(self.auto.pos).x,self.welt.frame_to_world(self.auto.pos).y,self.welt.frame_to_world(self.auto.pos).z)
self.scene.forward=(-1,-self.welt.frame_to_world(self.auto.pos).y/2, 0)
self.scene.up=(self.auto.pos.y,self.auto.pos.z,self.auto.pos.x)
self.hitL.pos = self.auto.pos
self.auto.rotateWinkel = (self.auto.rotateWinkel + rotateWinkel)%(2*pi)
self.auto.rotateWinkel2 =(self.auto.rotateWinkel2+rotateWinkel)%(2*pi)
elif self.start == 2:
break
def hindernisse2(self,runde):
"Setzen der Hindernisse fuer eine Runde"
pos = vector(0,0,self.bahn.radius) # Erstes Hinderniss wird bei Startposition des self.autos gesetzt
winkel = 10 # Berechnung des Winkelabstands zwischen zwei Hindernissen, abhaengig von der Runde
self.ListHindernisse.append((ring(frame=self.system,pos = pos, radius = 2, thickness = 0.3, rotateWinkel = pi/2,\
color = color.orange)))
#lamp = local_light(frame = system,pos=pos, color=color.orange)
pos=vector(pos.x*cos(radians(winkel))-pos.z*sin(radians(winkel)),pos.y,\
pos.z*cos(radians(winkel))+pos.x*sin(radians(winkel)))
thread.start_new(self.Effekt2, (pos,))
for i in range(36):
self.ListHindernisse.append((box(frame=self.system, pos=pos, length=0.1,\
color=color.hsv_to_rgb((random(),1,1)),\
height=self.tunnel.thickness*2, width=0.1, axis=(pos.z,pos.y,-pos.x)))) # neues Hindernis an Liste anhaengen
rotateWinkel = randrange(0,180)
self.ListHindernisse[-1].rotate(angle=radians(rotateWinkel), axis=(pos.z,pos.y,-pos.x)) # Hindernis nach Zufall um Bahn drehen
self.ListHindernisse[-1].rotateWinkel = rotateWinkel
pos=vector(pos.x*cos(radians(winkel))-pos.z*sin(radians(winkel)),pos.y,\
pos.z*cos(radians(winkel))+pos.x*sin(radians(winkel))) # Berechnung der neuen Hindernisposition mit Vektordrehung
def hits2m(self):
alphaA = acos(vector(0,self.bahn.thickness,0).dot(vector(0,self.bahn.thickness,0.5*self.auto.width)) / \
(mag(vector(0,self.bahn.thickness,0))*mag(vector(-0.5*self.auto.width,self.bahn.thickness,0))))
alphaB = acos(vector(0,self.bahn.thickness,0).dot(vector(0,self.bahn.thickness,0.05)) / \
(mag(vector(0,self.bahn.thickness,0))*mag(vector(-0.05,self.bahn.thickness,0))))
alphaG = (alphaA + alphaB) / 2
#print "aA =", alphaA
#print "aB =", alphaB
while true:
time.sleep(0.02)
for obj in self.ListHindernisse:
#print system.frame_to_world(obj.pos).x
if self.system.frame_to_world(obj.pos).x<=0.8 and self.system.frame_to_world(obj.pos).x>=-0.8 and self.system.frame_to_world(obj.pos).z>self.bahn.radius-0.5:
#objVector = vector(system.frame_to_world(obj.axis).x,system.frame_to_world(obj.axis).z,system.frame_to_world(obj.axis).y)
winkel1 = acos(((self.auto.pos-self.origin).dot(vector(0,self.bahn.thickness,0))) / (mag(self.auto.pos-self.origin)*mag ( vector(self.bahn.thickness,0))))
#winkel1 = self.auto.rotateWinkel2
winkel2a = radians(obj.rotateWinkel)
winkel2b = radians(180-obj.rotateWinkel)
winkela = abs(winkel2a-winkel1)
winkelb = abs(winkel2b-winkel1)
#print obj,system.frame_to_world(obj.pos), self.auto.pos-origin, degrees(winkela)
if winkela <= alphaG or winkelb <= alphaG or 2*pi-winkel2a <=alphaG or 2*pi-winkel2b <= alphaG:
self.hits=self.hits+1
self.hits2 = self.hits2 +1
self.hitL.text = "Rundenpunkte: "+str(self.hits)+"\n Gesamtpunkte: "+ str(self.hits2)
thread.start_new(self.Effekt, (obj.color,))
#print winkela," ",winkelb
while self.system.frame_to_world(obj.pos).x<=0.8:
time.sleep(0.02)
pass
def neueHindernisse(self):
while true:
time.sleep(0.1)
if self.drehwinkel > 360*(self.round-1) and self.hits < 10 and self.round > 1:
self.start = 2
self.StartL.pos = self.auto.pos
self.StartL.visible = True
self.StartL.text = "GAME OVER \n Du haettest mindestens 10 Punkte \n pro Runde erreichen muessen!! \n Press escape!"
break
elif self.drehwinkel > 360*(self.round-1):# and (hits >=15 or round ==1) :
self.hits = 0
for obj in self.ListHindernisse:
obj.visible = False
self.ListHindernisse=[]
#lamp.visible = false
self.hindernisse2(round)
self.round=self.round+1
time.sleep(5)
def Effekt(self,color):
boxList = []
for i in range(30):
boxList.append(box(frame=self.welt,pos=self.auto.pos + vector(-1,0,0),width=0.1,height=0.1,length=0.1,\
color=color))
boxList[-1].v=vector(-0.1,uniform(-0.5,0.5),uniform(-0.5,0.5))
for i in range(50):
for obj in boxList:
obj.pos=obj.pos+obj.v
time.sleep(0.02)
for obj in boxList:
obj.visible = false
return None
def Effekt2(self,pos):
boxList = []
for i in range(100):
boxList.append(sphere(frame = self.welt, pos = pos,color=color.hsv_to_rgb((random(),1,1)),\
radius = 0.5, v = vector(-0.1,uniform(-0.5,0.5),uniform(-0.5,0.5)) ))
for i in range(25):
for obj in boxList:
obj.pos = obj.pos + obj.v
time.sleep(0.05)
for obj in boxList:
obj.visible = false
def sichtModus(self,modeN):
global mode
if modeN !=mode:
if modeN == 1:
self.welt.rotate(angle=-self.auto.rotateWinkel, axis =(1,0,0), origin = (0,0,self.bahn.radius))
if modeN ==0:
self.welt.rotate(angle=self.auto.rotateWinkel, axis =(1,0,0), origin = (0,0,self.bahn.radius))
mode = modeN
def sichtModusKey(self):
while true:
time.sleep(0.1)
if self.scene.kb.keys !=0:
s = self.scene.kb.getkey()
if s=="v":
if self.mode == 0:
self.welt.rotate(angle=-self.auto.rotateWinkel, axis =(1,0,0), origin = (0,0,self.bahn.radius))
elif self.mode == 1:
self.welt.rotate(angle=self.auto.rotateWinkel, axis =(1,0,0), origin = (0,0,self.bahn.radius))
self.mode = (self.mode+1)%2
time.sleep(1)
def startstop(self):
while true:
time.sleep(0.1)
if self.scene.kb.keys !=0:
s = self.scene.kb.getkey()
if s==" ":
if self.start == 0:
self.StartL.visible=false
elif self.start == 1:
self.StartL.text = "Pause"
self.StartL.pos = self.auto.pos
self.StartL.visible = true
self.start = (self.start+1)%2
time.sleep(0.5)
def run(self):
thread.start_new(self.startstop, ())
thread.start_new(self.fahren, ())
thread.start_new(self.neueHindernisse, ())
thread.start_new(self.hits2m, ())
thread.start_new(self.sichtModusKey,())
if self.scene.fullscreen==false:
while true:
rate(10)
self.cwindow.interact()
x = tunnelrennen()
x.run()