Example #1
0
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()
Example #2
0
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  
Example #3
0
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
Example #4
0
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)
Example #5
0
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()
Example #6
0
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
Example #7
0
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
Example #8
0
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
Example #9
0
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()
Example #10
0
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
Example #11
0
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()
Example #12
0
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
Example #13
0
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
Example #14
0
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