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) ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) render.setLight(self.ambientLightNodePath) mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) # Turn it around by 45 degrees, and tilt it down by 45 degrees self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) render.setShaderAuto() self.environment = loader.loadModel("Models/Misc/environment") self.environment.reparentTo(render) self.tempActor = Actor("Models/PandaChan/act_p3d_chan", {"walk" : "Models/PandaChan/a_p3d_chan_run"}) self.tempActor.getChild(0).setH(180) self.tempActor.reparentTo(render) self.tempActor.setPos(0, 2, 0) self.tempActor.loop("walk") 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.updateTask = taskMgr.add(self.update, "update") # Panda should now automatically update that traverser! self.cTrav = CollisionTraverser() self.pusher = CollisionHandlerPusher() # prevents nominated solid objects from intersecting other solid objects. colliderNode = CollisionNode("player") # Add a collision-sphere centred on (0, 0, 0), and with a radius of 0.3 colliderNode.addSolid(CollisionSphere(0, 0, 0, 0.4)) collider = self.tempActor.attachNewNode(colliderNode) collider.show() # The pusher wants a collider, and a NodePath that # should be moved by that collider's collisions. # In this case, we want our player-Actor to be moved. base.pusher.addCollider(collider, self.tempActor) # The traverser wants a collider, and a handler # that responds to that collider's collisions base.cTrav.addCollider(collider, self.pusher) self.pusher.setHorizontal(True) # Tubes are defined by their start-points, end-points, and radius. # In this first case, the tube goes from (-8, 0, 0) to (8, 0, 0), # and has a radius of 0.2. 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) def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState print (controlName, "set to", 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.tempActor.setPos(self.tempActor.getPos() + Vec3(0, 5.0*dt, 0)) if self.keyMap["down"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, -5.0*dt, 0)) if self.keyMap["left"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(-5.0*dt, 0, 0)) if self.keyMap["right"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(5.0*dt, 0, 0)) if self.keyMap["shoot"]: print ("Zap!") return Task.cont
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.tempActor = Actor("Models/PandaChan/act_p3d_chan", {"walk" : "Models/PandaChan/a_p3d_chan_run"}) self.tempActor.getChild(0).setH(180) self.tempActor.reparentTo(render) self.tempActor.loop("walk") 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) colliderNode = CollisionNode("player") colliderNode.addSolid(CollisionSphere(0, 0, 0, 0.3)) collider = self.tempActor.attachNewNode(colliderNode) base.pusher.addCollider(collider, self.tempActor) base.cTrav.addCollider(collider, self.pusher) 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") def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState def update(self, task): dt = globalClock.getDt() if self.keyMap["up"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, 5.0*dt, 0)) if self.keyMap["down"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, -5.0*dt, 0)) if self.keyMap["left"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(-5.0*dt, 0, 0)) if self.keyMap["right"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(5.0*dt, 0, 0)) if self.keyMap["shoot"]: print ("Zap!") return Task.cont
class MyGame(ShowBase): def __init__(self): ShowBase.__init__(self) #window properties properties = WindowProperties() properties.setSize(1000, 750) self.win.requestProperties(properties) self.disableMouse() self.environ = loader.loadModel( "/c/Users/ryand/Desktop/VSCode_Workspace/Panda3D Practice/Game/Models/environment" ) self.environ.reparentTo(render) #place camera high above the ground (z axis) self.camera.setPos(0, 0, 32) #set pitch to look down (camera points straight by default) self.camera.setP(-90) #ambient light (light for entire scene) ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) #use render.setLight to make the light affect the entire scene render.setLight(self.ambientLightNodePath) #directional light (shading) directLight = DirectionalLight("direct light") self.directLightNodePath = render.attachNewNode(directLight) self.directLightNodePath.setHpr(-45, -45, 0) render.setLight(self.directLightNodePath) #use pandas built in shader generator render.setShaderAuto() 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.updateTask = taskMgr.add(self.update, "update") #panda will automatically update the travserser with this cTrav variable self.cTrav = CollisionTraverser() #we want to add and remove objects as called for, so add this self.pusher = CollisionHandlerPusher() #because its a 2d game self.pusher.setHorizontal(True) 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) #instantiate a player instance and walking enemy instance self.player = Player() self.tempEnemy = WalkingEnemy(Vec3(5, 0, 0)) #starter code for button controls self.bk_text = "Test Button" self.textObject = OnscreenText(text=self.bk_text, pos=(0.95, -0.95), scale=0.07, fg=(1, 0.5, 0.5, 1), align=TextNode.ACenter, mayChange=1) self.button = DirectButton(text=("OK", "click!", "rolling over", "disabled"), scale=.1, command=self.setText) def updateKeyMap(self, ctrlName, ctrlState): self.keyMap[ctrlName] = ctrlState print(ctrlName, "set to", ctrlState) def update(self, task): #get time since last update (helps with fps issues) dt = globalClock.getDt() self.player.update(self.keyMap, dt) self.tempEnemy.update(self.player, dt) return task.cont #sets text when button is pressed def setText(self): self.bk_text = "Button Clicked" self.textObject.setText(self.bk_text)
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(1000, 750) self.win.requestProperties(properties) base.setBackgroundColor(0.5,1,0.5) self.textObject = OnscreenText(text ='shape-boi', pos = (0.925,0.925), scale = 0.075) self.thread = threading.Thread(target=self.udpConnect) self.thread2 = threading.Thread(target=self.runColorTrack) self.connectButton = DirectButton(text=('Open Connection'),pos=(-0.3,0,-0.98), scale=0.090, command=self.openConnection, frameColor=(255,255,255,0.15)) self.trackButton = DirectButton(text=('Color Track'),pos=(-1,0,-0.98), scale=0.090, command=self.thread2.start,frameColor=(255,255,255,0.15),state=0) self.connectButton.hide() self.trackButton.hide() self.scoreUI = OnscreenText(text = "0", pos = (-1.3, 0.825), mayChange = True, align = TextNode.ALeft) env = Environment("MorgansModels/mapTest2") #loader.loadModel("Models/Misc/environment") self.clientMsg = '' #render.setShaderAuto() #self.environment.setPos(0,54,-3) #self.environment.setH(90) #self.environment.setP(0) #self.environment.setScale(2) #self.environment.setZ(-10) self.tempActor = Actor("MorgansModels/shape-boi-grab-test-point_level2", {"walk":"MorgansModels/shape-boi-grab-test-point_level2-ArmatureAction", "lift":"MorgansModels/shape-boi-grab-test-point_level2-IcosphereAction"}) ''' # test with more realistic character self.tempActor = Actor("MorgansModels/mainCharacter_walking", {"walk":"MorgansModels/mainCharacter_walking-ArmatureAction", "lift":"MorgansModels/shape-boi-grab-test-point_level2-IcosphereAction"}) ''' self.tempActor.reparentTo(render) self.tempActor.setH(0) self.tempActor.setPos(0,54,-3) self.tempActor.setScale(0.5,0.5,0.5) self.tempActor.loop("walk") #player 1 self.cTrav = CollisionTraverser() self.pusher = CollisionHandlerPusher() colliderNode = CollisionNode("player") # Add a collision-sphere centred on (0, 0, 0), and with a radius of 0.3 colliderNode.addSolid(CollisionSphere(0,0,0, 0.8)) collider = self.tempActor.attachNewNode(colliderNode) collider.show() base.pusher.addCollider(collider, self.tempActor) # The traverser wants a collider, and a handler # that responds to that collider's collisions base.cTrav.addCollider(collider, self.pusher) self.pusher.setHorizontal(True) #collider.setZ(-3) self.myFriends = [] for i in range(4): self.tempActor2 = Actor("MorgansModels/shape-boi-grab-test", {"walk":"MorgansModels/shape-boi-grab-test-ArmatureAction"}) self.tempActor2.reparentTo(render) self.tempActor2.setH(180) self.tempActor2.setPos(0,50+(i*2),-3) self.tempActor2.setScale(0.5,0.5,0.5) self.tempActor2.loop("walk") self.myFriends.append(self.tempActor2) print(self.myFriends) self.score = 0 ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) render.setLight(self.ambientLightNodePath) # In the body of your code mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) # Turn it around by 45 degrees, and tilt it down by 45 degrees self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) #render.setShaderAuto() ''' liftSpot = Spotlight('spotlight') liftSpot.setColor((0.75, 1, 1, 1)) self.spotLightNodePath = render.attachNewNode(liftSpot) render.setLight(self.spotLightNodePath) self.spotLightNodePath.setPos(self.tempActor2.getX(), self.tempActor2.getY(), self.tempActor2.getZ()+ 5) self.spotLightNodePath.lookAt(self.tempActor2) render.setShaderAuto() ''' 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.updateTask = taskMgr.add(self.update, "update") self.updateTask2 = taskMgr.add(self.updateScore, "updateScore") self.trackUpdate = taskMgr.add(self.handleMessage, 'handleMessage') #self.updateTask3 = taskMgr.add(self.udpUpdate) env.wallColliders() ''' # towers wallSolid = CollisionTube(-1, 37, -4, -1, 37, 3, 1) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(8.0) wall.show() wallSolid = CollisionTube(-4.5, 48, -4, -4.5, 48, 3, 1) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(8.0) wall.show() ''' self.disableMouse() base.disableMouse() self.camera.setPos(self.tempActor.getPos()+ Vec3(0,6,4)) #self.camera.setPos(0, 0, 50) # Tilt the camera down by setting its pitch. self.camera.setP(-12.5) self.friendRoomCam() self.startMenu() def friendRoomCam(self): self.leftCam = self.makeCamera(self.win, \ displayRegion = (0.79, 0.99, 0.01, 0.21), useCamera=None) self.leftCam.setZ(50) self.leftCam.setX(-18) self.leftCam.setY(118) self.leftCam.setP(-90) self.leftCam.reparentTo(render) def startMenu(self): self.font = loader.loadFont("Fonts/Wbxkomik.ttf") 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 = "shape-boi", scale = 0.1, pos = (0, 0, 0.6), parent = self.titleMenu, relief = None, text_font = self.font, text_fg = (1, 1, 1, 1)) title2 = DirectLabel(text = "saves his", scale = 0.1, pos = (0, 0, 0.4), parent = self.titleMenu, relief = None, text_font = self.font, text_fg = (1, 1, 1, 1)) title3 = DirectLabel(text = "friends", scale = 0.125, pos = (0, 0, 0.2), parent = self.titleMenu, relief = None, text_font = self.font, text_fg = (1, 1, 1, 1)) self.startButton = DirectButton(text=('StartGame'),pos=(0.5,0,0), scale=0.090, command=self.startGame, frameColor=(255,255,255,0.5)) self.instructionsButton = DirectButton(text=('Instructions'),pos=(-0.5,0,0), scale=0.090, frameColor=(255,255,255,0.5)) def startGame(self): self.titleMenu.hide() self.titleMenuBackdrop.hide() self.startButton.hide() self.instructionsButton.hide() if self.connectButton.isHidden(): self.connectButton.show() if self.trackButton.isHidden(): self.trackButton.show() def circularMovement(self, object): # can call on an object to give it cirular motion circle_center = render.attach_new_node('circle_center') circle_center.hprInterval(2, (-360,0,0)).loop() object.reparent_to(circle_center) def selectionLight(self, selection): vectorToObject = selection.getPos()-self.tempActor.getPos() vector2d = vectorToObject.getXy() distanceToObject = vector2d.length() ambient = AmbientLight('ambient') ambient.setColor((0.75, 0.75, 0.5, 1)) ambientNP = selection.attachNewNode(ambient) if (distanceToObject < 0.65): print(distanceToObject, "selectionLight") selection.setLightOff() selection.setLight(ambientNP) else: #selection.getChildren().detach() selection.clearLight() selection.setLight(self.ambientLightNodePath) def pickUpObject(self): #for object in self.myFriends: vectorToObject = self.tempActor2.getPos()-self.tempActor.getPos() vector2d = vectorToObject.getXy() distanceToObject = vector2d.length() if distanceToObject < 0.6: #print(distanceToObject, "pickup") #self.selectionLight(self.tempActor2) self.tempActor2.setX(self.tempActor.getX() + 0.0) self.tempActor2.setY(self.tempActor.getY() + 0.25) self.tempActor2.setZ(self.tempActor.getZ() + 0.25) print(self.tempActor2.getY()) def setObjectDown(self): #self.tempActor2.setX(self.tempActor2.getX() + 0.25) #self.tempActor2.setY(self.tempActor2.getY() + 0.25) self.tempActor2.setZ(-3) def cameraFollow(self): base.disableMouse() self.camera.setPos(self.tempActor.getPos()+ Vec3(0,0,60)) self.camera.setP(-90) #self.rightCam.setPos(self.tempActor.getPos()+ Vec3(0,12,4)) #self.rightCam.setP(-12.5) def cameraSet(self): base.disableMouse() self.camera.setPos(self.tempActor.getPos()+ Vec3(0,-100,20)) #self.camera.setPos(0, 0, 50) # Tilt the camera down by setting its pitch. self.camera.setP(-12.5) def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState print (controlName, "set to", controlState) def openConnection(self): self.thread.start() self.trackButton['state'] = 1 def handleMessage(self,task): dt = globalClock.getDt() msg = self.clientMsg (currX, currY) = (self.tempActor.getX(), self.tempActor.getY()) # models movement instead of mirroring tracked objects (x,y) if msg == 'move_forward': self.tempActor.setY(currY + 9*dt) elif msg == 'move_back': self.tempActor.setY(currY - 9*dt) elif msg == 'move_left': self.tempActor.setX(currX + 9*dt) #self.tempActor.setH(self.tempActor.getH() + 2) elif msg == 'move_right': self.tempActor.setX(currX - 9*dt) elif msg == 'move_forward_right': self.tempActor.setX(currX - 9*dt) self.tempActor.setY(currY + 9*dt) elif msg == 'move_forward_left': self.tempActor.setX(currX + 9*dt) self.tempActor.setY(currY + 9*dt) elif msg == 'move_back_right': self.tempActor.setX(currX - 9*dt) self.tempActor.setY(currY - 9*dt) elif msg == 'move_back_left': self.tempActor.setX(currX + 9*dt) self.tempActor.setY(currY - 9*dt) else: self.tempActor.setX(currX) return task.cont def udpConnect(self): localIP = "127.0.0.1" localPort = 20001 bufferSize = 1024 msgFromServer = "Hello UDP Client" bytesToSend = str.encode(msgFromServer) UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) UDPServerSocket.bind((localIP, localPort)) print("UDP server up and listening") while(True): bytesAddressPair = UDPServerSocket.recvfrom(bufferSize) message = bytesAddressPair[0] address = bytesAddressPair[1] self.clientMsg = message.decode() clientIP = "Client IP Address:{}".format(address) print('server listened message from client: ', self.clientMsg) #self.handleMessage(clientMsg, currX, currY) ''' print(clientMsg[:].split(',')[0]) #print(clientIP) cx = int(clientMsg[:].split(',')[0]) self.shape.setX(-cx//2) cy = int(clientMsg[:].split(',')[1]) self.shape.setY(-cy//2) ''' # Sending a reply to client UDPServerSocket.sendto(bytesToSend, address) def runColorTrack(self): #useless_cat_call = subprocess.run(["python3", "/Users/morganvisnesky/shape_boi/colorTracker.py"], stdin=subprocess.PIPE, text=True) print('Running colorTracker.py...') proc = subprocess.Popen('python3 colorTracker.py', shell=True) def updateScore(self, task): self.scoreUI.setText('0') if (self.tempActor2.getX() > -37 and self.tempActor2.getX() < 0) \ and (self.tempActor2.getY() > 110 and self.tempActor2.getY() < 132): print('scored') self.score +=1 scoreString = str(self.score) self.scoreUI.setText(scoreString) return task.done else: return task.cont def update(self, task): # Get the amount of time since the last update dt = globalClock.getDt() self.selectionLight(self.tempActor2) # 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.camera.setPos(self.tempActor.getPos()) self.tempActor.setH(0) self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, 9.0*dt, 0)) if self.keyMap["down"]: self.tempActor.setH(180) self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, -9.0*dt, 0)) if self.keyMap["left"]: self.tempActor.setH(90) #self.tempActor.setR(self.tempActor.getR() + 2) #self.rightCam.setX(self.tempActor.getX()+5) self.tempActor.setPos(self.tempActor.getPos() + Vec3(-9.0*dt, 0, 0)) if self.keyMap["right"]: self.tempActor.setH(270) #self.rightCam.setX(self.tempActor.getX()+5) self.tempActor.setPos(self.tempActor.getPos() + Vec3(9.0*dt, 0, 0)) if self.keyMap["shoot"]: #self.score += 1 #self.updateScore(self.score) self.cameraFollow() self.pickUpObject() #print ("Zap!") if self.keyMap["shoot"] == False: self.setObjectDown() self.cameraSet() #print ("Zap!") return task.cont
class Game(ShowBase): def __init__(self): ShowBase.__init__(self) #loader.loadModel("models/environment") properties = WindowProperties() properties.setSize(1000, 750) self.win.requestProperties(properties) self.disableMouse() self.environment = loader.loadModel("environment/environment") self.environment.reparentTo(render) self.tempActor = Actor("models/act_p3d_chan", {"walk": "models/a_p3d_chan_run"}) self.tempActor2 = Actor("models/cube.bam") self.tempActor.reparentTo(render) self.tempActor2.reparentTo(render) self.tempActor.setPos(0, 3, 0) self.tempActor2.setPos(0, 3, 0) self.tempActor.getChild(0).setH(180) self.tempActor.loop("walk") #self.useDrive() self.useTrackball() # Move the camera to a position high above the screen # --that is, offset it along the z-axis. self.camera.setPos(0, 0, 32) # Tilt the camera down by setting its pitch. self.camera.setP(-90) self.camera.reparentTo(self.tempActor) self.makeCamera(self.win, displayRegion=(0, 0.5, 0, 1)) self.makeCamera(self.win, displayRegion=(0.5, 1, 0, 1)) self.camList[1].reparentTo(self.tempActor) self.camList[1].setPos(-0.5, 10, 20) self.camList[2].setPos(0.5, 0, 0) self.camList[2].reparentTo(render) #self.taskMgr.add(self.spinCameraTask, "SpinCameraTask") self.cTrav = CollisionTraverser() self.pusher = CollisionHandlerPusher() colliderNode = CollisionNode("player") colliderNode.addSolid(CollisionSphere(0, 0, 0, 0.3)) collider = self.tempActor.attachNewNode(colliderNode) collider.show() # The pusher wants a collider, and a NodePath that # should be moved by that collider's collisions. # In this case, we want our player-Actor to be moved. base.pusher.addCollider(collider, self.tempActor) # The traverser wants a collider, and a handler # that responds to that collider's collisions base.cTrav.addCollider(collider, self.pusher) self.pusher.setHorizontal(True) # Tubes are defined by their start-points, end-points, and radius. # In this first case, the tube goes from (-8, 0, 0) to (8, 0, 0), # and has a radius of 0.2. 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) # buffer = self.win.make_texture_buffer("renderBuffer", 1000, 750, to_ram=True) # data = buffer.get_texture().getRamImage() # np_buffer = np.frombuffer(data, np.float32) # print(np_buffer) ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) render.setLight(self.ambientLightNodePath) # In the body of your code mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) # Turn it around by 45 degrees, and tilt it down by 45 degrees self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) render.setShaderAuto() 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.updateTask = taskMgr.add(self.update, "update") def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState print(controlName, "set to", 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.tempActor.setPos(self.tempActor.getPos() + Vec3(0, 5.0 * dt, 0)) if self.keyMap["down"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, -5.0 * dt, 0)) if self.keyMap["left"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(-5.0 * dt, 0, 0)) if self.keyMap["right"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(5.0 * dt, 0, 0)) if self.keyMap["shoot"]: print("Zap!") #imm=self.win.getScreenshot().getRamImage() self.win.saveScreenshotDefault('www') imm = self.win.getScreenshot().getRamImageAs("RGB") #print(imm) np_buffer = np.array(imm, np.float32) #print(np_buffer.shape) print(np_buffer[:-300]) #list of Nodespaths #self.tempActor.ls() #self.render.ls() #self.camera.ls() #print(self.camList) return task.cont
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) 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)) def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState def update(self, task): dt = globalClock.getDt() self.player.update(self.keyMap, dt) self.tempEnemy.update(self.player, dt) return Task.cont
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) # Call various initialization methods on class self.windowInit(1280, 720) self.levelInit("Models/Environment/environment") self.lightingInit() self.playerInit() self.cameraInit(pos=Vec3(0, 0, 32), hpr=Vec3(0, -90, 0)) self.inputInit() self.collisionInit() self.tempEnemy = WalkingEnemy(Vec3(5, 0, 0)) # Set up a task that we'll run consistently self.updateTask = taskMgr.add(self.update, "update") def windowInit(self, h, w): properties = WindowProperties() properties.setSize(h, w) self.win.requestProperties(properties) def levelInit(self, levelname): # Load a backdrop model and attach it to the Scene Graph self.environment = loader.loadModel(levelname) self.environment.reparentTo(render) # Set up level collision self.cTrav = CollisionTraverser() self.pusher = CollisionHandlerPusher() def lightingInit(self): # Kind of dark with just an ambient light, maybe a directional light eh mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) # hook us up some automatic perpixel lighting render.setShaderAuto() def playerInit(self): # Initialize and render player character self.player = Player() self.player.actor.reparentTo(render) def cameraInit(self, pos, hpr): self.camera.setPos(pos) self.camera.setHpr(hpr) def collisionInit(self): self.pusher.addCollider(self.player.collider, self.player.actor) self.cTrav.addCollider(self.player.collider, self.pusher) self.pusher.setHorizontal(True) 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) def inputInit(self): # Input states self.keyMap = { "up": False, "down": False, "left": False, "right": False, "shoot": False } # Disable the default camera control self.disableMouse() # Set up events to call self.updateKeyMap with args when certain keys are pressed or released 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]) # keyMap setter def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState # Main game logic we have running every frame def update(self, task): dt = globalClock.getDt() self.player.update(self.keyMap, dt) self.tempEnemy.update(self.player, dt) return task.cont
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 Game(ShowBase): def __init__(self): ShowBase.__init__(self) properties = WindowProperties() properties.setSize(1000, 750) properties.setTitle('shape-boi saves his friends!') self.win.requestProperties(properties) base.setBackgroundColor(0.5, 1.0, 0.75) self.lights() self.env = Environment("MorgansModels/game-map3") self.env.wallColliders() self.env.plants() self.proc = None self.instanceNumber = 10 self.rescueZone = Actor( 'MorgansModels/rescueZone-ArmatureAction.egg', {"spin": "MorgansModels/rescueZone-ArmatureAction"}) # holds a lot of possible locations to instance friend characters # so they dont get stuck in colliders self.possibleLocations = [(-30, 77), (-19.7, 44.2), (-29.89, 26.36), (-9.72, 46.73), (29, 56.54), (34.94, 108.52), (24.95, 88.33), (-22.3, 102.55), (-30.5, 93.2), (19.48, 92.78), (27.27, 20.63), (-31.24, 13.93), (-36, 62.3), (-36, 42.37), (-36, 12.9), (-9, 38.7), (6.68, 21.32), (9, 72), (10.11, 104.51), (23.96, 129.18), (-2.65, 107.01), (-11.77, 85.64), (-9.53, 67.89), (-9, 19.68), (3.8, 24.27), (36, 11), (36, 53), (10.88, 59.72), (-36.01, 105.7)] # onscreen UI self.textObject = OnscreenText( text='shape-boi', pos=(0.925, 0.925), scale=0.075, font=loader.loadFont('Fonts/Replicant.ttf')) self.scoreUI = OnscreenText(text="Score: 0", pos=(-1.3, 0.825), mayChange=True, align=TextNode.ALeft, font=loader.loadFont('Fonts/Legion.ttf'), scale=0.05) self.countDownUI = OnscreenText( text="", pos=(0.0, 0.925), mayChange=True, align=TextNode.ALeft, font=loader.loadFont('Fonts/Legion.ttf'), scale=0.05) self.thread = threading.Thread(target=self.udpConnect) self.thread2 = threading.Thread(target=self.runColorTrack) self.mainCharacterModel = "MorgansModels/shape-boi-grab-test" self.clientMsg = '' self.carrying = False self.countDownTime = 120 # in seconds # test with more realistic character self.tempActor = Actor( "MorgansModels/mainCharacter_walking", { "walk": "MorgansModels/mainCharacter_walking-ArmatureAction", "lift": "MorgansModels/shape-boi-grab-test-point_level2-IcosphereAction" }) self.gameOver = True self.keyMap = { "up": False, "down": False, "left": False, "right": False, "shoot": False, "camera": 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("space", self.updateKeyMap, ["shoot", True]) self.accept("space-up", self.updateKeyMap, ["shoot", False]) self.accept("p", self.updateKeyMap, ["camera", True]) self.accept("p-up", self.updateKeyMap, ["camera", False]) self.updateTask = taskMgr.add(self.update, "update") self.disableMouse() base.disableMouse() self.camera.setPos(self.tempActor.getPos() + Vec3(0, 6, 4)) # Tilt the camera down by setting its pitch. self.camera.setP(-12.5) self.startMenu() self.possibleCharacters = [ 'MorgansModels/shape-boi-grab-test', "MorgansModels/shape-boi-grab_char3", "MorgansModels/shape-boi-grab_char2", "MorgansModels/shape-boi-grab_char4", "MorgansModels/shape-boi-grab_mrSpike", "MorgansModels/shape-boi-grab_mrSquare" ] self.currIndexSelectionScreen = 0 self.savedFriends = [] self.myFriends = [] self.score = len(self.savedFriends) self.instanceFriends() # winning background Music self.winSound = loader.loadSfx("sound/shapeboiSound2.ogg") self.winSound.setLoop(True) # normal backgroundMusic self.backSound = loader.loadSfx("sound/shapeboiSound.ogg") self.backSound.setLoop(True) self.backSound.play() def lights(self): ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) render.setLight(self.ambientLightNodePath) mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) # Turn it around by 45 degrees, and tilt it down by 45 degrees self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) def loadMainCharacter(self, mainCharModel): # loads the main character object with specified model self.tempActor = Actor( mainCharModel, { "walk": "MorgansModels/shape-boi-grab-test-point_level2-ArmatureAction", "lift": "MorgansModels/shape-boi-grab-test-point_level2-IcosphereAction" }) self.tempActor.reparentTo(render) self.tempActor.setH(0) self.tempActor.setPos(0, 54, -3) self.tempActor.setScale(0.5, 0.5, 0.5) self.tempActor.loop("walk") #player 1 self.cTrav = CollisionTraverser() self.pusher = CollisionHandlerPusher() colliderNode = CollisionNode("player") colliderNode.addSolid(CollisionSphere(0, 0, 1, 1.7)) collider = self.tempActor.attachNewNode(colliderNode) #collider.show() base.pusher.addCollider(collider, self.tempActor) base.cTrav.addCollider(collider, self.pusher) self.pusher.setHorizontal(True) def changeActor(self, newActorModel): # got some help with this post # https://discourse.panda3d.org/t/replacing-model-in-actor/1447/5 self.tempActor.removePart('modelRoot') self.tempActor.loadModel(newActorModel) def selectionScreenCharacterChange(self, currSelection): if self.currIndexSelectionScreen < (len(self.possibleCharacters) - 1): self.currIndexSelectionScreen += 1 else: self.currIndexSelectionScreen = 0 newModel = self.possibleCharacters[self.currIndexSelectionScreen] self.mainCharacterModel = self.possibleCharacters[ self.currIndexSelectionScreen] currSelection.removePart('modelRoot') currSelection.loadModel(newModel) def characterSelectionScreen(self): #print('select screen') self.connectButton.hide() self.titleMenu.hide() self.titleMenuBackdrop.hide() self.startButton.hide() self.instructionsButton.hide() self.possibleActor = Actor( "MorgansModels/shape-boi-grab-test-point_level2", { "walk": "MorgansModels/shape-boi-grab-test-point_level2-ArmatureAction", "lift": "MorgansModels/shape-boi-grab-test-point_level2-IcosphereAction" }) ''' # test with more realistic character self.tempActor = Actor("MorgansModels/mainCharacter_walking", {"walk":"MorgansModels/mainCharacter_walking-ArmatureAction", "lift":"MorgansModels/shape-boi-grab-test-point_level2-IcosphereAction"}) ''' self.possibleActor.reparentTo(render) self.possibleActor.setH(180) self.possibleActor.setPos(200, 200, -3) self.possibleActor.setScale(0.5, 0.5, 0.5) #self.possibleActor.loop("walk") self.camera.setPos(self.possibleActor.getPos()) self.camera.setZ(4) self.camera.setY(self.possibleActor.getY() - 20) self.selectButton = DirectButton( text=('Change Character'), pos=(0.0, 0, -0.75), scale=0.050, command=self.selectionScreenCharacterChange, extraArgs=[self.possibleActor], frameColor=(255, 255, 255, 0.0), text_font=loader.loadFont('Fonts/Legion.ttf')) self.startButton2 = DirectButton( text=('StartGame'), pos=(0.0, 0.0, 0.75), scale=0.050, command=self.startGame, frameColor=(255, 255, 255, 0.0), text_font=loader.loadFont('Fonts/Legion.ttf')) # scenery for selection menu self.shrub = loader.loadModel("MorgansModels/grass3") self.shrub.setPos(205, 207, -3) self.shrub.setScale(4) self.shrub.setH(180) self.shrub.reparentTo(render) self.shrub = loader.loadModel("MorgansModels/grass3") self.shrub.setPos(195, 207, -3) self.shrub.setScale(4) self.shrub.setH(180) self.shrub.reparentTo(render) self.shrub = loader.loadModel("MorgansModels/grass3") self.shrub.setPos(200, 210, -3) self.shrub.setScale(6) self.shrub.setH(270) self.shrub.reparentTo(render) ''' self.shrub = loader.loadModel("MorgansModels/mountains") self.shrub.setPos(195,240,-8) self.shrub.setScale(2.5) self.shrub.setH(0) self.shrub.reparentTo(render) ''' def quitGame(self): # exits the game , does not shut down colorTracker.py. sys.exit() #self.thread.exit() #self.thread2.exit() #self.UDPServerSocket.shutdown() #self.UDPServerSocket.close() def friendRoomCam(self): # not currently is use, but is a second camera view that is displayed in the lower right hand corner, it shows a # view of the rescue room, so you can check on your friends, is currently getting obstructed by other game objects self.leftCam = self.makeCamera(self.win, \ displayRegion = (0.79, 0.99, 0.01, 0.21), useCamera=None) self.leftCam.setZ(50) self.leftCam.setX(-18) self.leftCam.setY(118) self.leftCam.setP(-90) self.leftCam.reparentTo(render) def instructions(self): # holds all data for instructions menu self.titleMenu.hide() self.titleMenuBackdrop.hide() self.startButton.hide() self.instructionsButton.hide() self.connectButton.hide() self.font = loader.loadFont('Fonts/gone.ttf') self.font2 = loader.loadFont("Fonts/Legion.ttf") self.instructionsMenuBackdrop = DirectFrame(frameColor=(0, 0, 0, 1), frameSize=(-1, 1, -1, 1), parent=render2d) self.instructionsMenu = DirectFrame(frameColor=(1, 1, 1, 0)) title = DirectLabel(text="INSTRUCTIONS", scale=0.075, pos=(0, 0, 0.9), parent=self.instructionsMenu, relief=None, text_font=self.font2, text_fg=(1, 1, 1, 1)) title2 = DirectLabel(text = "In shape-world, shape-people thrive by working together and helping one another."+ "\n" \ "When recent disaster struck many shape-people were sperated from thier friends and families" + "\n" \ "making them all very sad."+ "\n" \ "Shape-boi's mission is to find his loved ones and bring them together" + "\n" \ "before sadness eats away at them any longer."+ "\n" \ "(Find all of shape-boi's loved ones and take them to the rescue zone to win the game!)", scale = 0.05, pos = (-1.2, 0, 0.75), parent = self.instructionsMenu, relief = None, text_font = self.font, text_align = TextNode.ALeft, text_fg=(0.5,0.5,0.75,1.0)) title2 = DirectLabel(text="Key Movement:", scale=0.05, pos=(-1.2, 0, 0.4), parent=self.instructionsMenu, relief=None, text_font=self.font, text_align=TextNode.ALeft, text_fg=(1, 1, 1, 1)) title2 = DirectLabel(text="W - forward", scale=0.05, pos=(0.0, 0, 0.4), parent=self.instructionsMenu, relief=None, text_font=self.font, text_align=TextNode.ALeft, text_fg=(1, 1, 0, 1)) title2 = DirectLabel(text="S - backward", scale=0.05, pos=(0.0, 0, 0.3), parent=self.instructionsMenu, relief=None, text_font=self.font, text_align=TextNode.ALeft, text_fg=(1, 1, 0, 1)) title2 = DirectLabel(text="A - left", scale=0.05, pos=(0.0, 0, 0.2), parent=self.instructionsMenu, relief=None, text_font=self.font, text_align=TextNode.ALeft, text_fg=(1, 1, 0, 1)) title2 = DirectLabel(text="D - right", scale=0.05, pos=(0.0, 0, 0.1), parent=self.instructionsMenu, relief=None, text_font=self.font, text_align=TextNode.ALeft, text_fg=(1, 1, 0, 1)) title3 = DirectLabel(text="Color-Tracking Movement:", scale=0.05, pos=(-1.2, 0, 0.0), parent=self.instructionsMenu, relief=None, text_font=self.font, text_align=TextNode.ALeft, text_fg=(1, 1, 1, 1)) title3 = DirectLabel( text="To enable color-tracking, click the color track button" + "\n" + "near the bottom of the window on the start page", scale=0.05, pos=(-1.2, 0, -0.1), parent=self.instructionsMenu, relief=None, text_font=loader.loadFont('Fonts/gone.ttf'), text_align=TextNode.ALeft, text_fg=(0, 1, 0, 1)) title3 = DirectLabel(text="Actions:", scale=0.05, pos=(-1.2, 0, -0.3), parent=self.instructionsMenu, relief=None, text_font=self.font, text_align=TextNode.ALeft, text_fg=(1, 1, 1, 1)) title2 = DirectLabel( text="Spacebar - pick-up object (hold down to carry)", scale=0.05, pos=(0.0, 0, -0.4), parent=self.instructionsMenu, relief=None, text_font=self.font, text_align=TextNode.ALeft, text_fg=(1, 1, 0, 1)) title2 = DirectLabel(text="P - change camera view", scale=0.05, pos=(0.0, 0, -0.5), parent=self.instructionsMenu, relief=None, text_font=self.font, text_align=TextNode.ALeft, text_fg=(1, 1, 0, 1)) self.returnToMenuButton = DirectButton( text=('BACK TO MENU'), pos=(0.0, 0, -0.9), scale=0.090, command=self.showStartMenuHideInstructions, frameColor=(200, 155, 155, 0.0), text_font=self.font2, text_fg=(0.5, 0.5, 0.75, 1.0)) #self.instructionsButton = DirectButton(text=('Instructions'),pos=(-0.5,0,0), scale=0.090, frameColor=(255,255,255,0.5), text_font=loader.loadFont('Fonts/Replicant.ttf')) def showStartMenuHideInstructions(self): self.titleMenu.show() self.titleMenuBackdrop.show() self.startButton.show() self.instructionsButton.show() self.connectButton.show() self.instructionsMenuBackdrop.hide() self.instructionsMenu.hide() self.returnToMenuButton.hide() def startMenu(self): self.font = loader.loadFont("Fonts/Gone.ttf") 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="shape-boi", scale=0.1, pos=(0, 0, 0.6), parent=self.titleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) title2 = DirectLabel(text="saves his", scale=0.1, pos=(0, 0, 0.4), parent=self.titleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) title3 = DirectLabel(text="friends", scale=0.125, pos=(0, 0, 0.2), parent=self.titleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) self.startButton = DirectButton( text=('StartGame'), pos=(0.5, 0, 0), scale=0.050, command=self.characterSelectionScreen, frameColor=(255, 255, 255, 0.0), text_font=loader.loadFont('Fonts/Legion.ttf'), text_fg=(0.5, 0.5, 0.75, 1.0)) self.instructionsButton = DirectButton( text=('Instructions'), pos=(-0.5, 0, 0), scale=0.050, command=self.instructions, frameColor=(255, 255, 255, 0.0), text_font=loader.loadFont('Fonts/Legion.ttf'), text_fg=(0.5, 0.5, 0.75, 1.0)) self.connectButton = DirectButton( text=('Color Track'), pos=(0.0, 0, -0.7), scale=0.090, command=self.openConnection, frameColor=(255, 255, 255, 0.0), text_font=loader.loadFont('Fonts/genotype.ttf'), text_fg=(255, 255, 255, 1.0)) #self.trackButton = DirectButton(text=('Color Track'),pos=(-1,0,-0.98), scale=0.090, command=self.thread2.start,frameColor=(255,255,255,0.0),state=0,text_font=loader.loadFont('Fonts/genotype.ttf')) def playAgainWin(self): # hides loosing screen and takes you to main menu self.cleanup() self.tempActor = Actor( "MorgansModels/mainCharacter_walking", { "walk": "MorgansModels/mainCharacter_walking-ArmatureAction", "lift": "MorgansModels/shape-boi-grab-test-point_level2-IcosphereAction" }) self.myFriends = [] self.titleMenu.show() self.titleMenuBackdrop.show() self.startButton.show() self.instructionsButton.show() self.connectButton.show() self.restartButton.hide() self.quitButton.hide() self.winTitleMenu.hide() self.winSound.stop() self.backSound.play() def playAgainLose(self): # hides winning screen and takes you to main menu self.cleanup() self.tempActor = Actor( "MorgansModels/mainCharacter_walking", { "walk": "MorgansModels/mainCharacter_walking-ArmatureAction", "lift": "MorgansModels/shape-boi-grab-test-point_level2-IcosphereAction" }) self.myFriends = [] self.titleMenu.show() self.titleMenuBackdrop.show() self.startButton.show() self.instructionsButton.show() self.connectButton.show() self.restartButton.hide() self.quitButton.hide() self.loseTitleMenu.hide() self.loseTitleMenuBackdrop.hide() #self.winSound.stop() #self.backSound.play() def cleanup(self): # used to destroy game objects and reset them when 'Play Agian' is selected self.gameOver = True for friend in self.savedFriends: friend.cleanup() self.savedFriends = [] for friend in self.myFriends: friend.cleanup() self.myFriends = [] self.possibleActor.cleanup() if self.tempActor is not None: self.tempActor.cleanup() #self.tempActor = None self.rescueZone.cleanup() self.score = 0 self.countDownTime = 120 scoreString = str(self.score) self.scoreUI.setText('Score: ' + scoreString) self.countDownUI.setText('') def instanceFriends(self): # used to instance friends in a semi random location based on predermined coordinates that dont contain colliders for i in range(self.instanceNumber): # this loop adds friends (x, y) = random.choice(self.possibleLocations) character = random.choice(self.possibleCharacters) self.tempActor2 = Actor( character, {"walk": "MorgansModels/shape-boi-grab-test-ArmatureAction"}) self.tempActor2.reparentTo(render) self.tempActor2.setH(180) self.tempActor2.setPos(x, y, -3) self.tempActor2.setScale(0.5, 0.5, 0.5) self.tempActor2.loop("walk") self.myFriends.append(self.tempActor2) #print(self.myFriends) def startGame(self): # initializes game play self.cleanup() self.gameOver = False self.updateTask2 = taskMgr.add(self.updateScore, "updateScore") self.trackUpdate = taskMgr.add(self.handleMessage, 'handleMessage') #self.trackUpdate = taskMgr.add(self.changeBackgroundColor, 'changeBackgroundColor') self.instanceFriends() self.loadMainCharacter(self.mainCharacterModel) self.startButton2.hide() self.selectButton.hide() self.connectButton.hide() self.cameraSet() self.titleMenu.hide() self.titleMenuBackdrop.hide() self.startButton.hide() self.instructionsButton.hide() if self.connectButton.isHidden(): self.connectButton.hide() self.rescueZone = Actor( 'MorgansModels/rescueZone', {"walk": "MorgansModels/rescueZone-ArmatureAction"}) self.rescueZone.reparentTo(render) self.rescueZone.setH(0) self.rescueZone.setPos(-17, 120, 3) self.rescueZone.setScale(2.5, 2.5, 2.5) self.rescueZone.loop("walk") #if self.trackButton.isHidden(): # self.trackButton.show() #self.restartButton = DirectButton(text=('Play Again'),pos=(0.0,0,-0.9), scale=0.090,command=self.playAgain,frameColor=(255,255,255,0.5),text_font=self.font) self.timerUpdate = taskMgr.doMethodLater(1.0, self.clockUpdate, 'handleMessage') def circularMovement(self, object): # can call on an object to give it cirular motion circle_center = render.attach_new_node('circle_center') circle_center.hprInterval(2, (-360, 0, 0)).loop() object.reparent_to(circle_center) def selectionLight(self, selection): # highlights objects close to main character vectorToObject = selection.getPos() - self.tempActor.getPos() vector2d = vectorToObject.getXy() distanceToObject = vector2d.length() ambient = AmbientLight('ambient') ambient.setColor((0.75, 0.75, 0.5, 1)) ambientNP = selection.attachNewNode(ambient) if (distanceToObject < 0.65): #print(distanceToObject, "selectionLight") selection.setLightOff() selection.setLight(ambientNP) else: #selection.getChildren().detach() selection.clearLight() selection.setLight(self.ambientLightNodePath) def pickUpObject(self): # used to pick up friend object for object in self.myFriends: vectorToObject = object.getPos() - self.tempActor.getPos() vector2d = vectorToObject.getXy() distanceToObject = vector2d.length() if distanceToObject < 1.25: object.setX(self.tempActor.getX() + 0.0) object.setY(self.tempActor.getY() + 0.25) object.setZ(self.tempActor.getZ() + 0.25) def setObjectDown(self): # places friend object on ground if they are currently being held for object in self.myFriends: vectorToObject = object.getPos() - self.tempActor.getPos() vector2d = vectorToObject.getXy() distanceToObject = vector2d.length() if distanceToObject < 1.25: object.setZ(-3) #self.carrying = False def cameraFollow(self): # sets camera to overheadview, follows main character base.disableMouse() self.camera.setPos(self.tempActor.getPos() + Vec3(0, 0, 60)) self.camera.setP(-90) def cameraSet(self): # sets camera to 3rd person view, follows main character base.disableMouse() self.camera.setPos(self.tempActor.getPos() + Vec3(0, -100, 20)) self.camera.setP(-12.5) def updateKeyMap(self, controlName, controlState): self.keyMap[controlName] = controlState #print (controlName, "set to", controlState) def openConnection(self): self.thread.start() #self.trackButton['state'] = 1 # used to disable track button until UDPconnect button is pressed self.thread2.start() def handleMessage(self, task): # handles message from colorTracker.py dt = globalClock.getDt() msg = self.clientMsg (currX, currY) = (self.tempActor.getX(), self.tempActor.getY()) # models movement instead of mirroring tracked objects (x,y) if msg == 'move_forward': self.tempActor.setH(0) self.tempActor.setY(currY + 9 * dt) elif msg == 'move_back': self.tempActor.setH(180) self.tempActor.setY(currY - 9 * dt) elif msg == 'move_left': self.tempActor.setH(90) self.tempActor.setX(currX - 9 * dt) elif msg == 'move_right': self.tempActor.setH(270) self.tempActor.setX(currX + 9 * dt) elif msg == 'move_forward_right': self.tempActor.setH(315) self.tempActor.setX(currX + 9 * dt) self.tempActor.setY(currY + 9 * dt) elif msg == 'move_forward_left': self.tempActor.setH(45) self.tempActor.setX(currX - 9 * dt) self.tempActor.setY(currY + 9 * dt) elif msg == 'move_back_right': self.tempActor.setH(225) self.tempActor.setX(currX + 9 * dt) self.tempActor.setY(currY - 9 * dt) elif msg == 'move_back_left': self.tempActor.setH(135) self.tempActor.setX(currX - 9 * dt) self.tempActor.setY(currY - 9 * dt) else: self.tempActor.setX(currX) return task.cont def udpConnect(self): # UDP code from here https://pythontic.com/modules/socket/udp-client-server-example # message is converted to a meaningful movement command in the colorTracker.py script localIP = "127.0.0.1" localPort = 20001 bufferSize = 1024 msgFromServer = "Hello UDP Client" bytesToSend = str.encode(msgFromServer) self.UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) self.UDPServerSocket.bind((localIP, localPort)) print("UDP server up and listening") while (True): bytesAddressPair = self.UDPServerSocket.recvfrom(bufferSize) message = bytesAddressPair[0] address = bytesAddressPair[1] self.clientMsg = message.decode() clientIP = "Client IP Address:{}".format(address) print('server listened message from client: ', self.clientMsg) #self.handleMessage(clientMsg, currX, currY) ''' # using (x,y) to control characters movement print(clientMsg[:].split(',')[0]) #print(clientIP) cx = int(clientMsg[:].split(',')[0]) self.shape.setX(-cx//2) cy = int(clientMsg[:].split(',')[1]) self.shape.setY(-cy//2) ''' # Sending a reply to client self.UDPServerSocket.sendto(bytesToSend, address) def runColorTrack(self): # runs the color-tracking script that corresponds to this game print('Running colorTracker.py...') self.proc = subprocess.Popen('python3 colorTracker.py', shell=True) def killColorTrack(self): # not currently working, but supposed to help with terminating openCV subprocess self.proc.kill() self.proc.kill() def gameOverWin(self): # UI that is displayed when a win occurs self.connectButton.hide() #self.trackButton.hide() self.font = loader.loadFont("Fonts/Gone.ttf") #self.titleMenuBackdrop = DirectFrame(frameColor = (0, 0, 0, 1), #frameSize = (-1, 1, -1, 1), #parent = render2d) self.winTitleMenu = DirectFrame(frameColor=(1, 1, 1, 0)) title = DirectLabel(text="You Won!", scale=0.1, pos=(0, 0, 0.6), parent=self.winTitleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) title2 = DirectLabel(text="Thanks for helping SHAPE BOI!", scale=0.1, pos=(0, 0, 0.4), parent=self.winTitleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) ''' title3 = DirectLabel(text = "Play Again?", scale = 0.125, pos = (0, 0, 0.2), parent = self.winTitleMenu, relief = None, text_font = self.font, text_fg = (1, 1, 1, 1)) ''' self.restartButton = DirectButton(text=('Play Again'), pos=(0.5, 0, 0), scale=0.090, command=self.playAgainWin, frameColor=(255, 255, 255, 0.5), text_font=self.font) self.quitButton = DirectButton(text=('Quit Game'), pos=(-0.5, 0, 0), scale=0.090, command=self.quitGame, frameColor=(255, 255, 255, 0.5), text_font=self.font) #self.titleMenuBackdrop.hide() #self.titleMenu.hide() #self.restartButton.hide() #self.quitButton.hide() #self.WintitleMenu.show() self.backSound.stop() self.winSound.play() def gameOverLose(self): # UI that is displayed when a win occurs self.connectButton.hide() #self.trackButton.hide() self.font = loader.loadFont("Fonts/gone.ttf") self.loseTitleMenuBackdrop = DirectFrame(frameColor=(1, 0, 0, 0.5), frameSize=(-1, 1, -1, 1), parent=render2d) self.loseTitleMenu = DirectFrame(frameColor=(1, 1, 1, 0)) title = DirectLabel(text="GAME OVER", scale=0.1, pos=(0, 0, 0.6), parent=self.loseTitleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) if len(self.myFriends) > 1: title2 = DirectLabel(text=str(len(self.myFriends)) + " friends are still sad", scale=0.1, pos=(0, 0, 0.4), parent=self.loseTitleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) else: title2 = DirectLabel(text=str(len(self.myFriends)) + " friend is still sad", scale=0.1, pos=(0, 0, 0.4), parent=self.loseTitleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) ''' title3 = DirectLabel(text = "Play Again?", scale = 0.125, pos = (0, 0, 0.2), parent = self.loseTitleMenu, relief = None, text_font = self.font, text_fg = (1, 1, 1, 1)) ''' self.restartButton = DirectButton(text=('Play Again'), pos=(0.5, 0, 0), scale=0.090, command=self.playAgainLose, frameColor=(255, 255, 255, 0.5), text_font=self.font) self.quitButton = DirectButton(text=('Quit Game'), pos=(-0.5, 0, 0), scale=0.090, command=self.quitGame, frameColor=(255, 255, 255, 0.5), text_font=self.font) #self.titleMenuBackdrop.hide() #self.titleMenu.hide() #self.restartButton.hide() #self.quitButton.hide() def updateScore(self, task): # updates the score by checking to see if any of the friend objects in the myFriends list are within the bounds # of the rescue zone. #self.scoreUI.setText('0') if self.countDownTime <= 0: self.gameOverLose() return task.done if len(self.myFriends) > 0: for friend in self.myFriends: if (friend.getX() > -37 and friend.getX() < -10) \ and (friend.getY() > 110 and friend.getY() < 132): print('scored') self.savedFriends.append(friend) self.score = len(self.savedFriends) scoreString = str(self.score) self.scoreUI.setText('Score: ' + scoreString) self.myFriends.remove(friend) return task.cont elif self.score == self.instanceNumber: self.gameOverWin() else: return task.done def clockUpdate(self, task): # updates countdown timer if self.score == self.instanceNumber: return task.done if self.countDownTime >= 0: minutes = self.countDownTime // 60 seconds = self.countDownTime % 60 if seconds < 10: seconds = "0" + str(seconds) self.countDownUI.setText(str(minutes) + ' : ' + str(seconds)) self.countDownTime -= 1 return task.again else: return task.done def changeCameraAngle(self): if self.angle == 'camFollow': self.cameraSet() if self.angle == 'camSet': self.cameraFollow() def update(self, task): # got tons of help with task manager here: # https://arsthaumaturgis.github.io/Panda3DTutorial.io/tutorial/tut_lesson05.html # Get the amount of time since the last update dt = globalClock.getDt() # iterates over friends list to check if they need a selection light applied for i in range(len(self.myFriends)): self.selectionLight(self.myFriends[i]) for i in range(len(self.savedFriends)): self.savedFriends[i].clearLight() self.savedFriends[i].setLight(self.ambientLightNodePath) # 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.tempActor.setH(0) # changes to face direction of movement self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, 13.0 * dt, 0)) if self.keyMap["down"]: self.tempActor.setH(180) # changes to face direction of movement self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, -13.0 * dt, 0)) if self.keyMap["left"]: self.tempActor.setH(90) # changes to face direction of movement self.tempActor.setPos(self.tempActor.getPos() + Vec3(-13.0 * dt, 0, 0)) if self.keyMap["right"]: self.tempActor.setH(270) # changes to face direction of movement self.tempActor.setPos(self.tempActor.getPos() + Vec3(13.0 * dt, 0, 0)) if self.keyMap["shoot"] and self.gameOver == False: #self.cameraFollow() self.pickUpObject() #self.changeActor("MorgansModels/mainCharacter_walking") if self.keyMap["shoot"] == False and self.gameOver == False: self.setObjectDown() #self.cameraSet() if self.keyMap["camera"]: #self.setObjectDown() self.cameraFollow() #self.changeCameraAngle() if self.keyMap["camera"] == False and self.gameOver == False: #self.setObjectDown() self.cameraSet() #self.changeCameraAngle() #print(self.tempActor.getX(), self.tempActor.getY()) return task.cont
class Game(ShowBase): #Init method setting up ShowBase and the meat of the game def __init__(self): ShowBase.__init__(self) properties = WindowProperties() properties.setSize(1000, 750) self.win.requestProperties(properties) self.disableMouse() #Load in the environment and actor self.environ = loader.loadModel("resources/PandaSampleModels-master/Environment/environment") self.environ.reparentTo(render) self.tempActor = Actor("resources/p3d_samples-master/models/act_p3d_chan", {"walk" : "resources/p3d_samples-master/models/a_p3d_chan_run"}) self.tempActor.reparentTo(render) #Set ambient light ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) render.setLight(self.ambientLightNodePath) #Set directional light mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) #Turn the light around by 45 degrees, and tilt it down by 45 degrees. self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) #Applying a shader that is automatically generated via the setShaderAuto method. render.setShaderAuto() #Move the camera to a position high above the screen #that is, offset it along the z-axis. self.camera.setPos(0, 0, 32) #Tilt the camera down by setting its pitch. self.camera.setP(-90) self.tempActor.getChild(0).setH(180) self.tempActor.loop("walk") #User input dictionary self.userInput = { "up" : False, "down" : False, "left" : False, "right" : False, "shoot" : False } #Tells panda what to do when certain keys are pressed self.accept("w", self.updateUserInput, ["up", True]) self.accept("w-up", self.updateUserInput, ["up", False]) self.accept("s", self.updateUserInput, ["down", True]) self.accept("s-up", self.updateUserInput, ["down", False]) self.accept("a", self.updateUserInput, ["left", True]) self.accept("a-up", self.updateUserInput, ["left", False]) self.accept("d", self.updateUserInput, ["right", True]) self.accept("d-up", self.updateUserInput, ["right", False]) self.accept("mouse1", self.updateUserInput, ["shoot", True]) self.accept("mouse1-up", self.updateUserInput, ["shoot", False]) #Use task-manager to run an update loop self.updateTask = taskMgr.add(self.update, "update") #A pusher prevents solid objects from intersecting other solids self.pusher = CollisionHandlerPusher() #Call the default variable cTrav to have panda update that traverser self.cTrav = CollisionTraverser() self.pusher.setHorizontal(True) colliderNode = CollisionNode("player") #Add a collision-sphere centered on (0,0,0), and with a radius of 0.3 colliderNode.addSolid(CollisionSphere(0, 0, 0, 0.3)) collider = self.tempActor.attachNewNode(colliderNode) # The pusher wants a collider, and a NodePath that # should be moved by that collider's collisions. # In this case, we want the player-Actor to be moved. base.pusher.addCollider(collider, self.tempActor) # The traverser wants a collider, and a handler # that responds to that collider's collisions base.cTrav.addCollider(collider, self.pusher) # Tubes are defined by their start-points, end-points, and radius. # In this first case, the tube goes from (-8, 0, 0) to (8, 0, 0), # and has a radius of 0.2. 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) def updateUserInput(self, controlName, controlState): self.userInput[controlName] = controlState #Method to update the task again if need-be 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.userInput["up"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, 5.0*dt, 0)) if self.userInput["down"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(0, -5.0*dt, 0)) if self.userInput["left"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(-5.0*dt, 0, 0)) if self.userInput["right"]: self.tempActor.setPos(self.tempActor.getPos() + Vec3(5.0*dt, 0, 0)) if self.userInput["shoot"]: print ("Zap!") return task.cont