Bitflight
Version_6(für_Python_2.6.5).py — text/python-source, 21 KB (21835 bytes)
Dateiinhalt
''' Created on 16.04.2011 @author: 00cc00 ''' from visual import* from math import* from visual.controls import * from random import* import threading from time import* ######### class brick(object): #Standard Brick used for the walls def __init__(self,pos,frame,color): self.brickw = box(width = 1,\ height = 1,\ length = 1,\ pos = pos,\ material = materials.emissive,\ color = color,\ frame = frame,\ opacity = 1.,\ twosided = False) def set_opacity(self,i): self.brickw.opacity = i ######### class wall_type_1(object): #Wall segment used in the world() def __init__(self,i): self.wallf = frame() self.tunnel = frame() self.wall = [] self.speed = speed self.dead_brick = 0 self.segment = frame() self.offset = i self.color = color.hsv_to_rgb((random(),1,1)) for i in range(L): #building a 4x4 Matrix self.wall.append(brick((i,0,0),self.wallf,self.color)) for i in range(L): self.wall.append(brick((i,1,0),self.wallf,self.color)) for i in range(L): self.wall.append(brick((i,2,0),self.wallf,self.color)) for i in range(L): self.wall.append(brick((i,3,0),self.wallf,self.color)) self.dead_brick = randrange(0,self.anzahlGeben()) #random brick which will be invisible self.wall[self.dead_brick].set_opacity(0.) self.axis1 = curve(frame = self.tunnel, pos=[(0,0,3*L), (0,0,0)], color=color.white) #painting the tunnel self.axis2 = curve(frame = self.tunnel, pos=[(L,0,3*L), (L,0,0)], color=color.white) self.axis3 = curve(frame = self.tunnel, pos=[(L,L,3*L), (L,L,0)], color=color.white) self.axis4 = curve(frame = self.tunnel, pos=[(0,L,3*L), (0,L,0)], color=color.white) self.tunnel.pos = self.tunnel.pos + (-2,-2,0) #adjusting the frames and creating a total frame self.wallf.pos = self.wallf.pos + (-1.5,-1.5,0) self.tunnel.frame = self.segment self.wallf.frame = self.segment self.segment.z = self.segment.z + L*3*-self.offset def anzahlGeben(self): #total count of bricks return len(self.wall) def listeGeben(self): #useless return self.wall def set_speed(self, speed): #speed for the movement of the wall self.speed = speed def move(self, speed): #moving the wall self.segment.z += speed ######### class Me(threading.Thread,object): #the object controlled by the player def __init__(self,world,control): threading.Thread.__init__(self) self.me = box(pos = (0,0,16), size = (.3,.3,.3)) self.points = 0 #counter for points self.misses = 0 #counter for misses self.streak = 0 #counter for current streak self.bstreak = 0 #counter for best streak self.wallpass = 0 #used for checking the wallpass self.world = world self.labels = frame() self.stage = 0 #Speedstage self.virtualpoints = 0 self.button = control #infolabels self.counterScore = label(frame = self.labels,\ pos=self.me.pos,\ text='Score: '+str(self.points),\ xoffset=0,\ yoffset=25,\ line = False,\ height = 10) self.counterMisses = label(frame = self.labels,\ pos=self.me.pos,\ text='Misses: '+str(self.misses),\ xoffset=0,\ yoffset=1,\ line = False,\ height = 10) self.counterStreak = label(frame = self.labels,\ pos=self.me.pos,\ text='Streak: '+str(self.streak),\ xoffset=0,\ yoffset=-1,\ line = False,\ height = 10) self.counterBStreak = label(frame = self.labels,\ pos=self.me.pos,\ text='Best Streak: '+str(self.bstreak),\ xoffset=0,\ yoffset=-25,\ line = False,\ height = 10) self.labels.height = 40 def reset(self): #counter for checking if you passed a wall is reseted self.wallpass = 0 def run(self): #observes the movement of the brick while true: sleep(0.02) self.newposy = scene1.mouse.pos.y #checks if the new position is inside the tunnel if (L/2 > self.newposy > -L/2): #L is the width/height of the tunnel so you have to check L/2 to the left/right/bottom/top self.me.y = self.newposy #sets new pos scene1.forward = -self.me.pos #sets new camera pos self.labels.y = self.newposy #sets new label pos self.newposx = scene1.mouse.pos.x if (L/2 > self.newposx > -L/2): #same as above but for the x-axis self.me.x = self.newposx scene1.forward = -self.me.pos self.labels.x = self.newposx if (self.me.z < self.world.stage[0].segment.pos.z-0.5)and self.wallpass == 0: #checks if you reached a wall self.wallpass += 1 #is needed for, that you do not count the wall multiple times #the next line checks if you are inside the invisible block: self.world.stage[0].wall[self.world.stage[0].dead_brick].brickw.y returns the y pos of the invisible brick and so on if (self.world.stage[0].wall[self.world.stage[0].dead_brick].brickw.y-1.18 > self.me.y > self.world.stage[0].wall[self.world.stage[0].dead_brick].brickw.y-1.82) and (self.world.stage[0].wall[self.world.stage[0].dead_brick].brickw.x-1.18 > self.me.x > self.world.stage[0].wall[self.world.stage[0].dead_brick].brickw.x-1.82): self.points += 1 #points + 1 self.virtualpoints += 1 #virtual points are needed for the speed up ever 20 points self.counterScore.text = 'Score : '+str(self.points) #label update self.streak +=1 #streak + 1 self.counterStreak.text = 'Streak : '+str(self.streak) #label update if self.streak >= self.bstreak: #checks if your current streak is better then the previous self.bstreak = self.streak #new best streak self.counterBStreak.text = 'Best Streak : '+str(self.bstreak) #label update else: self.misses += 1 #otherwise misses +1 self.counterMisses.text = 'Misses : '+str(self.misses) #label update self.streak =0 #resets current streak self.counterStreak.text = 'Streak : '+str(self.streak) #label update if self.virtualpoints == next_stage: #checks if a speed up is required self.stage += 1 #speed up + 1 self.virtualpoints = 0 #resets virtual points self.world.set_speed(speed+0.01*self.stage) #update of the global speed if self.misses == self.button.life_points: #checks if you are dead self.world.dead = True #game over label #sets the global dead to True self.GameOver = label(frame = self.labels,\ pos=self.me.pos,\ text='Game Over',\ xoffset=0,\ yoffset=100,\ line = False,\ height = 40) break #quits the while true: loop ######### class brick_effect(object): #standard brick used for the screen effects def __init__(self,pos,frame,color): self.bricke = box(width = 1,\ height = 1,\ length = 1,\ pos = pos,\ material = materials.emissive,\ color = color,\ frame = frame,\ opacity = 1.,\ twosided = False) def set_o_s_p(self,i,size,pos): #set size, opacity, pos function self.bricke.opacity = i self.bricke.size = size self.bricke.pos = pos def set_o(self,i): #set opacity self.bricke.opacity = i def move(self,vector):# move the brick self.bricke.pos = self.bricke.pos + vector/80 ######### class screen_effect(object): #single screen effect def __init__(self, xoffset, yoffset, world): self.effect = [] #list of bricks self.effect_frame = frame() #frame for the bricks self.move = [] #list of movement vectors for the bricks, can be implemented in the self.effect list too self.timer = 0 #timer for the lifetime self.xoffset = xoffset #unused self.yoffset = yoffset #unused self.world = world #reference to the world def build(self): # first time buildup for i in range (particle_count): #creates particle_count bricks and sets a movement vector for them self.effect.append(brick_effect(vector(0,0,-30), self.effect_frame, color = self.world.stage[0].color)) self.effect[i].set_o_s_p(.1,(.5,.5,.5),vector(0,0,-2*L)) self.move.append(vector(randrange(-4,4),randrange(-4,4),randrange(-4,4))) ######### class effect_manager(threading.Thread,object): #manages the effects def __init__(self, offset, timer, world, me): threading.Thread.__init__(self) self.effect_list = [] self.offset = offset self.timer = timer self.world = world #references to world and me self.me = me self.set = 1 self.counter = 0 #internal couters self.wait = 0 self.superstreak = 0 def run(self): while True: sleep(0.02) if self.world.dead == True: for i in range(self.counter): self.effect_list[0].effect_frame.visible = False self.effect_list.remove(self.effect_list[0]) self.counter = 0 break if (self.world.stage[0].segment.pos.z > self.me.me.z) and (self.set == 1) and (self.world.stage[0].wall[self.world.stage[0].dead_brick].brickw.y-1.18 > self.me.me.y > self.world.stage[0].wall[self.world.stage[0].dead_brick].brickw.y-1.82) and (self.world.stage[0].wall[self.world.stage[0].dead_brick].brickw.x-1.18 > self.me.me.x > self.world.stage[0].wall[self.world.stage[0].dead_brick].brickw.x-1.82): self.set = 0 self.effect_list.append(screen_effect(self.offset, self.offset, self.world)) self.effect_list[-1].build() self.counter +=1 if len(self.effect_list) > 0: for i in range(self.counter): self.ii = i if self.effect_list[self.ii-1].timer <= L*60: for i in range(particle_count): self.effect_list[self.ii-1].effect[i].move(self.effect_list[self.ii-1].move[i]) self.effect_list[self.ii-1].effect[i].set_o(0.1*self.me.streak/2) self.effect_list[self.ii-1].timer +=1 for i in range(self.counter): if self.effect_list[0].timer > L*60: self.effect_list[0].effect_frame.visible = False self.effect_list.remove(self.effect_list[0]) self.counter -= 1 self.wait += 1 if self.wait >= 10: self.set = 1 self.wait = 0 ######### class world(threading.Thread, object): def __init__(self): threading.Thread.__init__(self) self.stage = [] self.step = 3.364 self.speed = speed self.dead = False def set_speed(self, speed): self.speed = speed def dead(self,input): if input == 1: self.dead = True def run(self): for i in range(5): self.stage.append(wall_type_1(i)) while True: rate (50) for i in self.stage: i.move(self.speed) if self.stage[0].segment.z > 20: i.tunnel.visible = False i.wallf.visible = False self.stage.remove(self.stage[0]) del i me.reset() self.stage.append(wall_type_1(self.step)) if self.dead == True: break for i in range(len(self.stage)): self.stage[0].tunnel.visible = False self.stage[0].wallf.visible = False self.stage.remove(self.stage[0]) ###### class brickr(object): def __init__(self,size,pos,frame,color): self.brickr = box(size = size,\ pos = pos,\ material = materials.emissive,\ color = color,\ frame = frame,\ opacity = 1.,\ twosided = False) ###### class rotator(threading.Thread,object): def __init__(self, pos, me): threading.Thread.__init__(self) self.step_1 = frame() self.step_2 = frame() self.step_3 = frame() self.all = frame() self.color = color.hsv_to_rgb((random(),1,1)) self.list = [] self.rotation = [] self.me = me self.step_1.pos = pos self.step_2.pos = pos self.step_3.pos = pos self.step_1.frame = self.all self.step_2.frame = self.all self.step_3.frame = self.all def run(self): self.list.append(brickr((1.,1.,4),(randrange(-3, 4),randrange(-3, 4),randrange(-3, 4)), self.step_1, self.color)) self.list.append(brickr((1.,4,1.),(randrange(-3, 4),randrange(-3, 4),randrange(-3, 4)), self.step_1, self.color)) self.list.append(brickr((1.,1.,4),(randrange(-3, 4),randrange(-3, 4),randrange(-3, 4)), self.step_1, self.color)) self.list.append(brickr((4,1.,1.),(randrange(-3, 4),randrange(-3, 4),randrange(-3, 4)), self.step_1, self.color)) self.color = color.hsv_to_rgb((random(),1,1)) self.list.append(brickr((1.,1.,.4),(randrange(-2, 3),randrange(-2, 3),randrange(-2, 3)), self.step_2, self.color)) self.list.append(brickr((1.,.4,1.),(randrange(-2, 3),randrange(-2, 3),randrange(-2, 3)), self.step_2, self.color)) self.list.append(brickr((1.,1.,.4),(randrange(-2, 3),randrange(-2, 3),randrange(-2, 3)), self.step_2, self.color)) self.list.append(brickr((.4,1.,1.),(randrange(-2, 3),randrange(-2, 3),randrange(-2, 3)), self.step_2, self.color)) self.color = color.hsv_to_rgb((random(),1,1)) self.list.append(brickr((1.,1.,.4),(randrange(-5, 6),randrange(-5, 6),randrange(-5, 6)), self.step_3, self.color)) self.list.append(brickr((1.,.4,1.),(randrange(-5, 6),randrange(-5, 6),randrange(-5, 6)), self.step_3, self.color)) self.list.append(brickr((1.,1.,.4),(randrange(-5, 6),randrange(-5, 6),randrange(-5, 6)), self.step_3, self.color)) self.list.append(brickr((.4,1.,1.),(randrange(-5, 6),randrange(-5, 6),randrange(-5, 6)), self.step_3, self.color)) while True: sleep(0.02) self.step_1.rotate(angle=radians(0.7*self.me.streak/5), axis = (0,1,0)) self.step_2.rotate(angle=radians(-1*self.me.streak/5), axis = (1,1,0)) self.step_3.rotate(angle=radians(-2*self.me.streak/5), axis = (-1,1,-1)) self.all.rotate(angle=radians(0.1*self.me.streak/5), axis = (0,0,1), origin = (0,0,-10)) for i in range(len(self.list)): self.rotation.append(vector(randrange(-1,2), randrange(-1,2), randrange(-1,2))) self.list[i].brickr.rotate(angle=radians(-1), axis = (self.rotation[i])) ###### class buttons(threading.Thread,object): def __init__(self): threading.Thread.__init__(self) self.speed = 1 self.life_points = 1 self.startg = 0 self.intro = button(display = c.display, text = 'Bitflight', width=105, height=40,pos = (-40, 80)) self.life_plus = button(display = c.display, pos=(-40,40), width=105, height=30, text='+', action=lambda: self.set_lifepoints(1)) self.life_minus = button(display = c.display, pos=(-40,-20), width=105, height=30, text='-', action=lambda: self.set_lifepoints(-1)) self.life_text = button(display = c.display, pos=(-40,10), width=105, height=30, text='Lifepoints: 1') # self.speed_plus = button(display = c.display, pos=(65,40), width=105, height=30, text='+', action=lambda: self.set_speed(1)) # self.speed_minus = button(display = c.display, pos=(65,-20), width=105, height=30, text='-', action=lambda: self.set_speed(-1)) # self.speed_text = button(display = c.display, pos=(65,10), width=105, height=30, text='Speed: 1') self.play_button = button(display = c.display, pos=(-40,-50), width=105, height=40, text='Play', action=lambda: self.play()) def set_lifepoints(self, i): self.life_points += i if self.life_points < 1: self.life_points = 1 if self.life_points > 30: self.life_points = 30 self.life_text.text = 'Lifepoints: '+str(self.life_points) # def set_speed(self, i): # self.speed += i # if self.speed < 1: # self.speed = 1 # if self.speed > 3: # self.speed = 3 # self.speed_text.text = 'Speed: '+str(self.speed) def play(self): scene1.visible = True self.startg = 1 run_game() def run(self): while self.startg == 0: sleep(0.02) c.interact() #Initialisierung scene1 = display(title='Bitflight',\ width=500,\ height=500,\ center=(0,0,0),\ forward = (0, 0, -1),\ autoscale = False,\ userzoom = False,\ userspin = False,\ fullscreen = True) c = controls() scene1.fullscreen = True scene1.visible = False L = 4 particle_count = 30 start = 0 speed = 0.2 next_stage = 10 w = world() b = buttons() me = Me(w,b) r1 = rotator((-10,-10,-10), me) r2 = rotator((-10,10,-10), me) r3 = rotator((10,-10,-10), me) r4 = rotator((10,10,-10), me) effects = effect_manager(L*2, 0, w, me) startlabel = label(pos=me.me.pos,\ text='Press Space',\ xoffset=0,\ yoffset=100,\ line = False,\ height = 40) b.start() def run_game(): global start while start == 0: sleep(0.02) if scene1.kb.keys != 0: s = scene1.kb.getkey() if s == ' ': startlabel.visible = False w.start() me.start() effects.start() r2.start() r1.start() r3.start() r4.start() start = 1