class Game(ShowBase): def __init__(self): ShowBase.__init__(self) self.disableMouse() properties = WindowProperties() properties.setSize(1000, 750) self.win.requestProperties(properties) self.exitFunc = self.cleanup mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) render.setLight(self.ambientLightNodePath) render.setShaderAuto() self.environment = loader.loadModel("Models/Misc/environment") self.environment.reparentTo(render) self.camera.setPos(0, 0, 32) self.camera.setP(-90) self.keyMap = { "up" : False, "down" : False, "left" : False, "right" : False, "shoot" : False } self.accept("w", self.updateKeyMap, ["up", True]) self.accept("w-up", self.updateKeyMap, ["up", False]) self.accept("s", self.updateKeyMap, ["down", True]) self.accept("s-up", self.updateKeyMap, ["down", False]) self.accept("a", self.updateKeyMap, ["left", True]) self.accept("a-up", self.updateKeyMap, ["left", False]) self.accept("d", self.updateKeyMap, ["right", True]) self.accept("d-up", self.updateKeyMap, ["right", False]) self.accept("mouse1", self.updateKeyMap, ["shoot", True]) self.accept("mouse1-up", self.updateKeyMap, ["shoot", False]) self.pusher = CollisionHandlerPusher() self.cTrav = CollisionTraverser() self.pusher.setHorizontal(True) self.pusher.add_in_pattern("%fn-into-%in") self.accept("trapEnemy-into-wall", self.stopTrap) self.accept("trapEnemy-into-trapEnemy", self.stopTrap) self.accept("trapEnemy-into-player", self.trapHitsSomething) self.accept("trapEnemy-into-walkingEnemy", self.trapHitsSomething) wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(8.0) wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(-8.0) wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setX(8.0) wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setX(-8.0) self.updateTask = taskMgr.add(self.update, "update") self.player = None self.enemies = [] self.trapEnemies = [] self.deadEnemies = [] self.spawnPoints = [] numPointsPerWall = 5 for i in range(numPointsPerWall): coord = 7.0/numPointsPerWall + 0.5 self.spawnPoints.append(Vec3(-7.0, coord, 0)) self.spawnPoints.append(Vec3(7.0, coord, 0)) self.spawnPoints.append(Vec3(coord, -7.0, 0)) self.spawnPoints.append(Vec3(coord, 7.0, 0)) self.initialSpawnInterval = 1.0 self.minimumSpawnInterval = 0.2 self.spawnInterval = self.initialSpawnInterval self.spawnTimer = self.spawnInterval self.maxEnemies = 2 self.maximumMaxEnemies = 20 self.numTrapsPerSide = 2 self.difficultyInterval = 5.0 self.difficultyTimer = self.difficultyInterval self.enemySpawnSound = loader.loadSfx("Sounds/enemySpawn.ogg") self.gameOverScreen = DirectDialog(frameSize = (-0.7, 0.7, -0.7, 0.7), fadeScreen = 0.4, relief = DGG.FLAT, frameTexture = "UI/stoneFrame.png") self.gameOverScreen.hide() self.font = loader.loadFont("Fonts/Wbxkomik.ttf") buttonImages = ( loader.loadTexture("UI/UIButton.png"), loader.loadTexture("UI/UIButtonPressed.png"), loader.loadTexture("UI/UIButtonHighlighted.png"), loader.loadTexture("UI/UIButtonDisabled.png") ) label = DirectLabel(text = "Game Over!", parent = self.gameOverScreen, scale = 0.1, pos = (0, 0, 0.2), text_font = self.font, relief = None) self.finalScoreLabel = DirectLabel(text = "", parent = self.gameOverScreen, scale = 0.07, pos = (0, 0, 0), text_font = self.font, relief = None) btn = DirectButton(text = "Restart", command = self.startGame, pos = (-0.3, 0, -0.2), parent = self.gameOverScreen, scale = 0.07, text_font = self.font, clickSound = loader.loadSfx("Sounds/UIClick.ogg"), frameTexture = buttonImages, frameSize = (-4, 4, -1, 1), text_scale = 0.75, relief = DGG.FLAT, text_pos = (0, -0.2)) btn.setTransparency(True) btn = DirectButton(text = "Quit", command = self.quit, pos = (0.3, 0, -0.2), parent = self.gameOverScreen, scale = 0.07, text_font = self.font, clickSound = loader.loadSfx("Sounds/UIClick.ogg"), frameTexture = buttonImages, frameSize = (-4, 4, -1, 1), text_scale = 0.75, relief = DGG.FLAT, text_pos = (0, -0.2)) btn.setTransparency(True) self.titleMenuBackdrop = DirectFrame(frameColor = (0, 0, 0, 1), frameSize = (-1, 1, -1, 1), parent = render2d) self.titleMenu = DirectFrame(frameColor = (1, 1, 1, 0)) title = DirectLabel(text = "Panda-chan", scale = 0.1, pos = (0, 0, 0.9), parent = self.titleMenu, relief = None, text_font = self.font, text_fg = (1, 1, 1, 1)) title2 = DirectLabel(text = "and the", scale = 0.07, pos = (0, 0, 0.79), parent = self.titleMenu, text_font = self.font, frameColor = (0.5, 0.5, 0.5, 1)) title3 = DirectLabel(text = "Endless Horde", scale = 0.125, pos = (0, 0, 0.65), parent = self.titleMenu, relief = None, text_font = self.font, text_fg = (1, 1, 1, 1)) btn = DirectButton(text = "Start Game", command = self.startGame, pos = (0, 0, 0.2), parent = self.titleMenu, scale = 0.1, text_font = self.font, clickSound = loader.loadSfx("Sounds/UIClick.ogg"), frameTexture = buttonImages, frameSize = (-4, 4, -1, 1), text_scale = 0.75, relief = DGG.FLAT, text_pos = (0, -0.2)) btn.setTransparency(True) btn = DirectButton(text = "Quit", command = self.quit, pos = (0, 0, -0.2), parent = self.titleMenu, scale = 0.1, text_font = self.font, clickSound = loader.loadSfx("Sounds/UIClick.ogg"), frameTexture = buttonImages, frameSize = (-4, 4, -1, 1), text_scale = 0.75, relief = DGG.FLAT, text_pos = (0, -0.2)) btn.setTransparency(True) music = loader.loadMusic("Music/Defending-the-Princess-Haunted.ogg") music.setLoop(True) music.setVolume(0.075) music.play() def startGame(self): self.titleMenu.hide() self.titleMenuBackdrop.hide() self.gameOverScreen.hide() self.cleanup() self.player = Player() self.maxEnemies = 2 self.spawnInterval = self.initialSpawnInterval self.difficultyTimer = self.difficultyInterval sideTrapSlots = [ [], [], [], [] ] trapSlotDistance = 0.4 slotPos = -8 + trapSlotDistance while slotPos < 8: if abs(slotPos) > 1.0: sideTrapSlots[0].append(slotPos) sideTrapSlots[1].append(slotPos) sideTrapSlots[2].append(slotPos) sideTrapSlots[3].append(slotPos) slotPos += trapSlotDistance for i in range(self.numTrapsPerSide): slot = sideTrapSlots[0].pop(random.randint(0, len(sideTrapSlots[0])-1)) trap = TrapEnemy(Vec3(slot, 7.0, 0)) self.trapEnemies.append(trap) slot = sideTrapSlots[1].pop(random.randint(0, len(sideTrapSlots[1])-1)) trap = TrapEnemy(Vec3(slot, -7.0, 0)) self.trapEnemies.append(trap) slot = sideTrapSlots[2].pop(random.randint(0, len(sideTrapSlots[2])-1)) trap = TrapEnemy(Vec3(7.0, slot, 0)) trap.moveInX = True self.trapEnemies.append(trap) slot = sideTrapSlots[3].pop(random.randint(0, len(sideTrapSlots[3])-1)) trap = TrapEnemy(Vec3(-7.0, slot, 0)) trap.moveInX = True self.trapEnemies.append(trap) def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState def spawnEnemy(self): if len(self.enemies) < self.maxEnemies: spawnPoint = random.choice(self.spawnPoints) newEnemy = WalkingEnemy(spawnPoint) self.enemies.append(newEnemy) self.enemySpawnSound.play() def stopTrap(self, entry): collider = entry.getFromNodePath() if collider.hasPythonTag("owner"): trap = collider.getPythonTag("owner") trap.moveDirection = 0 trap.ignorePlayer = False trap.movementSound.stop() trap.stopSound.play() def trapHitsSomething(self, entry): collider = entry.getFromNodePath() if collider.hasPythonTag("owner"): trap = collider.getPythonTag("owner") if trap.moveDirection == 0: return collider = entry.getIntoNodePath() if collider.hasPythonTag("owner"): obj = collider.getPythonTag("owner") if isinstance(obj, Player): if not trap.ignorePlayer: obj.alterHealth(-1) trap.ignorePlayer = True else: obj.alterHealth(-10) trap.impactSound.play() def update(self, task): dt = globalClock.getDt() if self.player is not None: if self.player.health > 0: self.player.update(self.keyMap, dt) self.spawnTimer -= dt if self.spawnTimer <= 0: self.spawnTimer = self.spawnInterval self.spawnEnemy() [enemy.update(self.player, dt) for enemy in self.enemies] [trap.update(self.player, dt) for trap in self.trapEnemies] newlyDeadEnemies = [enemy for enemy in self.enemies if enemy.health <= 0] self.enemies = [enemy for enemy in self.enemies if enemy.health > 0] for enemy in newlyDeadEnemies: enemy.collider.removeNode() enemy.actor.play("die") self.player.score += enemy.scoreValue if len(newlyDeadEnemies) > 0: self.player.updateScore() self.deadEnemies += newlyDeadEnemies enemiesAnimatingDeaths = [] for enemy in self.deadEnemies: deathAnimControl = enemy.actor.getAnimControl("die") if deathAnimControl is None or not deathAnimControl.isPlaying(): enemy.cleanup() else: enemiesAnimatingDeaths.append(enemy) self.deadEnemies = enemiesAnimatingDeaths self.difficultyTimer -= dt if self.difficultyTimer <= 0: self.difficultyTimer = self.difficultyInterval if self.maxEnemies < self.maximumMaxEnemies: self.maxEnemies += 1 if self.spawnInterval > self.minimumSpawnInterval: self.spawnInterval -= 0.1 else: if self.gameOverScreen.isHidden(): self.gameOverScreen.show() self.finalScoreLabel["text"] = "Final score: " + str(self.player.score) self.finalScoreLabel.setText() return task.cont def cleanup(self): for enemy in self.enemies: enemy.cleanup() self.enemies = [] for enemy in self.deadEnemies: enemy.cleanup() self.deadEnemies = [] for trap in self.trapEnemies: trap.cleanup() self.trapEnemies = [] if self.player is not None: self.player.cleanup() self.player = None def quit(self): self.cleanup() base.userExit()
class Game(ShowBase): def __init__(self): ShowBase.__init__(self) self.disableMouse() properties = WindowProperties() properties.setSize(1000, 750) self.win.requestProperties(properties) self.exitFunc = self.cleanup mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) render.setLight(self.ambientLightNodePath) render.setShaderAuto() self.environment = loader.loadModel("Models/Misc/environment") self.environment.reparentTo(render) self.camera.setPos(0, 0, 32) self.camera.setP(-90) self.keyMap = { "up": False, "down": False, "left": False, "right": False, "shoot": False } self.accept("w", self.updateKeyMap, ["up", True]) self.accept("w-up", self.updateKeyMap, ["up", False]) self.accept("s", self.updateKeyMap, ["down", True]) self.accept("s-up", self.updateKeyMap, ["down", False]) self.accept("a", self.updateKeyMap, ["left", True]) self.accept("a-up", self.updateKeyMap, ["left", False]) self.accept("d", self.updateKeyMap, ["right", True]) self.accept("d-up", self.updateKeyMap, ["right", False]) self.accept("mouse1", self.updateKeyMap, ["shoot", True]) self.accept("mouse1-up", self.updateKeyMap, ["shoot", False]) self.pusher = CollisionHandlerPusher() self.cTrav = CollisionTraverser() self.pusher.setHorizontal(True) self.pusher.add_in_pattern("%fn-into-%in") self.accept("trapEnemy-into-wall", self.stopTrap) self.accept("trapEnemy-into-trapEnemy", self.stopTrap) self.accept("trapEnemy-into-player", self.trapHitsSomething) self.accept("trapEnemy-into-walkingEnemy", self.trapHitsSomething) wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(8.0) wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(-8.0) wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setX(8.0) wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setX(-8.0) self.updateTask = taskMgr.add(self.update, "update") self.player = None self.enemies = [] self.trapEnemies = [] self.deadEnemies = [] self.spawnPoints = [] numPointsPerWall = 5 for i in range(numPointsPerWall): coord = 7.0 / numPointsPerWall + 0.5 self.spawnPoints.append(Vec3(-7.0, coord, 0)) self.spawnPoints.append(Vec3(7.0, coord, 0)) self.spawnPoints.append(Vec3(coord, -7.0, 0)) self.spawnPoints.append(Vec3(coord, 7.0, 0)) self.initialSpawnInterval = 1.0 self.minimumSpawnInterval = 0.2 self.spawnInterval = self.initialSpawnInterval self.spawnTimer = self.spawnInterval self.maxEnemies = 2 self.maximumMaxEnemies = 20 self.numTrapsPerSide = 2 self.difficultyInterval = 5.0 self.difficultyTimer = self.difficultyInterval self.startGame() def startGame(self): self.cleanup() self.player = Player() self.maxEnemies = 2 self.spawnInterval = self.initialSpawnInterval self.difficultyTimer = self.difficultyInterval sideTrapSlots = [[], [], [], []] trapSlotDistance = 0.4 slotPos = -8 + trapSlotDistance while slotPos < 8: if abs(slotPos) > 1.0: sideTrapSlots[0].append(slotPos) sideTrapSlots[1].append(slotPos) sideTrapSlots[2].append(slotPos) sideTrapSlots[3].append(slotPos) slotPos += trapSlotDistance for i in range(self.numTrapsPerSide): slot = sideTrapSlots[0].pop( random.randint(0, len(sideTrapSlots[0]) - 1)) trap = TrapEnemy(Vec3(slot, 7.0, 0)) self.trapEnemies.append(trap) slot = sideTrapSlots[1].pop( random.randint(0, len(sideTrapSlots[1]) - 1)) trap = TrapEnemy(Vec3(slot, -7.0, 0)) self.trapEnemies.append(trap) slot = sideTrapSlots[2].pop( random.randint(0, len(sideTrapSlots[2]) - 1)) trap = TrapEnemy(Vec3(7.0, slot, 0)) trap.moveInX = True self.trapEnemies.append(trap) slot = sideTrapSlots[3].pop( random.randint(0, len(sideTrapSlots[3]) - 1)) trap = TrapEnemy(Vec3(-7.0, slot, 0)) trap.moveInX = True self.trapEnemies.append(trap) def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState def spawnEnemy(self): if len(self.enemies) < self.maxEnemies: spawnPoint = random.choice(self.spawnPoints) newEnemy = WalkingEnemy(spawnPoint) self.enemies.append(newEnemy) def stopTrap(self, entry): collider = entry.getFromNodePath() if collider.hasPythonTag("owner"): trap = collider.getPythonTag("owner") trap.moveDirection = 0 trap.ignorePlayer = False def trapHitsSomething(self, entry): collider = entry.getFromNodePath() if collider.hasPythonTag("owner"): trap = collider.getPythonTag("owner") if trap.moveDirection == 0: return collider = entry.getIntoNodePath() if collider.hasPythonTag("owner"): obj = collider.getPythonTag("owner") if isinstance(obj, Player): if not trap.ignorePlayer: obj.alterHealth(-1) trap.ignorePlayer = True else: obj.alterHealth(-10) def update(self, task): dt = globalClock.getDt() if self.player is not None: if self.player.health > 0: self.player.update(self.keyMap, dt) self.spawnTimer -= dt if self.spawnTimer <= 0: self.spawnTimer = self.spawnInterval self.spawnEnemy() [enemy.update(self.player, dt) for enemy in self.enemies] [trap.update(self.player, dt) for trap in self.trapEnemies] newlyDeadEnemies = [ enemy for enemy in self.enemies if enemy.health <= 0 ] self.enemies = [ enemy for enemy in self.enemies if enemy.health > 0 ] for enemy in newlyDeadEnemies: enemy.collider.removeNode() enemy.actor.play("die") self.player.score += enemy.scoreValue if len(newlyDeadEnemies) > 0: self.player.updateScore() self.deadEnemies += newlyDeadEnemies enemiesAnimatingDeaths = [] for enemy in self.deadEnemies: deathAnimControl = enemy.actor.getAnimControl("die") if deathAnimControl is None or not deathAnimControl.isPlaying( ): enemy.cleanup() else: enemiesAnimatingDeaths.append(enemy) self.deadEnemies = enemiesAnimatingDeaths self.difficultyTimer -= dt if self.difficultyTimer <= 0: self.difficultyTimer = self.difficultyInterval if self.maxEnemies < self.maximumMaxEnemies: self.maxEnemies += 1 if self.spawnInterval > self.minimumSpawnInterval: self.spawnInterval -= 0.1 return task.cont def cleanup(self): for enemy in self.enemies: enemy.cleanup() self.enemies = [] for enemy in self.deadEnemies: enemy.cleanup() self.deadEnemies = [] for trap in self.trapEnemies: trap.cleanup() self.trapEnemies = [] if self.player is not None: self.player.cleanup() self.player = None def quit(self): self.cleanup() base.userExit()
class Game(ShowBase): def __init__(self): ShowBase.__init__(self) properties = WindowProperties() properties.setSize(SCREEN_WIDTH, SCREEN_HEIGHT) self.win.requestProperties(properties) self.disableMouse() self.cTrav = CollisionTraverser() self.pusher = CollisionHandlerPusher() self.pusher.setHorizontal(True) self.scene = Scene(self.render, self.loader, self, 5) self.player = Player("models/panda", {"walk": "models/panda-walk"}, 2, 15, "player", self, Vec3(0, 0, 0), Vec3(180, 0, 0)) self.camera_init() self.control_service() self.updateTask = taskMgr.add(self.update, "update") self.mouse_check_value = 0.7 self.pusher.add_in_pattern("%fn-into-%in") # self.music = self.loader.load_music(MUSIC_START_1_ASSET) # self.music.setLoop(True) # self.music.play() def control_service(self): self.keyMap = { "up": False, "down": False, "left": False, "right": False, "shoot": False, "quit": False } self.accept("w", self.update_key_map, ["up", True]) self.accept("w-up", self.update_key_map, ["up", False]) self.accept("s", self.update_key_map, ["down", True]) self.accept("s-up", self.update_key_map, ["down", False]) self.accept("a", self.update_key_map, ["left", True]) self.accept("a-up", self.update_key_map, ["left", False]) self.accept("d", self.update_key_map, ["right", True]) self.accept("d-up", self.update_key_map, ["right", False]) self.accept("mouse1", self.update_key_map, ["shoot", True]) self.accept("mouse1-up", self.update_key_map, ["shoot", False]) self.accept("escape", self.update_key_map, ["quit", True]) def update_key_map(self, controlName, controlState): self.keyMap[controlName] = controlState def update(self, task): # Get the amount of time since the last update dt = globalClock.getDt() # If any movement keys are pressed, use the above time # to calculate how far to move the character, and apply that. if self.keyMap["up"]: self.player.move(Vec3(0, - dt, 0)) if self.keyMap["down"]: self.player.move(Vec3(0, dt, 0)) if self.keyMap["left"]: self.player.move(Vec3(dt, 0, 0)) if self.keyMap["right"]: self.player.move(Vec3(- dt, 0, 0)) if self.keyMap["quit"]: self.exit_game() if self.mouseWatcherNode.hasMouse(): if self.mouseWatcherNode.getMouseX() < -self.mouse_check_value: self.player.rotate(Vec3(100.0 * dt, 0, 0)) elif self.mouseWatcherNode.getMouseX() > self.mouse_check_value: self.player.rotate(Vec3(-100.0 * dt, 0, 0)) if self.keyMap["shoot"]: self.player.shoot() if not (self.keyMap["up"] or self.keyMap["down"] or self.keyMap["left"] or self.keyMap["right"]): self.player.stop() self.scene.update(dt) return task.cont def camera_init(self): x, y, z = self.player.get_position() self.camera.setPos(Vec3(x, y + 10, z + 17)) self.camera.setHpr(180, -15, 0) self.camera.reparentTo(self.player.actor) def exit_game(self): # De-initialization code goes here! sys.exit()
class Game(ShowBase): def __init__(self): ShowBase.__init__(self) #globalClock.setMode(ClockObject.M_limited) #globalClock.setFrameRate(60) self.disableMouse() Common.initialise() Common.framework = self properties = WindowProperties() properties.setSize(1000, 750) self.win.requestProperties(properties) self.exitFunc = self.cleanup render.setShaderAuto() self.keyMap = { "up" : False, "down" : False, "left" : False, "right" : False, "shoot" : False, "activateItem" : False, "invLeft" : False, "invRight" : False } self.accept("w", self.updateKeyMap, ["up", True]) self.accept("w-up", self.updateKeyMap, ["up", False]) self.accept("s", self.updateKeyMap, ["down", True]) self.accept("s-up", self.updateKeyMap, ["down", False]) self.accept("a", self.updateKeyMap, ["left", True]) self.accept("a-up", self.updateKeyMap, ["left", False]) self.accept("d", self.updateKeyMap, ["right", True]) self.accept("d-up", self.updateKeyMap, ["right", False]) self.accept("mouse1", self.updateKeyMap, ["shoot", True]) self.accept("mouse1-up", self.updateKeyMap, ["shoot", False]) self.accept("wheel_up", self.onMouseWheel, [1]) self.accept("wheel_down", self.onMouseWheel, [-1]) self.accept("space-up", self.interact) self.accept("1", self.selectWeapon, [0]) self.accept("2", self.selectWeapon, [1]) self.accept("f", self.toggleFrameRateMeter) self.showFrameRateMeter = False self.pusher = CollisionHandlerPusher() self.traverser = CollisionTraverser() self.traverser.setRespectPrevTransform(True) self.pusher.setHorizontal(True) self.pusher.add_in_pattern("%fn-into-%in") self.pusher.add_in_pattern("%fn-into") self.pusher.add_again_pattern("%fn-again-into") #self.accept("trapEnemy-into-wall", self.stopTrap) self.accept("projectile-into", self.projectileImpact) self.accept("projectile-again-into", self.projectileImpact) self.accept("playerWallCollider-into-item", self.itemCollected) self.accept("playerWallCollider-into-trigger", self.triggerActivated) self.updateTask = taskMgr.add(self.update, "update") self.player = None self.currentLevel = None self.gameOverScreen = DirectDialog(frameSize = (-0.7, 0.7, -0.7, 0.7), fadeScreen = 0.4, relief = DGG.FLAT) self.gameOverScreen.hide() label = DirectLabel(text = "Game Over!", parent = self.gameOverScreen, scale = 0.1, pos = (0, 0, 0.2), #text_font = self.font, relief = None) self.finalScoreLabel = DirectLabel(text = "", parent = self.gameOverScreen, scale = 0.07, pos = (0, 0, 0), #text_font = self.font, relief = None) btn = DirectButton(text = "Restart", command = self.startGame, pos = (-0.3, 0, -0.2), parent = self.gameOverScreen, scale = 0.07, #text_font = self.font, frameSize = (-4, 4, -1, 1), text_scale = 0.75, relief = DGG.FLAT, text_pos = (0, -0.2)) btn.setTransparency(True) btn = DirectButton(text = "Quit", command = self.quit, pos = (0.3, 0, -0.2), parent = self.gameOverScreen, scale = 0.07, #text_font = self.font, frameSize = (-4, 4, -1, 1), text_scale = 0.75, relief = DGG.FLAT, text_pos = (0, -0.2)) btn.setTransparency(True) render.setShaderAuto() self.startGame() def toggleFrameRateMeter(self): self.showFrameRateMeter = not self.showFrameRateMeter self.setFrameRateMeter(self.showFrameRateMeter) def startGame(self): self.gameOverScreen.hide() self.cleanup() self.player = Player() self.currentLevel = Level("testLevel") def selectWeapon(self, index): if self.player is not None: self.player.setCurrentWeapon(index) def interact(self): if self.player is not None: self.player.interact() def onMouseWheel(self, dir): if self.player is not None: self.player.scrollWeapons(dir) def updateKeyMap(self, controlName, controlState, callback = None): self.keyMap[controlName] = controlState if callback is not None: callback(controlName, controlState) def update(self, task): dt = globalClock.getDt() if self.currentLevel is not None: self.currentLevel.update(self.player, self.keyMap, dt) if self.player is not None and self.player.health <= 0: if self.gameOverScreen.isHidden(): self.gameOverScreen.show() #self.finalScoreLabel["text"] = "Final score: " + str(self.player.score) #self.finalScoreLabel.setText() self.traverser.traverse(render) if self.player is not None and self.player.health > 0: self.player.postTraversalUpdate(dt) return Task.cont def projectileImpact(self, entry): fromNP = entry.getFromNodePath() proj = fromNP.getPythonTag(TAG_OWNER) intoNP = entry.getIntoNodePath() if intoNP.hasPythonTag(TAG_OWNER): intoObj = intoNP.getPythonTag(TAG_OWNER) proj.impact(intoObj) else: proj.impact(None) def itemCollected(self, entry): fromNP = entry.getFromNodePath() player = fromNP.getPythonTag(TAG_OWNER) intoNP = entry.getIntoNodePath() item = intoNP.getPythonTag(TAG_OWNER) item.collected(player) def triggerActivated(self, entry): intoNP = entry.getIntoNodePath() trigger = intoNP.getPythonTag(TAG_OWNER) if self.currentLevel is not None: self.currentLevel.triggerActivated(trigger) def cleanup(self): if self.currentLevel is not None: self.currentLevel.cleanup() self.currentLevel = None if self.player is not None: self.player.cleanup() self.player = None def quit(self): self.cleanup() base.userExit()
class Game(ShowBase): def __init__(self): ShowBase.__init__(self) self.disableMouse() properties = WindowProperties() properties.setSize(1000, 750) self.win.requestProperties(properties) mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) render.setLight(self.ambientLightNodePath) render.setShaderAuto() self.environment = loader.loadModel("Models/Misc/environment") self.environment.reparentTo(render) self.camera.setPos(0, 0, 32) self.camera.setP(-90) self.keyMap = { "up": False, "down": False, "left": False, "right": False, "shoot": False } self.accept("w", self.updateKeyMap, ["up", True]) self.accept("w-up", self.updateKeyMap, ["up", False]) self.accept("s", self.updateKeyMap, ["down", True]) self.accept("s-up", self.updateKeyMap, ["down", False]) self.accept("a", self.updateKeyMap, ["left", True]) self.accept("a-up", self.updateKeyMap, ["left", False]) self.accept("d", self.updateKeyMap, ["right", True]) self.accept("d-up", self.updateKeyMap, ["right", False]) self.accept("mouse1", self.updateKeyMap, ["shoot", True]) self.accept("mouse1-up", self.updateKeyMap, ["shoot", False]) self.pusher = CollisionHandlerPusher() self.cTrav = CollisionTraverser() self.pusher.setHorizontal(True) self.pusher.add_in_pattern("%fn-into-%in") self.accept("trapEnemy-into-wall", self.stopTrap) self.accept("trapEnemy-into-trapEnemy", self.stopTrap) self.accept("trapEnemy-into-player", self.trapHitsSomething) self.accept("trapEnemy-into-walkingEnemy", self.trapHitsSomething) wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(8.0) wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(-8.0) wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setX(8.0) wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setX(-8.0) self.updateTask = taskMgr.add(self.update, "update") self.player = Player() self.tempEnemy = WalkingEnemy(Vec3(5, 0, 0)) self.tempTrap = TrapEnemy(Vec3(-2, 7, 0)) def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState def stopTrap(self, entry): collider = entry.getFromNodePath() if collider.hasPythonTag("owner"): trap = collider.getPythonTag("owner") trap.moveDirection = 0 trap.ignorePlayer = False def trapHitsSomething(self, entry): collider = entry.getFromNodePath() if collider.hasPythonTag("owner"): trap = collider.getPythonTag("owner") if trap.moveDirection == 0: return collider = entry.getIntoNodePath() if collider.hasPythonTag("owner"): obj = collider.getPythonTag("owner") if isinstance(obj, Player): if not trap.ignorePlayer: obj.alterHealth(-1) trap.ignorePlayer = True else: obj.alterHealth(-10) def update(self, task): dt = globalClock.getDt() self.player.update(self.keyMap, dt) self.tempEnemy.update(self.player, dt) self.tempTrap.update(self.player, dt) return Task.cont
class Section2(): def __init__(self, showBase): self.showBase = showBase Common.initialise() Common.framework = self showBase.render.setShaderAuto() self.keyMap = { "up" : False, "down" : False, "left" : False, "right" : False, "shoot" : False, "shootSecondary" : False } showBase.accept("w", self.updateKeyMap, ["up", True]) showBase.accept("w-up", self.updateKeyMap, ["up", False]) showBase.accept("s", self.updateKeyMap, ["down", True]) showBase.accept("s-up", self.updateKeyMap, ["down", False]) showBase.accept("mouse1", self.updateKeyMap, ["shoot", True]) showBase.accept("mouse1-up", self.updateKeyMap, ["shoot", False]) showBase.accept("mouse3", self.updateKeyMap, ["shootSecondary", True]) showBase.accept("mouse3-up", self.updateKeyMap, ["shootSecondary", False]) showBase.accept("\\", self.toggleFriction) self.pusher = CollisionHandlerPusher() self.traverser = CollisionTraverser() self.traverser.setRespectPrevTransform(True) self.pusher.add_in_pattern("%fn-into-%in") self.pusher.add_in_pattern("%fn-into") self.pusher.add_again_pattern("%fn-again-into") showBase.accept("projectile-into", self.projectileImpact) showBase.accept("projectile-again-into", self.projectileImpact) showBase.accept("player-into", self.gameObjectPhysicalImpact) showBase.accept("enemy-into", self.gameObjectPhysicalImpact) self.updateTask = showBase.taskMgr.add(self.update, "update") self.player = None self.currentLevel = None def toggleFriction(self): Common.useFriction = not Common.useFriction def startGame(self, shipSpec): self.cleanupLevel() self.player = Player(shipSpec) self.currentLevel = Level("spaceLevel") def updateKeyMap(self, controlName, controlState, callback = None): self.keyMap[controlName] = controlState if callback is not None: callback(controlName, controlState) def update(self, task): dt = globalClock.getDt() if self.currentLevel is not None: self.currentLevel.update(self.player, self.keyMap, dt) if self.player is not None and self.player.health <= 0: self.showBase.gameOver() return Task.done self.traverser.traverse(self.showBase.render) if self.player is not None and self.player.health > 0: self.player.postTraversalUpdate(dt) return Task.cont def projectileImpact(self, entry): fromNP = entry.getFromNodePath() proj = fromNP.getPythonTag(TAG_OWNER) intoNP = entry.getIntoNodePath() if intoNP.hasPythonTag(TAG_OWNER): intoObj = intoNP.getPythonTag(TAG_OWNER) proj.impact(intoObj) else: proj.impact(None) def gameObjectPhysicalImpact(self, entry): fromNP = entry.getFromNodePath() if fromNP.hasPythonTag(TAG_OWNER): fromNP.getPythonTag(TAG_OWNER).physicalImpact(entry.getSurfaceNormal(self.showBase.render)) def triggerActivated(self, entry): intoNP = entry.getIntoNodePath() trigger = intoNP.getPythonTag(TAG_OWNER) if self.currentLevel is not None: self.currentLevel.triggerActivated(trigger) def cleanupLevel(self): if self.currentLevel is not None: self.currentLevel.cleanup() self.currentLevel = None if self.player is not None: self.player.cleanup() self.player = None def cleanup(self): self.showBase.ignore("w") self.showBase.ignore("w-up") self.showBase.ignore("s") self.showBase.ignore("s-up") self.showBase.ignore("mouse1") self.showBase.ignore("mouse1-up") self.showBase.ignore("mouse3") self.showBase.ignore("mouse3-up") self.showBase.ignore("\\") self.showBase.ignore("projectile-into") self.showBase.ignore("projectile-again-into") self.showBase.ignore("player-into") self.showBase.ignore("enemy-into") self.cleanupLevel() self.showBase.taskMgr.remove(self.updateTask) self.showBase = None self.updateTask = None