class Minimap(object): def __init__(self, lrtb, track_img, handle_img, col_dct, cars, player_car): self.lrtb = lrtb self.minimap = OnscreenImage(track_img, pos=(-.25, 1, .25), scale=.2, parent=eng.base.a2dBottomRight) self.minimap.setTransparency(True) self.minimap.setAlphaScale(.64) self.car_handles = {} cars = cars[:] cars.remove(player_car) cars += [player_car] for car_name in cars: scale = .015 if car_name == player_car else .01 self.car_handles[car_name] = OnscreenImage( handle_img, pos=(-.25, 1, .25), scale=scale, parent=eng.base.a2dBottomRight) col = col_dct[car_name] self.car_handles[car_name].set_color_scale(col) map(lambda car: car.setTransparency(True), self.car_handles.values()) self.width = self.minimap.getScale()[0] * 2.0 self.height = self.minimap.getScale()[2] * 2.0 center_x, center_y = self.minimap.getX(), self.minimap.getZ() self.left_img = center_x - self.width / 2.0 self.bottom_img = center_y - self.height / 2.0 def update(self, car_info): left, right, top, bottom = self.lrtb for car_i in car_info: car_name, car_pos = car_i pos_x_norm = (car_pos.getX() - left) / (right - left) pos_y_norm = (car_pos.getY() - bottom) / (top - bottom) pos_x = self.left_img + pos_x_norm * self.width pos_y = self.bottom_img + pos_y_norm * self.height self.car_handles[car_name].set_pos(pos_x, 1, pos_y) def destroy(self): des = lambda wdg: wdg.destroy() map(des, [self.minimap] + self.car_handles.values())
class World(DirectObject): def __init__(self): self.start = False self.mainScreen = OnscreenImage(image = 'mainScreen.png') #self.mainScreen.setScale(1.25) self.accept("mouse1", self.begin) def begin(self): if self.start == False: self.start = True self.mainScreen.destroy() self.__init__1() def __init__1(self): #load physics base.enableParticles() #create a traverser base.cTrav = CollisionTraverser() self.cevent = CollisionHandlerEvent() self.cevent.addInPattern('into-%in') self.cevent.addOutPattern('outof-%in') #load all the models self.w_terrain = Terrain() self.p_bike = PlayerBike(base.cTrav) #disable mouse base.disableMouse() self.dead = False self.deadCount = 0 taskMgr.add(self.gameOverDead, 'deadTask') self.win = False self.winCount = 0 taskMgr.add(self.gameOverWin, 'winTask') #load and play background sound backgroundSound = base.loader.loadSfx('Modern_Battlefield.mp3') backgroundSound.setLoop(True) backgroundSound.play() #parent the camera to the player bike and offset the initial location base.camera.reparentTo(self.p_bike.bike) base.camera.setZ(6) base.camera.setP(-8) base.camera.setY(-32) #set up accept tasks #close the game self.accept("escape", sys.exit) #handle movement self.accept("arrow_up", self.p_bike.setDirection, ["forward", 1]) self.accept("arrow_right", self.p_bike.setDirection, ["right", 1]) self.accept("arrow_left", self.p_bike.setDirection, ["left", 1]) self.accept("arrow_up-up", self.p_bike.setDirection, ["forward", 0]) self.accept("arrow_right-up", self.p_bike.setDirection, ["right", 0]) self.accept("arrow_left-up", self.p_bike.setDirection, ["left", 0]) #handle shooting #self.accept("space", self.p_bike.setShoot, [1]) #self.accept("space-up", self.p_bike.setShoot, [0]) self.accept("z", self.p_bike.setShoot, [1]) self.accept("z-up", self.p_bike.setShoot, [0]) #powerup collisions self.accept("p_bike-powerup1", self.powerupCollision) self.accept("p_bike-powerup2", self.powerupCollision) self.accept("p_bike-powerup3", self.powerupCollision) self.accept("p_bike-powerup4", self.powerupCollision) self.accept("p_bike-powerup5", self.powerupCollision) #bullet collision with player self.accept("p_bike-bullet", self.bulletCollision) self.accept("e_bike-bullet", self.bulletCollision) #setup basic environment lighting self.ambientLight = AmbientLight("ambientLight") self.ambientLight.setColor((.25, .25, .25, 1)) self.ambientLightNP = render.attachNewNode(self.ambientLight) render.setLight(self.ambientLightNP) render.setShaderAuto() self.playerHealth = OnscreenImage(image = 'PlayerHealthBar.png') self.playerHealth.setX(-1) self.playerHealth.setZ(-1.95) #enemy health self.enemyHealth = OnscreenImage(image = 'EnemyHealthBar.png') self.enemyHealth.setX(1) self.enemyHealth.setZ(-1.95) self.initAI() self.e_bikes = [self.addEnemy()] base.cTrav.addCollider(self.p_bike.cNodePath1, self.e_bikes[0].cevent) def gameOverDead(self, task): if self.dead == True: self.deadCount += 1 if self.deadCount > 200: self.gameOver = OnscreenImage(image = 'gameOver.png') self.gameOver.setScale(1.35) return Task.cont def gameOverWin(self, task): if self.win == True: self.winCount += 1 if self.winCount > 200: self.gameOverWin = OnscreenImage(image = 'win.png') self.gameOverWin.setScale(1.35) return Task.cont def powerupCollision(self, cEntry): #check powerup1 if cEntry.getIntoNodePath() == self.w_terrain.cPowerNode1Path: self.w_terrain.powerUp1 = False self.p_bike.invin = True #print('I WIN') #check powerup2 elif cEntry.getIntoNodePath() == self.w_terrain.cPowerNode2Path: self.w_terrain.powerUp2 = False self.p_bike.shotgun = True self.p_bike.p_up_timer = 0 #check powerup3 elif cEntry.getIntoNodePath() == self.w_terrain.cPowerNode3Path: self.w_terrain.powerUp3 = False self.p_bike.shotgun = True self.p_bike.p_up_timer = 0 #check power4 elif cEntry.getIntoNodePath() == self.w_terrain.cPowerNode4Path: self.w_terrain.powerUp4 = False self.p_bike.health_up = True #check powerup5 elif cEntry.getIntoNodePath() == self.w_terrain.cPowerNode5Path: self.w_terrain.powerUp5 = False self.p_bike.health_up = True cEntry.getIntoNodePath().remove() def bulletCollision(self, cEntry): #check which bike is being hit if self.p_bike.invin == False and (cEntry.getFromNodePath() == self.p_bike.cNodePath1 or cEntry.getFromNodePath() == self.p_bike.cNodePath1 or cEntry.getFromNodePath() == self.p_bike.cNodePath3): #print('player bike!') self.p_bike.hp -= 1 self.playerHealth.setX(self.playerHealth.getX() - .1) #print('player hp:', self.p_bike.hp) if self.p_bike.hp <= 0: #kill player bike and reset camera taskMgr.remove("moveTask") taskMgr.remove("bulletTask") taskMgr.remove("shootTask") taskMgr.remove("powerupTask") x = base.camera.getX() + self.p_bike.bike.getX() y = base.camera.getY() + self.p_bike.bike.getY() h = self.p_bike.bike.getH() angle = deg2Rad(self.p_bike.bike.getH()) dy = -math.cos(angle) dx = math.sin(angle) dx = -dx * 32 dy = -dy * 32 base.camera.reparentTo(render) base.camera.setPos(0,0,0) base.camera.setPosHpr( self.p_bike.bike.getX() - dx, self.p_bike.bike.getY() - dy, 7, self.p_bike.bike.getH(), -8, 0) x = self.p_bike.bike.getX() y = self.p_bike.bike.getY() z = self.p_bike.bike.getZ() h = self.p_bike.bike.getH() self.p_bike.bike.delete() self.death_player = Actor("moto2_deadActor.egg", {"death":"moto2_deadAnim.egg"}) self.death_player.reparentTo(render) self.death_player.setPos(x,y,z) self.death_player.setH(h) self.animcontrol = self.death_player.getAnimControl('death') self.death_player.play("death") self.dead = True #UNCOMMENT WHEN ENEMY BIKES ARE FIXED else: for enemy in self.e_bikes: #print('in enemy list') #print(cEntry.getFromNodePath()) #print(cEntry.getFromNodePath().getParent()) #print(cEntry.getFromNodePath().getParent()) #print(enemy.cNodePath) #print(cEntry.getIntoNodePath()) #print(cEntry.getIntoNodePath().getParent()) if cEntry.getFromNodePath() == enemy.cNodePath1 or cEntry.getFromNodePath() == enemy.cNodePath2 or cEntry.getFromNodePath() == enemy.cNodePath3: #print('enemy hit') enemy.hp -= 1 self.enemyHealth.setX(self.enemyHealth.getX() + .1) #print('enemy hp:', enemy.hp) if enemy.hp <= 0: #print('Game Over. You Win!') #kill enemy bike x = enemy.cNodePath.getParent().getX() y = enemy.cNodePath.getParent().getY() z = enemy.cNodePath.getParent().getZ() h = enemy.cNodePath.getParent().getH() #print(x,y,z,h) enemy.cNodePath.getParent().remove() self.death_enemy = Actor("moto1_deadActor.egg", {"death":"moto1_deadAnim.egg"}) self.death_enemy.reparentTo(render) self.death_enemy.setPos(x,y,z) self.death_enemy.setH(h) self.death_enemy.play("death") self.win = True break #destroy the bullet for i in range(len(self.p_bike.bullet.bulletList)): if cEntry.getIntoNodePath().getParent() == self.p_bike.bullet.bulletList[i]: #print('erased') self.p_bike.bullet.bulletTime.remove(self.p_bike.bullet.bulletTime[i]) self.p_bike.bullet.bulletList.remove(self.p_bike.bullet.bulletList[i]) cEntry.getIntoNodePath().getParent().remove() break #UNCOMMENT WHEN ENEMY BIKES ARE FIXED #cycle through the enemy bullets for enemy in self.e_bikes: for i in range(len(enemy.bullet.bulletList)): if cEntry.getIntoNodePath().getParent() == enemy.bullet.bulletList[i]: #print('erased') enemy.bullet.bulletTime.remove(enemy.bullet.bulletTime[i]) enemy.bullet.bulletList.remove(enemy.bullet.bulletList[i]) cEntry.getIntoNodePath().getParent().remove() break def initAI(self): self.AIworld = AIWorld(render) #self.AIworld.addObstacle(self.w_terrain.wall_terrain) #self.AIworld.addObstacle(self.w_terrain.cNodePathWall1) #self.AIworld.addObstacle(self.w_terrain.cNodePathWall2) #self.AIworld.addObstacle(self.w_terrain.cNodePathWall3) #self.AIworld.addObstacle(self.w_terrain.cNodePathWall4) #self.AIworld.addObstacle(self.w_terrain.bounds) #AI World update taskMgr.add(self.AIUpdate,"AIUpdate") def AIUpdate(self, task): self.AIworld.update() for i in self.e_bikes: i.update() i.bike.setHpr(i.bike.getH(), 0, i.bike.getR()) #i.bike.setZ(max(0.0, i.bike.getZ())) #i.bike.setZ(0.0) #print i.bike.getHpr() return Task.cont def addEnemy(self): enemy = EnemyBike(base.cTrav, self.cevent) enemy.target = self.p_bike enemy.setMode('scan') self.AIworld.addAiChar(enemy.AIchar) base.cTrav.addCollider(self.p_bike.cNodePath1, enemy.cevent) return enemy