コード例 #1
0
class character(Actor, FSM, GravityWalker):
    RUNSPEED = 2

    def __init__(self, **kwargs):
        animes = {}
        for a, b, c in os.walk('models/char/animes'):
            for d in c:
                animes[d] = 'models/char/animes/%s' % (d)

        super(character, self).__init__(kwargs['char'], anims=animes)

        self.name = kwargs['name']
        FSM.__init__(self, self.name)
        self.setH(180)

        self.setupAnimes()
        self.interval_setup()
        self.setPos(0, 0, -.2)
        self.setScale(.2)
        self.lockedOnTarget = True
        self.targets = []

        self.anim_playList = []
        self.isAction = {
            'run': False,
            'jump': False,
            'hit_distance': False,
            'idle': False,
            'jumpPunch': False,
            'punch': False,
            'kick': False,
            'strifeLeft': False,
            'strifeRight': False,
            'runLeft': False,
            'runRight': False
        }
        self.animes = {
            'jump': self.jumpping,
            'run': self.running,
            'jumpPunch': self.jumpPunch
        }
        inputState.watch('run', 'player1axis1', None)

    def setupPhysics(self, **kwargs):

        self.worldNp = kwargs['worldnp']
        self.world = kwargs['world']
        h = .2

        w = .1

        shape = BulletCapsuleShape(w, h, ZUp)

        self.character = BulletCharacterControllerNode(
            shape, .5, 'Player_{}'.format(self.name))

        self.characterNP = self.worldNp.attachNewNode(self.character)

        self.characterNP.setH(45)
        self.characterNP.setCollideMask(BitMask32.allOn())

        self.world.attachCharacter(self.character)

        self.floater = NodePath(PandaNode('floater'))
        self.floater.reparentTo(self.characterNP)
        self.floater.setZ(self.characterNP, .52)
        self.floater.setY(self.characterNP.getY() + .25)

    def setupAnimes(self):
        self.running = self.getAnimControl('run.egg')
        self.jumpping = self.getAnimControl('jump.egg')
        self.jumpPunch = self.getAnimControl('jumppunch.egg')
        self.rightPunch = self.getAnimControl('rightpunch.egg')
        self.leftKick = self.getAnimControl('leftkick.egg')
        self.leftKick.setPlayRate(2)
        self.rightPunch.setPlayRate(3)
        self.actionAnim = [self.rightPunch, self.leftKick]
        self.actionList = []

    def setupController(self, joy, player, handler):
        self.game = handler
        if type(joy) != tuple:
            if handler.numofjoy >= 1:
                self.joy = joy['player{}'.format(player + 1)]
                handler.numofjoy -= 1
                taskMgr.add(self.use_joy,
                            'player{}joyUpdate'.format(player + 1))
                self.useKeyboard = False

            else:
                self.joy = 'keyboard{}'.format(player + 1)
                self.useKeyboard = True
                self.use_Keyboard()
        else:
            self.joy = 'keyboard{}'.format(player + 1)
            self.useKeyboard = True
            self.use_Keyboard()

    def setup_collision(self):
        self.player_results = self.world.contactTest(self.character)
        dt = globalClock.getDt()
        for contact in self.player_results.getContacts():
            print(
                str(contact.getNode0()) + ' bumps ' + str(contact.getNode1()))
            mpoint = contact.getManifoldPoint()
            #print(mpoint.getDistance())
            #print(mpoint.getLocalPointA())

    def getModel(self):
        self.reparentTo(self.characterNP)

    def use_Keyboard(self):

        print(self.joy)

    def use_joy(self, task):

        self.button1 = self.joy.get_button(0)
        self.button2 = self.joy.get_button(1)
        self.button3 = self.joy.get_button(2)
        self.button4 = self.joy.get_button(3)
        self.button5 = self.joy.get_button(4)
        self.button6 = self.joy.get_button(5)
        self.button7 = self.joy.get_button(6)
        self.button8 = self.joy.get_button(7)
        self.button9 = self.joy.get_button(8)
        self.button10 = self.joy.get_button(9)
        self.button11 = self.joy.get_button(10)
        self.button12 = self.joy.get_button(11)

        self.axis1 = self.joy.get_axis(0)
        self.axis2 = self.joy.get_axis(1)
        self.axis3 = self.joy.get_axis(2)
        self.axis4 = self.joy.get_axis(3)

        self.dpad = self.joy.get_hat(0)

        for x in self.actionAnim:
            if x.isPlaying():
                if not x in self.actionList:
                    self.actionList.append(x)
                    print('action')
                break

            else:
                if len(self.actionList) > 0:
                    self.actionList.pop(0)

        self.enemy_setup()
        self.joy_controls()

        return task.cont

    def toggleLockOn(self):
        if self.lockedOnTarget:
            self.lockedOnTarget = False
        else:
            self.lockedOnTarget = True

    def joy_controls(self):

        self.speed = Vec3(0, 0, 0)
        omega = globalClock.getDt()

        if not self.lockedOnTarget:
            if self.axis2 > .4:
                self.characterNP.setH(base.camera.getH() + 180)
                self.speed.setY(self.RUNSPEED)

            elif self.axis2 < -.4:
                self.characterNP.setH(base.camera.getH())
                self.speed.setY(self.RUNSPEED)

            elif self.axis1 > .4:
                self.characterNP.setH(base.camera.getH() - 90)
                self.speed.setY(self.RUNSPEED)

            elif self.axis1 < -.4:
                self.characterNP.setH(base.camera.getH() + 90)
                self.speed.setY(self.RUNSPEED)

            if self.axis1 > .4 and self.axis2 < -.4:
                self.characterNP.setH(base.camera.getH() - 45)

            elif self.axis1 > .4 and self.axis2 > .4:
                self.characterNP.setH(base.camera.getH() - 135)

            elif self.axis1 < -.4 and self.axis2 < -.4:
                self.characterNP.setH(base.camera.getH() + 45)

            elif self.axis1 < -.4 and self.axis2 > .4:
                self.characterNP.setH(base.camera.getH() + 135)

            if self.axis3 > .4:
                base.camera.setX(base.camera, +20 * omega)

            elif self.axis3 < -.4:
                base.camera.setX(base.camera, -20 * omega)

        else:
            if self.axis2 > .4:
                self.speed.setY(-6)

            if self.axis2 < -.4:
                self.speed.setY(6)

            if self.axis1 > .4:
                self.speed.setX(5)

            if self.axis1 < -.4:
                self.speed.setX(-5)

            self.characterNP.lookAt(self.targets[0])

        if (self.axis1 < -.4 and self.axis2 < -.4):
            if self.character.isOnGround():
                if not self.isAction['runLeft']:
                    self.runLeft()
                    for action in self.isAction:
                        self.isAction[action] = False
                    self.isAction['runLeft'] = True

        elif (self.axis1 > .4 and self.axis2 < -.4):
            if self.character.isOnGround():
                if not self.isAction['runRight']:
                    self.runRight()
                    for action in self.isAction:
                        self.isAction[action] = False
                    self.isAction['runRight'] = True

        elif self.axis2 > .4:
            if self.button2:
                if self.character.isOnGround():
                    if not self.isAction['jump']:
                        self.jump()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['jump'] = True
                    else:
                        if not len(self.actionList):
                            if self.character.isOnGround():
                                if not self.isAction['idle']:
                                    self.idle()
                                    for a in self.isAction:
                                        self.isAction[a] = False
                                    self.isAction['idle'] = True

            elif self.button1:
                if self.character.isOnGround():
                    if not len(self.actionList):
                        if not self.isAction['punch']:
                            self.punch()
                            for action in self.isAction:
                                self.isAction[action] = False
                            self.isAction['punch'] = True

                    elif not self.character.isOnGround():
                        if not self.isAction['jumpPunch']:
                            self.jump_punch()
                            for action in self.isAction:
                                self.isAction[action] = False
                            self.isAction['jumpPunch'] = True

            else:
                if self.character.isOnGround():
                    if self.isAction['run'] != True:
                        self.run()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['run'] = True

        elif self.axis2 < -.4:
            if self.button2:
                if self.character.isOnGround():
                    if not self.isAction['jump']:
                        self.jump()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['jump'] = True
                    else:
                        if not len(self.actionList):
                            if self.character.isOnGround():
                                if not self.isAction['idle']:
                                    self.idle()
                                    for a in self.isAction:
                                        self.isAction[a] = False
                                    self.isAction['idle'] = True

            elif self.button1:
                if self.character.isOnGround():
                    if not len(self.actionList):
                        if not self.isAction['punch']:
                            self.punch()
                            for action in self.isAction:
                                self.isAction[action] = False
                            self.isAction['punch'] = True

                    elif not self.character.isOnGround():
                        if not self.isAction['jumpPunch']:
                            self.jump_punch()
                            for action in self.isAction:
                                self.isAction[action] = False
                            self.isAction['jumpPunch'] = True

            else:
                if self.character.isOnGround():
                    if self.isAction['run'] != True:
                        self.run()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['run'] = True

        elif self.axis1 > .4:
            if self.lockedOnTarget:
                if self.character.isOnGround():
                    if self.isAction['strifeRight'] != True:
                        self.strifeRight()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['strifeRight'] = True

            else:
                if self.character.isOnGround():
                    if self.isAction['run'] != True:
                        self.run()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['run'] = True

        elif self.axis1 < -.4:
            if self.lockedOnTarget:
                if self.character.isOnGround():
                    if self.isAction['strifeLeft'] != True:
                        self.strifeLeft()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['strifeLeft'] = True

            else:
                if self.character.isOnGround():
                    if self.isAction['run'] != True:
                        self.run()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['run'] = True

        elif self.button2:
            if self.character.isOnGround():
                if not self.isAction['jump']:
                    self.jump()
                    for action in self.isAction:
                        self.isAction[action] = False
                    self.isAction['jump'] = True

                else:
                    if not len(self.actionList):
                        if self.character.isOnGround():
                            if not self.isAction['idle']:
                                self.idle()
                                for a in self.isAction:
                                    self.isAction[a] = False
                                self.isAction['idle'] = True

        elif self.button1:
            if self.character.isOnGround():
                if not len(self.actionList):
                    if not self.isAction['punch']:
                        self.punch()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['punch'] = True

            elif not self.character.isOnGround():
                if not self.isAction['jumpPunch']:
                    self.jump_punch()
                    for action in self.isAction:
                        self.isAction[action] = False
                    self.isAction['jumpPunch'] = True

        elif self.button3:
            if self.character.isOnGround():
                if not len(self.actionList):
                    if not self.isAction['kick']:
                        self.kick()
                        for action in self.isAction:
                            self.isAction[action] = False
                        self.isAction['kick'] = True

                    else:
                        if not len(self.actionList):
                            if self.character.isOnGround():
                                if not self.isAction['idle']:
                                    self.idle()
                                    for a in self.isAction:
                                        self.isAction[a] = False
                                    self.isAction['idle'] = True
        else:
            if not len(self.actionList):
                if self.character.isOnGround():
                    if not self.isAction['idle']:
                        self.idle()
                        for a in self.isAction:
                            self.isAction[a] = False
                        self.isAction['idle'] = True

        if self.button5:
            self.toggleLockOn()
        self.character.setLinearMovement(self.speed, True)

    def enemy_setup(self):
        for enemy in self.game.listOfPlayers:
            if enemy.character.name != self.character.name:
                if not enemy in self.targets:
                    self.targets.append(enemy)

    def interval_setup(self):
        self.jumpInterval = self.actorInterval('jump.egg',
                                               loop=0,
                                               startFrame=1,
                                               endFrame=10)
        self.jumpPunchInterval = self.actorInterval(
            'jumppunch.egg',
            playRate=2,
            loop=0,
            startFrame=self.jumpPunch.getNumFrames() / 2,
            endFrame=self.jumpPunch.getNumFrames())

    def lockON(self, player):
        self.characterNP.lookAt(player)

    def punch(self):
        self.request('Punch')

    def kick(self):
        self.request('Kick')

    def jump_punch(self):
        self.request('JumpPunch')

    def jump(self):
        self.request('Jump')

    def run(self):
        self.request('Run')

    def runLeft(self):
        self.request('RunLeft')

    def runRight(self):
        self.request('RunRight')

    def strifeLeft(self):
        self.request('StrifeLeft')

    def strifeRight(self):
        self.request('StrifeRight')

    def idle(self):
        self.request('Idle')

    #Finite State Rquests
    def enterJumpPunch(self):
        self.jumpPunchInterval.start()

    def enterPunch(self):
        self.rightPunch.play()

    def enterKick(self):
        self.leftKick.play()

    def enterJump(self):

        self.character.setMaxJumpHeight(5.0)
        self.character.setJumpSpeed(2.0)
        self.jumpInterval.start()
        self.character.doJump()

    def enterIdle(self):
        self.loop('idle.egg')

    def enterRun(self):
        self.loop('run.egg')

    def enterRunLeft(self):
        self.loop('runleft.egg')

    def enterRunRight(self):
        self.loop('runright.egg')

    def enterStrifeLeft(self):
        self.loop('leftstrife.egg')

    def enterStrifeRight(self):
        self.loop('rightstrife.egg')

    def exitJumpPunch(self):
        self.jumpPunchInterval.finish()

    def exitRun(self):
        self.stop()

    def exitRunLeft(self):
        self.stop()

    def exitRunRight(self):
        self.stop()

    def exitStrifeLeft(self):
        self.stop()

    def exitStrifeRight(self):
        self.stop()

    def exitPunch(self):
        self.stop()

    def exitKick(self):
        self.stop()

    def exitJump(self):
        self.stop()

    def exitIdle(self):
        self.stop()

    def debug_mode(self):
        pass
コード例 #2
0
class Character():
    def __init__(self, world, render, name, animator, position, pose):
        # Create a box shape
        shape = BulletBoxShape(Vec3(0.3, 0.2, 0.7))
        # Create a Controller Node with the shape
        self.controllerNode = BulletCharacterControllerNode(shape, 0.4, name)
        self.controllerNode.setIntoCollideMask(BitMask32.allOn())
        # Attach the Controller Node to the world
        world.attachCharacter(self.controllerNode)

        # Attach Controller Node to the render and get a NodePath
        self.nodePath = render.attachNewNode(self.controllerNode)
        # Setup the nodePath
        self.nodePath.setCollideMask(BitMask32.allOn())
        self.nodePath.setH(DEFAULT_NODEPATH_HEIGHT)
        self.nodePath.setPos(position)

        # Set the actor of the Character
        self.animator = animator

        # Add animator to NodePath so it can be rendered
        self.animator.reparentTo(self.nodePath)
        # Configure the animator
        self.animator.setScale(DEFAULT_ANIMATOR_SCALE)
        self.animator.setH(DEFAULT_ANIMATOR_HEIGHT)
        self.animator.setPos(DEFAULT_ANIMATOR_OFFSET)

        # Set Current Character Pose
        self.pose = pose

        # Save home position
        self.home = position

    # ==========    Character Controls
    def lookAt(self, position):
        position.setZ(self.getPosition().getZ())
        self.nodePath.lookAt(position)

    def movement(self, vector):
        self.controllerNode.setLinearMovement(vector, True)

    # ==========    Getters
    def getNodePath(self):
        return self.nodePath

    def getHeight(self):
        return self.nodePath.getZ()

    def getPosition(self):
        return self.nodePath.getPos()

    def getPose(self):
        return self.pose

    def getControllerNode(self):
        return self.controllerNode

    def getCurrentPoseName(self):
        return self.getCurrentAnim()

    def getHomePosition(self):
        return self.home

    # ==========    Setters
    def setPosition(self, position):
        self.nodePath.setPos(position)

    def setPose(self, pose):
        if self.animator.getCurrentAnim() != 'jump':
            if pose == JUMPING:
                self.animator.stop()
                self.animator.play('jump')
                self.pose = JUMPING
            else:
                if self.pose != pose:
                    self.pose = pose
                    self.animator.stop()
                    if (self.pose == RUNNING):
                        self.animator.loop('run')
                    elif (self.pose == WALKING):
                        self.animator.loop('run')
                    elif (self.pose == STANDING):
                        self.animator.pose('walk', 0)
                    elif (self.pose == ATTACKING):
                        self.animator.loop('attack')
                        self.pose == STANDING

    # ==========    Boolean Functions
    def isWalking(self):
        animate = self.animator.getCurrentAnim()
        return animate == 'walk' or animate == 'run'

    def isAttacking(self):
        animate = self.animator.getCurrentAnim()
        return animate == 'attack'

    def goBackHome(self):
        return
コード例 #3
0
class Character2(object):
    def __init__(self):

        self.models = Models2()
        self.health = 100.0
        self.lost = 0
        self.won = 0
        self.debug = False
        self.ev = False
        self.re = False
        self.isMoving = False
        self.nextLevel = False
        self.b3 = 0

        self.setUp()
        self.setUpEnemies()
        taskMgr.add(self.update, 'update')
        taskMgr.add(self.updateItems, 'updateItems')
        taskMgr.add(self.updateEnemies, 'updateEnemies')
        taskMgr.add(self.updateEndPoint, 'updateEndPoint')

        self.mySoundRing = base.loader.loadSfx("sound/ring.mp3")
        self.mySoundPunch = base.loader.loadSfx("sound/punch_or_whack.mp3")
        self.mySoundEvil = base.loader.loadSfx("sound/Evil_Laugh_Male.mp3")
        self.mySoundEndFx = base.loader.loadSfx("sound/End_Fx.mp3")
        self.mySoundEnd = base.loader.loadSfx("sound/Fireworks.mp3")
        self.mySoundRunning = base.loader.loadSfx("sound/running.mp3")
        self.mySoundJump = base.loader.loadSfx("sound/jump.mp3")

    def setUpEnemies(self):
        h2 = 3.75
        w2 = 1.1
        shape2 = BulletCapsuleShape(w2, h2 - 2 * w2, ZUp)

        self.e1 = BulletRigidBodyNode("E1")
        self.e1.setMass(0)
        self.e1.addShape(shape2)
        self.e1NP = render.attachNewNode(self.e1)
        self.e1NP.setPos(self.models.box6.getX(), self.models.box6.getY(),
                         self.models.box6.getZ() + 3)
        self.e1NP.setCollideMask(BitMask32.allOn())
        self.models.world.attachRigidBody(self.e1)

        self.actorNPe1 = loader.loadModel('models/mummy/mummy.egg')

        self.actorNPe1.reparentTo(self.e1NP)
        self.actorNPe1.setScale(0.05)
        self.actorNPe1.setPos(0, 0, -1.0)
        self.e1Hited = 0

        h3 = 3.75
        w3 = 1.1
        shape3 = BulletCapsuleShape(w3, h3 - 2 * w3, ZUp)

        self.e2 = BulletRigidBodyNode("E2")
        self.e2.setMass(0)
        self.e2.addShape(shape3)
        self.e2NP = render.attachNewNode(self.e2)
        self.e2NP.setPos(self.models.Cylinder1.getX(),
                         self.models.Cylinder1.getY(),
                         self.models.Cylinder1.getZ() + 3)
        self.e2NP.setCollideMask(BitMask32.allOn())
        self.models.world.attachRigidBody(self.e2)

        self.actorNPe2 = loader.loadModel('models/mummy/mummy.egg')

        self.actorNPe2.reparentTo(self.e2NP)
        self.actorNPe2.setScale(0.05)
        self.actorNPe2.setPos(0, 0, -1.0)
        self.e2Hited = 0

        h4 = 3.75
        w4 = 1.1
        shape4 = BulletCapsuleShape(w4, h4 - 2 * w4, ZUp)

        self.e3 = BulletRigidBodyNode("E3")
        self.e3.setMass(0)
        self.e3.addShape(shape4)
        self.e3NP = render.attachNewNode(self.e3)
        self.e3NP.setPos(self.models.Cylinder2.getX(),
                         self.models.Cylinder2.getY(),
                         self.models.Cylinder2.getZ() + 3)
        self.e3NP.setCollideMask(BitMask32.allOn())
        self.models.world.attachRigidBody(self.e3)

        self.actorNPe3 = loader.loadModel('models/mummy/mummy.egg')

        self.actorNPe3.reparentTo(self.e3NP)
        self.actorNPe3.setScale(0.05)
        self.actorNPe3.setPos(0, 0, -1.0)
        self.e3Hited = 0

        h5 = 3.75
        w5 = 1.1
        shape5 = BulletCapsuleShape(w5, h5 - 2 * w5, ZUp)

        self.e4 = BulletRigidBodyNode("E4")
        self.e4.setMass(0)
        self.e4.addShape(shape5)
        self.e4NP = render.attachNewNode(self.e4)
        self.e4NP.setPos(self.models.Cylinder3.getX(),
                         self.models.Cylinder3.getY(),
                         self.models.Cylinder3.getZ() + 3)
        self.e4NP.setCollideMask(BitMask32.allOn())
        self.models.world.attachRigidBody(self.e4)

        self.actorNPe4 = loader.loadModel('models/mummy/mummy.egg')

        self.actorNPe4.reparentTo(self.e4NP)
        self.actorNPe4.setScale(0.05)
        self.actorNPe4.setPos(0, 0, -1.0)
        self.e4Hited = 0

    def setUp(self):
        self.itemNumber = 0
        self.incBar()

        # Character
        h = 1.75
        w = 0.4
        shape = BulletCapsuleShape(w, h - 2 * w, ZUp)

        self.character = BulletCharacterControllerNode(shape, 0.4, 'Player')
        self.characterNP = render.attachNewNode(self.character)
        self.characterNP.setPos(0, 0, 130)
        self.characterNP.setH(180)
        self.characterNP.setCollideMask(BitMask32.allOn())
        self.models.world.attachCharacter(self.character)

        self.actorNP = Actor(
            'models/Bricker/Bricker3.egg', {
                'run': 'models/Bricker/Bricker-run.egg',
                'walk': 'models/Bricker/Bricker-walk.egg',
                'jump': 'models/Bricker/Bricker-jump.egg',
                'fallbackGetup': 'models/Bricker/FallbackGetup.egg',
                'fallforwardGetup':
                'models/Bricker/Bricker-FallforwardGetup.egg',
                'fireball': 'models/Bricker/Bricker-fireball.egg',
                'punching': 'models/Bricker/Bricker-punching.egg',
                'superpunch': 'models/Bricker/Bricker-superpunch.egg'
            })

        self.actorNP.reparentTo(self.characterNP)
        self.actorNP.setScale(0.3)
        self.actorNP.setH(180)
        self.actorNP.setPos(0, 0, 0.2)

        #enemies

        #self.setUpEnemies()

        #debug

        self.debugNode = BulletDebugNode('Debug')
        self.debugNode.showWireframe(True)
        self.debugNode.showConstraints(True)
        self.debugNode.showBoundingBoxes(False)
        self.debugNode.showNormals(False)
        self.debugNP = render.attachNewNode(self.debugNode)
        self.debugNP.hide()
        self.models.world.setDebugNode(self.debugNP.node())

    def doJump(self):
        self.character.setMaxJumpHeight(15.0)
        self.character.setJumpSpeed(8.0)
        self.character.doJump()

    def processInput(self, dt):
        speed = Vec3(0, 0, 0)
        omega = 0.0

        if inputState.isSet('forward') and self.won == 0 and self.lost == 0:

            if inputState.isSet('speedUp'):
                speed.setY(20.0)
            else:
                speed.setY(10.0)

        if inputState.isSet('reverse') and self.won == 0 and self.lost == 0:
            if inputState.isSet('speedUp'):
                speed.setY(-20.0)
            else:
                speed.setY(-10.0)

        if inputState.isSet('turnLeft') and self.won == 0 and self.lost == 0:
            omega = 60.0

        if inputState.isSet('turnRight') and self.won == 0 and self.lost == 0:
            omega = -60.0

        if inputState.isSet('jump') and self.won == 0 and self.lost == 0:
            self.actorNP.loop("jump")
            self.mySoundRunning.stop()
            self.mySoundJump.play()
            self.mySoundJump.setVolume(0.6)
            self.doJump()

        if inputState.isSet('hit') and self.won == 0 and self.lost == 0:
            self.actorNP.loop("punching")
            speed.setY(30.0)

        if inputState.isSet('debug') and self.won == 0 and self.lost == 0:
            if self.debug == True:
                self.debug = False
            else:
                self.debug = True

        if inputState.isSet('forward') or inputState.isSet(
                'reverse') or inputState.isSet('turnLeft') or inputState.isSet(
                    'turnRight'):
            if self.isMoving is False and self.won == 0 and self.lost == 0:
                self.actorNP.loop("run")
                self.isMoving = True
                self.mySoundRunning.play()
                self.mySoundRunning.setVolume(0.4)
        else:
            if self.isMoving:
                self.actorNP.stop()
                self.actorNP.pose("walk", 0)
                self.isMoving = False
                self.mySoundRunning.stop()

        if inputState.isSet(
                'rotateCamLeft') and self.won == 0 and self.lost == 0:
            base.camera.setX(base.camera, -20 * globalClock.getDt())
        if inputState.isSet(
                'rotateCamRight') and self.won == 0 and self.lost == 0:
            base.camera.setX(base.camera, +20 * globalClock.getDt())

        self.character.setAngularMovement(omega)
        self.character.setLinearMovement(speed, True)

    def update(self, task):

        if self.debug == True:
            self.debugNP.show()
        else:
            self.debugNP.hide()

        angleDegrees = task.time * 1000.0
        angleRadians = angleDegrees * (pi / 180.0)

        self.models.Cylinder1.setHpr(angleRadians, 0, 0)
        self.models.np16.setHpr(angleRadians, 0, 0)

        self.models.Cylinder2.setHpr(-angleRadians, 0, 0)
        self.models.np17.setHpr(-angleRadians, 0, 0)

        self.models.Cylinder3.setHpr(angleRadians, 0, 0)
        self.models.np18.setHpr(angleRadians, 0, 0)

        self.models.Cylinder4.setHpr(-angleRadians, 0, 0)
        self.models.np19.setHpr(-angleRadians, 0, 0)

        if self.models.np19.is_empty(
        ) == False and self.models.Cylinder4.is_empty() == False:

            if self.testWithSingleBody(
                    self.models.node19) == True and inputState.isSet(
                        'forward') == False and inputState.isSet(
                            'reverse') == False and inputState.isSet(
                                'turnLeft') == False and inputState.isSet(
                                    'turnRight') == False and inputState.isSet(
                                        'jump') == False:

                self.characterNP.setPos(0, -5, 220)
                self.mySoundEndFx.play()

        return task.cont

    def updateItems(self, task):

        angleDegrees = task.time * 1000.0
        angleRadians = angleDegrees * (pi / 180.0)

        for i in range(self.models.index):

            if self.models.iteamsNpsList[i].is_empty(
            ) == False and self.models.iteamsModelsList[i].is_empty() == False:
                self.models.iteamsModelsList[i].setHpr(angleRadians * 10, 90,
                                                       0)
                self.models.iteamsNpsList[i].setHpr(angleRadians * 10, 90, 0)

                if self.testWithSingleBody(
                        self.models.iteamsNodesList[i]) == True:
                    self.models.iteamsModelsList[i].setZ(2000)
                    self.models.iteamsNpsList[i].setZ(2000)
                    self.models.iteamsModelsList[i].remove_node()
                    self.models.iteamsNpsList[i].remove_node()

                    self.mySoundRing.play()

                    self.itemNumber += 1
                    self.item.destroy()
                    self.item = DirectFrame(text=str(self.itemNumber),
                                            scale=0.07,
                                            pos=(0.9, 0.5, 0.8),
                                            frameColor=(0, 0, 0, 0),
                                            text_fg=(1, 1, 1, 1),
                                            text_shadow=(0, 0, 0, 0.9))

        return task.cont

    def youLost(self):

        if (self.health < 1
                or self.characterNP.getZ() < 90) and self.lost == 0:
            taskMgr.remove('updateEnemies')

            self.lost = DirectFrame(text="You Lost",
                                    scale=0.2,
                                    pos=(0, 0, 0),
                                    frameColor=(0, 0, 0, 0),
                                    text_fg=(1, 0, 0, 1),
                                    text_shadow=(0, 0, 0, 0.9))

            p = float(
                float(self.itemNumber) / float(self.models.index) * 100.0)
            d = int(p)
            self.lost2 = DirectFrame(text="You Collected " + str(d) +
                                     "% of the Items",
                                     scale=0.1,
                                     pos=(0, 0, -0.15),
                                     frameColor=(0, 0, 0, 0),
                                     text_fg=(1, 1, 1, 1),
                                     text_shadow=(0, 0, 0, 0.9))

            self.b = DirectButton(text="Exit",
                                  scale=.07,
                                  command=sys.exit,
                                  pos=(-0.3, 0, -0.3),
                                  text_shadow=(0, 0, 0, 0.9),
                                  text_bg=(0, 0, 0, 1),
                                  text_fg=(1, 1, 1, 1))

            self.b2 = DirectButton(text="Restart",
                                   scale=.07,
                                   command=self.setRestart,
                                   pos=(0.3, 0, -0.3),
                                   text_shadow=(0, 0, 0, 0.9),
                                   text_bg=(0, 0, 0, 1),
                                   text_fg=(1, 1, 1, 1))

    def updateEnemies(self, task):

        self.youLost()

        if self.testWithSingleBody(self.models.node6) == True:

            if self.actorNPe1.is_empty() == False and self.e1NP.is_empty(
            ) == False:
                if self.ev == False:
                    self.mySoundEvil.play()
                    self.ev = True

                vecE1 = self.characterNP.getPos() - self.e1NP.getPos()
                vecE1.setZ(0)
                vecE1.normalize()
                self.e1NP.setPos(self.e1NP.getPos() + vecE1 * (1.0 / 10.0))
                self.actorNPe1.setH(self.actorNPe1.getH() -
                                    1000 * globalClock.getDt())

        if self.testWithSingleBody(self.models.node16) == True:

            if self.actorNPe2.is_empty() == False and self.e2NP.is_empty(
            ) == False:

                if self.ev == False:
                    self.mySoundEvil.play()
                    self.ev = True

                vecE2 = self.characterNP.getPos() - self.e2NP.getPos()
                vecE2.setZ(0)
                vecE2.normalize()
                self.e2NP.setPos(self.e2NP.getPos() + vecE2 * (1.0 / 10.0))
                self.actorNPe2.setH(self.actorNPe2.getH() -
                                    1000 * globalClock.getDt())

        if self.testWithSingleBody(self.models.node17) == True:

            if self.actorNPe3.is_empty() == False and self.e3NP.is_empty(
            ) == False:

                if self.ev == False:
                    self.mySoundEvil.play()
                    self.ev = True

                vecE3 = self.characterNP.getPos() - self.e3NP.getPos()
                vecE3.setZ(0)
                vecE3.normalize()
                self.e3NP.setPos(self.e3NP.getPos() + vecE3 * (1.0 / 10.0))
                self.actorNPe3.setH(self.actorNPe3.getH() -
                                    1000 * globalClock.getDt())

        if self.testWithSingleBody(self.models.node18) == True:

            if self.actorNPe4.is_empty() == False and self.e4NP.is_empty(
            ) == False:

                if self.ev == False:
                    self.mySoundEvil.play()
                    self.ev = True

                vecE4 = self.characterNP.getPos() - self.e4NP.getPos()
                vecE4.setZ(0)
                vecE4.normalize()
                self.e4NP.setPos(self.e4NP.getPos() + vecE4 * (1.0 / 10.0))
                self.actorNPe4.setH(self.actorNPe4.getH() -
                                    1000 * globalClock.getDt())

        if self.testWithSingleBody(self.e1) == True:
            self.pain()
            if inputState.isSet('hit'):
                self.e1Hited += 1.0
                self.mySoundPunch.play()
                self.mySoundPunch.setVolume(0.5)
                if self.actorNPe1.is_empty() == False and self.e1NP.is_empty(
                ) == False and self.e1Hited > 3:
                    self.actorNPe1.setZ(2000)
                    self.e1NP.setZ(2000)
                    self.actorNPe1.remove_node()
                    self.e1NP.remove_node()

        if self.testWithSingleBody(self.e2) == True:
            self.pain()
            if inputState.isSet('hit'):
                self.e2Hited += 1.0
                self.mySoundPunch.play()
                self.mySoundPunch.setVolume(0.5)
                if self.actorNPe2.is_empty() == False and self.e2NP.is_empty(
                ) == False and self.e2Hited > 3:
                    self.actorNPe2.setZ(2000)
                    self.e2NP.setZ(2000)
                    self.actorNPe2.remove_node()
                    self.e2NP.remove_node()

        if self.testWithSingleBody(self.e3) == True:
            self.pain()
            if inputState.isSet('hit'):
                self.e3Hited += 1.0
                self.mySoundPunch.play()
                self.mySoundPunch.setVolume(0.5)
                if self.actorNPe3.is_empty() == False and self.e3NP.is_empty(
                ) == False and self.e3Hited > 3:
                    self.actorNPe3.setZ(2000)
                    self.e3NP.setZ(2000)
                    self.actorNPe3.remove_node()
                    self.e3NP.remove_node()

        if self.testWithSingleBody(self.e4) == True:
            self.pain()
            if inputState.isSet('hit'):
                self.e4Hited += 1.0
                self.mySoundPunch.play()
                self.mySoundPunch.setVolume(0.5)
                if self.actorNPe4.is_empty() == False and self.e4NP.is_empty(
                ) == False and self.e4Hited > 3:
                    self.actorNPe4.setZ(2000)
                    self.e4NP.setZ(2000)
                    self.actorNPe4.remove_node()
                    self.e4NP.remove_node()

        return task.cont

    def incBar(self):
        # Create a frame
        # Add button
        self.bar = DirectWaitBar(text="HEALTH",
                                 value=self.health,
                                 range=100,
                                 pos=(0.8, 0.5, 0.9),
                                 scale=0.5,
                                 barColor=(0, 0.9, 0, 1),
                                 text_fg=(0, 0.5, 0, 1),
                                 text_shadow=(0, 0, 0, 0.5))

        self.frame = DirectFrame(text=" Items #",
                                 scale=0.07,
                                 pos=(0.7, 0.5, 0.8),
                                 frameColor=(0, 0, 0, 0),
                                 text_fg=(1, 1, 1, 1),
                                 text_shadow=(0, 0, 0, 0.9))

        self.item = DirectFrame(text=str(self.itemNumber),
                                scale=0.07,
                                pos=(0.9, 0.5, 0.8),
                                frameColor=(0, 0, 0, 0),
                                text_fg=(1, 1, 1, 1),
                                text_shadow=(0, 0, 0, 0.9))

    def pain(self):
        self.bar.destroy()
        self.health -= 0.3
        if self.health < 101 and self.health > 70:
            self.bar = DirectWaitBar(text="HEALTH",
                                     value=self.health,
                                     range=100,
                                     pos=(0.8, 0.5, 0.9),
                                     scale=0.5,
                                     barColor=(0, 0.9, 0, 1),
                                     text_fg=(0, 0.5, 0, 1),
                                     text_shadow=(0, 0, 0, 0.5))
        elif self.health < 71 and self.health > 40:
            self.bar = DirectWaitBar(text="HEALTH",
                                     value=self.health,
                                     range=100,
                                     pos=(0.8, 0.5, 0.9),
                                     scale=0.5,
                                     barColor=(0.9, 0.9, 0, 1),
                                     text_fg=(0.5, 0.5, 0, 1),
                                     text_shadow=(0, 0, 0, 0.5))
        else:
            self.bar = DirectWaitBar(text="HEALTH",
                                     value=self.health,
                                     range=100,
                                     pos=(0.8, 0.5, 0.9),
                                     scale=0.5,
                                     barColor=(0.9, 0, 0, 1),
                                     text_fg=(0.5, 0, 0, 1),
                                     text_shadow=(0, 0, 0, 0.5))

    def updateEndPoint(self, task):

        angleDegrees = task.time * 5000.0
        angleRadians = angleDegrees * (pi / 180.0)

        if self.models.npEnd.is_empty(
        ) == False and self.models.endpoint.is_empty(
        ) == False and self.won == 0:

            self.models.endpoint.setHpr(angleRadians, 0, 0)
            self.models.npEnd.setHpr(angleRadians, 0, 0)

            if self.testWithSingleBody(self.models.nodeEnd) == True:
                self.mySoundEnd.play()
                self.models.endpoint.remove_node()
                self.models.npEnd.remove_node()
                self.won = DirectFrame(text="You Won",
                                       scale=0.2,
                                       pos=(0, 0, 0),
                                       frameColor=(0, 0, 0, 0),
                                       text_fg=(0.5, 1, 0.5, 1),
                                       text_shadow=(0, 0, 0, 0.9))

                p = float(
                    float(self.itemNumber) / float(self.models.index) * 100.0)
                d = int(p)
                self.won2 = DirectFrame(text="You Collected " + str(d) +
                                        "% of the Items",
                                        scale=0.1,
                                        pos=(0, 0, -0.15),
                                        frameColor=(0, 0, 0, 0),
                                        text_fg=(1, 1, 1, 1),
                                        text_shadow=(0, 0, 0, 0.9))

                self.b = DirectButton(text="Exit",
                                      scale=.07,
                                      command=sys.exit,
                                      pos=(-0.3, 0, -0.3),
                                      text_shadow=(0, 0, 0, 0.9),
                                      text_bg=(0, 0, 0, 1),
                                      text_fg=(1, 1, 1, 1))

                self.b2 = DirectButton(text="Restart",
                                       scale=.07,
                                       command=self.setRestart,
                                       pos=(0.3, 0, -0.3),
                                       text_shadow=(0, 0, 0, 0.9),
                                       text_bg=(0, 0, 0, 1),
                                       text_fg=(1, 1, 1, 1))
                self.b3 = DirectButton(text="Go To Level 1",
                                       scale=.07,
                                       command=self.nextLevel1,
                                       pos=(0, 0, -0.5),
                                       text_shadow=(0, 0, 0, 0.9),
                                       text_bg=(0, 0, 0, 1),
                                       text_fg=(1, 1, 1, 1))

        return task.cont

    def testWithSingleBody(self, secondNode):
        contactResult = self.models.world.contactTestPair(
            self.character, secondNode)  # returns a BulletContactResult object
        if len(contactResult.getContacts()) > 0:
            return True

    def setRestart(self):
        self.re = True
        taskMgr.remove('update')
        taskMgr.remove('updateItems')
        taskMgr.remove('updateEnemies')
        taskMgr.remove('updateEndPoint')

        self.itemNumber = 0
        self.item.destroy()
        self.item = DirectFrame(text=str(self.itemNumber),
                                scale=0.07,
                                pos=(0.9, 0.5, 0.8),
                                frameColor=(0, 0, 0, 0),
                                text_fg=(1, 1, 1, 1),
                                text_shadow=(0, 0, 0, 0.9))

        for i in range(self.models.index):

            if self.models.iteamsNpsList[i].is_empty(
            ) == False and self.models.iteamsModelsList[i].is_empty() == False:
                self.models.iteamsModelsList[i].setZ(2000)
                self.models.iteamsNpsList[i].setZ(2000)
                self.models.iteamsModelsList[i].remove_node()
                self.models.iteamsNpsList[i].remove_node()

        self.models.iteamsModelsList = 0
        self.models.iteamsNodesList = 0
        self.models.iteamsNpsList = 0

        self.models.setupItems()

        if (self.won != 0):
            self.won.destroy()
            self.won2.destroy()
            self.models.setupEndPoint()

        if (self.lost != 0):
            self.lost.destroy()
            self.lost2.destroy()

        self.b.destroy()
        self.b2.destroy()

        if (self.b3 != 0):
            self.b3.destroy()

        self.bar.destroy()
        self.health = 100
        self.bar = DirectWaitBar(text="HEALTH",
                                 value=self.health,
                                 range=100,
                                 pos=(0.8, 0.5, 0.9),
                                 scale=0.5,
                                 barColor=(0, 0.9, 0, 1),
                                 text_fg=(0, 0.5, 0, 1),
                                 text_shadow=(0, 0, 0, 0.5))

        self.won = 0

        self.characterNP.setPos(0, 0, 130)
        self.characterNP.setH(180)

        if self.actorNPe1.is_empty() == False and self.e1NP.is_empty(
        ) == False:
            self.actorNPe1.setZ(2000)
            self.e1NP.setZ(2000)
            self.actorNPe1.remove_node()
            self.e1NP.remove_node()

        if self.actorNPe2.is_empty() == False and self.e2NP.is_empty(
        ) == False:
            self.actorNPe2.setZ(2000)
            self.e2NP.setZ(2000)
            self.actorNPe2.remove_node()
            self.e2NP.remove_node()

        if self.actorNPe3.is_empty() == False and self.e3NP.is_empty(
        ) == False:
            self.actorNPe3.setZ(2000)
            self.e3NP.setZ(2000)
            self.actorNPe3.remove_node()
            self.e3NP.remove_node()

        if self.actorNPe4.is_empty() == False and self.e4NP.is_empty(
        ) == False:
            self.actorNPe4.setZ(2000)
            self.e4NP.setZ(2000)
            self.actorNPe4.remove_node()
            self.e4NP.remove_node()

        self.setUpEnemies()

        base.camera.setPos(self.characterNP.getX(),
                           self.characterNP.getY() + 10, 5)
        base.camera.setHpr(self.characterNP.getHpr())
        base.camera.lookAt(self.characterNP)

        self.lost = 0

        taskMgr.add(self.update, 'update')
        taskMgr.add(self.updateItems, 'updateItems')
        taskMgr.add(self.updateEnemies, 'updateEnemies')
        taskMgr.add(self.updateEndPoint, 'updateEndPoint')

    def removeAll(self):
        self.re = True
        taskMgr.remove('update')
        taskMgr.remove('updateItems')
        taskMgr.remove('updateEnemies')
        taskMgr.remove('updateEndPoint')

        self.itemNumber = 0
        self.item.destroy()

        for i in range(self.models.index):
            if self.models.iteamsNpsList[i].is_empty(
            ) == False and self.models.iteamsModelsList[i].is_empty() == False:
                self.models.iteamsModelsList[i].setZ(2000)
                self.models.iteamsNpsList[i].setZ(2000)
                self.models.iteamsModelsList[i].remove_node()
                self.models.iteamsNpsList[i].remove_node()

        self.models.iteamsModelsList = 0
        self.models.iteamsNodesList = 0
        self.models.iteamsNpsList = 0

        if (self.won != 0):
            self.won.destroy()
            self.won2.destroy()
            self.b.destroy()
            self.b2.destroy()
            self.b3.destroy()

        if (self.lost != 0):
            self.lost.destroy()
            self.lost2.destroy()
            self.b.destroy()
            self.b2.destroy()
            self.b3.destroy()

        self.bar.destroy()
        self.health = 100

        self.won = 0

        self.lost = 0

        self.actorNP.remove_node()
        self.characterNP.remove_node()

        self.models.sky.remove_node()
        self.models.groundNp.remove_node()

        self.models.endpoint.remove_node()
        self.models.npEnd.remove_node()

        self.models.np1.remove_node()
        self.models.box1.remove_node()
        self.models.np2.remove_node()
        self.models.box2.remove_node()
        self.models.np3.remove_node()
        self.models.box3.remove_node()
        self.models.np4.remove_node()
        self.models.box4.remove_node()
        self.models.np5.remove_node()
        self.models.box5.remove_node()
        self.models.box6.remove_node()
        self.models.np6.remove_node()
        self.models.Cylinder1.remove_node()
        self.models.np16.remove_node()
        self.models.Cylinder2.remove_node()
        self.models.np17.remove_node()
        self.models.Cylinder3.remove_node()
        self.models.np18.remove_node()
        self.models.Cylinder4.remove_node()
        self.models.np19.remove_node()
        self.models.fire.remove_node()
        self.models.np7.remove_node()
        self.models.box7.remove_node()

        if self.actorNPe1.is_empty() == False and self.e1NP.is_empty(
        ) == False:
            self.actorNPe1.setZ(2000)
            self.e1NP.setZ(2000)
            self.actorNPe1.remove_node()
            self.e1NP.remove_node()

        if self.actorNPe2.is_empty() == False and self.e2NP.is_empty(
        ) == False:
            self.actorNPe2.setZ(2000)
            self.e2NP.setZ(2000)
            self.actorNPe2.remove_node()
            self.e2NP.remove_node()

        if self.actorNPe3.is_empty() == False and self.e3NP.is_empty(
        ) == False:
            self.actorNPe3.setZ(2000)
            self.e3NP.setZ(2000)
            self.actorNPe3.remove_node()
            self.e3NP.remove_node()

        if self.actorNPe4.is_empty() == False and self.e4NP.is_empty(
        ) == False:
            self.actorNPe4.setZ(2000)
            self.e4NP.setZ(2000)
            self.actorNPe4.remove_node()
            self.e4NP.remove_node()

    def nextLevel1(self):
        self.nextLevel = True
コード例 #4
0
ファイル: Player.py プロジェクト: nextmatrixman/UpAllTheWay
class Player(object):
  def __init__(self, render, world, x, y, z):
    self.render = render
    self.world = world
    self.x = x
    self.y = y
    self.z = z
    
    # Game state variables
    self.isMoving = False
    self.isJumping = False
    
    # This is used to store which keys are currently pressed.
    self.keyMap = {"left": 0, "right": 0, "forward": 0, "reverse": 0}
    
    # Defining sound effects
    self.jumpSound = base.loader.loadSfx("sounds/jumping.wav")
    self.runSound = base.loader.loadSfx("sounds/running.ogg")
    
    self.createPlayer()
    
  def createPlayer(self):
    h = 1.75
    w = 0.4
    shape = BulletCapsuleShape(w, h - 2 * w, ZUp)

    self.character = BulletCharacterControllerNode(shape, 0.4, 'Player')
    #    self.character.setMass(1.0)
    self.characterNP = self.render.attachNewNode(self.character)
    self.characterNP.setPos(self.x, self.y, self.z)
    self.characterNP.setH(45)
    self.characterNP.setCollideMask(BitMask32.allOn())
    self.world.attachCharacter(self.character)

    self.actorNP = Actor('models/Bricker/Bricker3.egg', {
                     'run': 'models/Bricker/Bricker-run.egg',
                     'jump': 'models/Bricker/Bricker-jump.egg'})
    self.actorNP.reparentTo(self.characterNP)
    self.actorNP.setScale(0.3048)
    self.actorNP.setH(180)
    self.actorNP.setPos(0, 0, 0.27)
    
  def setKey(self, key, value):
    self.keyMap[key] = value
  
  def doJump(self):
    self.character.setMaxJumpHeight(5.0)
    self.character.setJumpSpeed(8.5)
    self.character.doJump()
    self.actorNP.play("jump")
    self.jumpSound.play()
  
  def move(self):
    speed = Vec3(0, 0, 0)
    omega = 0.0
    
    if self.keyMap["left"]:
      omega =  120.0
    if self.keyMap["right"]:
      omega = -120.0
    if self.keyMap["forward"]:
      speed.setY(4.0)
    if self.keyMap["reverse"]:
      speed.setY(-4.0)
      
    self.character.setAngularMovement(omega)
    self.character.setLinearMovement(speed, True)
    
    if self.keyMap["forward"] or self.keyMap["left"] or self.keyMap["right"] or self.keyMap["reverse"]:
      if self.isMoving is False:
        self.actorNP.loop("run")
        self.runSound.play()
        self.isMoving = True
    else:
      if self.isMoving:
        self.actorNP.stop()
        self.runSound.stop()
        self.isMoving = False
  
  def getCharacterNP(self):
    return self.characterNP
  
  def getCharacter(self):
    return self.character
  
  def getActrorNP(self):
    return self.actorNP
  
  def resetCharacter(self):
    if (Data.currentLevel == 1):
      self.characterNP.setPos(0, 0, 0)
    else:
      self.characterNP.setPos(100, 100, 0)
コード例 #5
0
ファイル: Ecco.py プロジェクト: anto004/game-programming
class EccoGame(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        base.setBackgroundColor(0, 0, 0)
        game_title = "ECCO"
        titleN = TextNode('game-title')
        font = loader.loadFont("font/Caveman.ttf")
        titleN.setFont(font)
        titleN.setText(game_title)
        titleN.setTextColor(1, 1, 1, 1)
        titleN.setSlant(0.1)
        titleN.setShadow(0.05)
        titleN.setShadowColor(0, 0, 200, 1)
        titleN.setFrameColor(0, 0, 255, 1)
        titleN.setFrameLineWidth(5.0)
        textNodePath = self.aspect2d.attachNewNode(titleN)
        textNodePath.setPos(-0.4, 1.5, 0.5)
        textNodePath.setScale(0.2)

        self.level1Button = DirectButton(text=("Level 1"), scale=.1, pos=(0, 0, 0.2), command=self.level1)
        self.level2Button = DirectButton(text=("Level 2"), scale=.1, pos=(0, 0, 0), command=self.level2)


    def level1(self):
        titleNp = self.aspect2d.find('game-title')
        titleNp.removeNode()
        self.level1Button.destroy()
        self.level2Button.destroy()

        self.sizescale = 0.6
        self.setupWorld()
        self.setupSky()
        self.setupFloor()
        self.setupCharacter()

        self.inst1 = addInstructions(0.95, "[ESC]: Quit")
        self.inst2 = addInstructions(0.90, "[Left key]: Turn Ecco Left")
        self.inst3 = addInstructions(0.85, "[Right key]: Turn Ecco Right")
        self.inst4 = addInstructions(0.80, "[Up key]: Jump Ecco")

        inputState.watchWithModifiers('esc', 'escape')
        inputState.watchWithModifiers('w', 'w')
        inputState.watchWithModifiers('arrow_left', 'arrow_left')
        inputState.watchWithModifiers('arrow_right', 'arrow_right')
        inputState.watchWithModifiers('pause', 'p')
        inputState.watchWithModifiers('space', 'space')
        inputState.watchWithModifiers('arrow_up', 'arrow_up')

        inputState.watchWithModifiers('cam-left', 'z')
        inputState.watchWithModifiers('cam-right', 'x')
        inputState.watchWithModifiers('cam-forward', 'c')
        inputState.watchWithModifiers('cam-backward', 'v')

        taskMgr.add(self.update, "update")

        # Game state variables
        self.isMoving = False

        # display framerate
        self.setFrameRateMeter(True)

        # Set up the camera
        self.disableMouse()
        self.camera.setPos(self.characterNP.getX(), self.characterNP.getY() - 30, 4)
        self.setupSound()

        # coins variables
        self.coinsCollected = 0
        self.dictOfCoins = {}
        self.coins = []

        # Set up Coins as Collectables
        self.setupCoins()

        # Set up Obstacles
        self.setupObstacles()

        # Setup Level Display
        self.setupLevelDisplay()

        self.counter = 0

    def setupLevelDisplay(self):
        LEVEL_1 = "Level 1"
        levelDisplay(LEVEL_1)
        levelN = TextNode('level-display')
        levelN.setText(LEVEL_1)
        font = loader.loadFont("font/Caveman.ttf")
        levelN.setFont(font)
        levelN.setTextColor(1, 1, 1, 1)
        levelN.setSlant(0.1)
        levelN.setShadow(0.05)
        levelN.setShadowColor(255, 0, 0, 1)
        textNodePath = self.aspect2d.attachNewNode(levelN)
        textNodePath.setPos(-0.45, 0, 0)
        textNodePath.setScale(0.2)


    def update(self, task):
        dt = globalClock.getDt()
        self.pos = self.characterNP.getPos()
        self.counter = self.counter + 1
        if self.counter == 150:
            levelNp = self.aspect2d.find('level-display')
            levelNp.removeNode()
        self.setUpCamera()
        self.processInput(dt)
        self.processContacts()
        self.coinScoreDisplay()
        self.checkIfEccoDied()
        self.world.doPhysics(dt, 10, 1 / 230.0)
        return task.cont

    def setupWorld(self):
        # create bullet world
        self.debugNP = self.render.attachNewNode(BulletDebugNode('Debug'))
        #self.debugNP.show()

        self.world = BulletWorld()
        self.world.setGravity(Vec3(0, 0, -9.81))
        self.world.setDebugNode(self.debugNP.node())

    def setupSky(self):

        self.milkyWayNp = render.attachNewNode('milkyway')
        self.milkyWay_2Np = render.attachNewNode('milkyway_2')
        self.marsNp = render.attachNewNode('mars')
        self.sunNp = render.attachNewNode('sun')

        # Load the model for the sky
        # self.sky = loader.loadModel("models/sky/solar_sky_sphere")
        self.sky = loader.loadModel("models/sky/solar_sky_sphere")
        # Load the texture for the sky.
        self.sky_tex = loader.loadTexture("models/sky/stars_1k_tex.jpg")
        # Set the sky texture to the sky model
        self.sky.setTexture(self.sky_tex, 1)
        # Parent the sky model to the render node so that the sky is rendered
        self.sky.reparentTo(self.render)
        # Scale the size of the sky.
        self.sky.setScale(15000)
        x = 0.005
        y = 1700.0
        z = 0.0
        self.sky.setPos(x, y, 0)

        # #milkyway 1
        self.milkyWay = loader.loadModel("models/sky/planet_sphere")
        self.milkWay_tex = loader.loadTexture("models/sky/milkyway_tex.jpg")
        self.milkyWay.setTexture(self.milkWay_tex, 1)
        self.milkyWay.reparentTo(self.milkyWayNp)
        self.milkyWay.setScale(200)
        self.milkyWay.setPos(x + 2000, y + 10000, z - 500)

        # milkyway 2
        self.milkyWay_2 = loader.loadModel("models/sky/planet_sphere")
        self.milkWay_2_tex = loader.loadTexture("models/sky/milkyway_2_tex.jpg")
        self.milkyWay_2.setTexture(self.milkWay_2_tex, 1)
        self.milkyWay_2.reparentTo(self.milkyWay_2Np)
        self.milkyWay_2.setScale(400)
        self.milkyWay_2.setPos(x - 3000, y + 10000, z + 500)

        # sun
        self.sun = loader.loadModel("models/sky/planet_sphere")
        self.sun_tex = loader.loadTexture("models/sky/sun_2_tex.jpg")
        self.sun.setTexture(self.sun_tex, 1)
        self.sun.reparentTo(self.sunNp)
        self.sun.setScale(600)
        self.sun.setPos(x + 1000, y + 10000, z + 1000)
        #
        # Load Mars
        self.mars = loader.loadModel("models/sky/planet_sphere")
        self.mars_tex = loader.loadTexture("models/sky/mars_1k_tex.jpg")
        self.mars.setTexture(self.mars_tex, 1)
        self.mars.reparentTo(self.marsNp)
        self.mars.setScale(200)
        self.mars.setPos(x + 3000, y + 10000, z + 500)

    def setupSound(self):
        # Set up sound
        mySound = base.loader.loadSfx("sounds/Farm Morning.ogg")
        mySound.play()
        mySound.setVolume(3.0)
        mySound.setLoop(True)
        footsteps = base.loader.loadSfx("sounds/Footsteps_on_Cement-Tim_Fryer.wav")
        footsteps.play()
        footsteps.setVolume(0.8)
        footsteps.setLoop(True)
        self.jumpSound = base.loader.loadSfx("sounds/Jump-SoundBible.com-1007297584.wav")
        self.jumpSound.setVolume(0.2)
        self.collectSound = base.loader.loadSfx("sounds/pin_dropping-Brian_Rocca-2084700791.wav")
        self.gameOverSound = base.loader.loadSfx("sounds/Bike Horn-SoundBible.com-602544869.wav")
        self.levelCompleteSound = base.loader.loadSfx("sounds/Ta Da-SoundBible.com-1884170640.wav")



    def setupFloor(self):
        size = Vec3(7.5, 3000, 1.81818)
        shape = BulletBoxShape(size * 0.55)
        # shape = BulletPlaneShape(Vec3(0, 0, 1), 0)
        node = BulletRigidBodyNode('Box-Floor')
        node.addShape(shape)
        node.setMass(0)
        stairNP = self.render.attachNewNode(node)
        stairNP.setPos(0, 0, 0)
        stairNP.setCollideMask(BitMask32.allOn())
        self.world.attachRigidBody(stairNP.node())

        modelNP = loader.loadModel('models/box.egg')
        modelNP.reparentTo(stairNP)
        modelNP.setPos(-size.x / 2.0, -size.y / 2.0, -size.z / 2.0)
        modelNP.setScale(size)


    def setupCharacter(self):
        # Character
        h = 1.75
        w = 0.4
        shape = BulletCapsuleShape(w, h - 2 * w, ZUp)
        self.character = BulletCharacterControllerNode(shape, 0.4, 'Player')
        self.character.setGravity(35)
        self.characterNP = self.render.attachNewNode(self.character)
        self.characterNP.setPos(0, 10, 5)
        self.characterNP.setCollideMask(BitMask32.allOn())
        self.world.attachCharacter(self.character)

        self.ecco = Actor('ralph-models/ralph.egg.pz', {
            'run': 'ralph-models/ralph-run.egg',
            'jump': 'ralph/ralph-run.egg',
            'damage': 'models/lack-damage.egg'})
        self.ecco.reparentTo(self.characterNP)
        self.ecco.setScale(0.7048)
        self.ecco.setH(180)

    def setUpCamera(self):
        # If the camera is too far from ecco, move it closer.
        # If the camera is too close to ecco, move it farther.
        camvec = self.characterNP.getPos() - self.camera.getPos()
        camvec.setZ(0.0)
        camdist = camvec.length()
        camvec.normalize()
        if camdist > 10.0:
            self.camera.setPos(self.camera.getPos() + camvec * (camdist - 40))
            camdist = 10.0
        if camdist < 5.0:
            self.camera.setPos(self.camera.getPos() - camvec * (35 - camdist))
            camdist = 5.0

    def processInput(self, dt):
        speed = Vec3(0, 0, 0)
        if inputState.isSet('esc'): sys.exit()
        if inputState.isSet('w'): speed.setY(35.0)
        if inputState.isSet('arrow_left'): speed.setX(-35.0)
        if inputState.isSet('arrow_right'): speed.setX(35.0)
        if inputState.isSet('space'):
            self.jump()
            self.jumpSound.play()
        if inputState.isSet('arrow_up'):
            self.jump()
            self.jumpSound.play()
        if inputState.isSet('cam-left'): self.camera.setX(self.camera, -20 * dt)
        if inputState.isSet('cam-right'): self.camera.setX(self.camera, +20 * dt)
        if inputState.isSet('cam-forward'): self.camera.setY(self.camera, -200 * dt)
        if inputState.isSet('cam-backward'): self.camera.setY(self.camera, +200 * dt)

        # Make Ecco run
        if self.isMoving is False:
            self.ecco.loop("run")
            self.isMoving = True

        if self.pos.getY() > 1450.0:
            speed.setY(0.0)
        else:
            speed.setY(40.0)

        self.character.setLinearMovement(speed, True)

    def jump(self):
        self.character.setMaxJumpHeight(3.0)
        self.character.setJumpSpeed(25.0)
        self.character.doJump()

    def setupCoins(self):
        # display coins = 0
        textN = TextNode('coin-score')
        textN.setText(str("Coins: " + str(self.coinsCollected)))
        textN.setSlant(0.1)
        textNodePath = self.aspect2d.attachNewNode(textN)
        textNodePath.setPos(0, 0.95, 0.9)
        textNodePath.setScale(0.08)
        randNum = random.sample(range(0, 1500, 200), 6)

        # coins
        for i in range(6):
            randX = random.uniform(-3.0, 3.2)
            randY = float(randNum[i])
            shape = BulletSphereShape(0.3)
            coinNode = BulletGhostNode('Coin-' + str(i))
            coinNode.addShape(shape)
            np = self.render.attachNewNode(coinNode)
            np.setCollideMask(BitMask32.allOff())
            np.setPos(randX, randY, 2)

            # Adding sphere model
            sphereNp = loader.loadModel('models/smiley.egg')
            sphereNp_tex = loader.loadTexture("models/sky/coin_2_tex.jpg")
            sphereNp.setTexture(sphereNp_tex, 1)
            sphereNp.reparentTo(np)
            sphereNp.setScale(0.45)
            sphereNp.hprInterval(2.5, Vec3(360, 0, 0)).loop()

            self.world.attachGhost(coinNode)
            self.coins.append(coinNode)
            print "node name:" + str(coinNode.getName())

    def processContacts(self):
        for coin in self.coins:
            self.testWithSingleBody(coin)

        self.coinsCollected = len(self.dictOfCoins)

    def testWithSingleBody(self, secondNode):
        contactResult = self.world.contactTestPair(self.character, secondNode)

        if contactResult.getNumContacts() > 0:
            self.collectSound.play()
            for contact in contactResult.getContacts():
                cp = contact.getManifoldPoint()
                node0 = contact.getNode0()
                node1 = contact.getNode1()
                self.dictOfCoins[node1.getName()] = 1
                np = self.render.find(node1.getName())
                np.node().removeAllChildren()
                self.world.removeGhost(np.node())

    def setupObstacles(self):
        # Obstacle
        origin = Point3(2, 0, 0)
        size = Vec3(2, 2.75, 1.5)
        shape = BulletBoxShape(size * 0.55)
        randNum1 = random.sample(range(0, 1500, 300), 3)
        randNum2 = random.sample(range(0, 1500, 500), 3)
        for i in range(2):
            randX = random.uniform(-3.5, 3.5)
            randY = float(randNum1[i])
            pos = origin + size * i
            ObstacleNP = self.render.attachNewNode(BulletRigidBodyNode('Obstacle%i' % i))
            ObstacleNP.node().addShape(shape)
            ObstacleNP.node().setMass(1.0)
            ObstacleNP.setPos(randX, randY, 3)
            ObstacleNP.setCollideMask(BitMask32.allOn())

            modelNP = loader.loadModel('models/box.egg')
            modelNP_tex = loader.loadTexture("models/sky/milkyway_tex.jpg")
            modelNP.setTexture(modelNP_tex, 1)
            modelNP.reparentTo(ObstacleNP)
            # modelNP.setPos(0, 0, 0)
            modelNP.setPos(-size.x / 2.0, -size.y / 2.0, -size.z / 2.0)
            modelNP.setScale(size)
            self.world.attachRigidBody(ObstacleNP.node())

        size_2 = Vec3(3, 2.75, 1.5)
        shape2 = BulletBoxShape(size_2 * 0.55)
        for i in range(2):
            randX = random.uniform(-3.5, 3.5)
            randY = float(randNum2[i])
            pos = origin + size_2 * i
            pos.setY(0)
            ObstacleNP = self.render.attachNewNode(BulletRigidBodyNode('ObstacleSmall%i' % i))
            ObstacleNP.node().addShape(shape2)
            ObstacleNP.node().setMass(1.0)
            ObstacleNP.setPos(randX, randY, 2)
            ObstacleNP.setCollideMask(BitMask32.allOn())

            modelNP = loader.loadModel('models/box.egg')
            modelNP_tex = loader.loadTexture("models/sky/moon_1k_tex.jpg")
            modelNP.setTexture(modelNP_tex, 1)
            modelNP.reparentTo(ObstacleNP)
            # modelNP.setPos(0, 0, 0)
            modelNP.setPos(-size_2.x / 2.0, -size_2.y / 2.0, -size_2.z / 2.0)
            modelNP.setScale(size_2)
            self.world.attachRigidBody(ObstacleNP.node())

    def checkIfEccoDied(self):
        print "position" + str(self.pos.getY())
        if self.pos.getZ() > -50.0 and self.pos.getZ() < 0.0:
            title = "Game Over"
            levelCompleteN = TextNode('ecco-died')
            font = loader.loadFont("font/Caveman.ttf")
            levelCompleteN.setFont(font)
            levelCompleteN.setText(title)
            levelCompleteN.setTextColor(1, 1, 1, 1)
            levelCompleteN.setSlant(0.1)
            levelCompleteN.setShadow(0.03)
            levelCompleteN.setShadowColor(0, 0, 200, 1)
            # levelN.setFrameAsMargin(0, 0, 0, 0)
            levelCompleteN.setFrameColor(200, 0, 0, 1)
            levelCompleteN.setFrameLineWidth(5.0)
            # textNp.node().setGlyphShift(1.0)
            textNodePath = self.aspect2d.attachNewNode(levelCompleteN)
            textNodePath.setPos(-0.9, 1.5, 0.5)
            textNodePath.setScale(0.2)
            if self.pos.getZ() < -49.0:
                self.gameOverSound.play()

        elif self.pos.getZ() < -50.0:
            if self.gameOverSound.status() != self.gameOverSound.PLAYING:
                sys.exit(1)

        elif self.pos.getY() > 1300.0:
            title = "Level 1 \n Complete"
            levelCompleteN = TextNode('level-complete')
            font = loader.loadFont("font/Caveman.ttf")
            levelCompleteN.setFont(font)
            levelCompleteN.setText(title)
            levelCompleteN.setTextColor(1, 1, 1, 1)
            levelCompleteN.setSlant(0.1)
            levelCompleteN.setShadow(0.03)
            levelCompleteN.setShadowColor(0, 0, 200, 1)
            # levelN.setFrameAsMargin(0, 0, 0, 0)
            levelCompleteN.setFrameColor(200, 0, 0, 1)
            levelCompleteN.setFrameLineWidth(5.0)
            # textNp.node().setGlyphShift(1.0)
            textNodePath = self.aspect2d.attachNewNode(levelCompleteN)
            textNodePath.setPos(-0.6, 1.5, 0.5)
            textNodePath.setScale(0.2)
            if self.levelCompleteSound.status() != self.levelCompleteSound.PLAYING:
                self.levelCompleteSound.play()
        else:
            pass


    def coinScoreDisplay(self):
        textNp = self.aspect2d.find('coin-score')
        textNp.node().clearText()
        textNp.node().setText(str("Coins: " + str(self.coinsCollected)))


    #Level 2
    def level2(self):
        titleNp2 = self.aspect2d.find('game-title')
        titleNp2.removeNode()
        self.level1Button.destroy()
        self.level2Button.destroy()

        self.sizescale2 = 0.6
        self.setupWorld2()
        self.setupSky2()
        self.setupFloor2()
        self.setupCharacter2()

        # self.title = addTitle(" ")
        self.inst12 = addInstructions(0.95, "[ESC]: Quit")
        self.inst22 = addInstructions(0.90, "[Left key]: Turn Ecco Left")
        self.inst32 = addInstructions(0.85, "[Right key]: Turn Ecco Right")
        self.inst42 = addInstructions(0.80, "[Up key]: Jump Ecco")

        inputState.watchWithModifiers('esc', 'escape')
        inputState.watchWithModifiers('w', 'w')
        inputState.watchWithModifiers('arrow_left', 'arrow_left')
        inputState.watchWithModifiers('arrow_right', 'arrow_right')
        inputState.watchWithModifiers('pause', 'p')
        inputState.watchWithModifiers('space', 'space')
        inputState.watchWithModifiers('arrow_up', 'arrow_up')

        inputState.watchWithModifiers('cam-left', 'z')
        inputState.watchWithModifiers('cam-right', 'x')
        inputState.watchWithModifiers('cam-forward', 'c')
        inputState.watchWithModifiers('cam-backward', 'v')

        taskMgr.add(self.update2, "update")

        # Game state variables
        self.isMoving2 = False


        # display framerate
        self.setFrameRateMeter(True)

        # Set up the camera
        self.disableMouse()
        self.camera.setPos(self.characterNP2.getX(), self.characterNP2.getY() - 30, 4)
        self.setupSound2()

        # coins variables
        self.coinsCollected2 = 0
        self.dictOfCoins2 = {}
        self.coins2 = []

        # Set up Coins as Collectables
        self.setupCoins2()

        # Set up Floaters with coins
        self.setupFloaters2()

        # Set up Obstacles
        self.setupObstacles2()

        # Setup Level Display
        self.setupLevelDisplay2()

        self.counter2 = 0

    def setupLevelDisplay2(self):
        LEVEL_2 = "Level 2"
        levelDisplay(LEVEL_2)
        levelN = TextNode('level-display')
        levelN.setText(LEVEL_2)
        # www.webpagepublicity.com
        font = loader.loadFont("font/Caveman.ttf")
        levelN.setFont(font)
        levelN.setTextColor(1, 1, 1, 1)
        levelN.setSlant(0.1)
        levelN.setShadow(0.05)
        levelN.setShadowColor(255, 0, 0, 1)
        # levelN.setFrameAsMargin(0, 0, 0, 0)
        # levelN.setFrameColor(0, 0, 255, 1)
        # levelN.setFrameLineWidth(5.0)
        # # textNp.node().setGlyphShift(1.0)
        textNodePath = self.aspect2d.attachNewNode(levelN)
        textNodePath.setPos(-0.45, 0, 0)
        textNodePath.setScale(0.2)

    def update2(self, task):
        dt = globalClock.getDt()
        self.pos2 = self.characterNP2.getPos()
        self.counter2 = self.counter2 + 1
        if self.counter2 == 150:
            levelNp = self.aspect2d.find('level-display')
            levelNp.removeNode()
        self.setUpCamera2()
        self.processInput2(dt)
        self.processContacts2()
        self.coinScoreDisplay2()
        self.checkIfEccoDied2()
        self.world2.doPhysics(dt, 10, 1 / 230.0)
        return task.cont

    def setupWorld2(self):
        # create bullet world
        self.debugNP = self.render.attachNewNode(BulletDebugNode('Debug'))
        #self.debugNP.show()

        self.world2 = BulletWorld()
        self.world2.setGravity(Vec3(0, 0, -9.81))
        self.world2.setDebugNode(self.debugNP.node())

    def setupSky2(self):

        self.milkyWayNp = render.attachNewNode('milkyway')
        self.milkyWay_2Np = render.attachNewNode('milkyway_2')
        self.marsNp = render.attachNewNode('mars')
        self.sunNp = render.attachNewNode('sun')

        # Load the model for the sky
        # self.sky = loader.loadModel("models/sky/solar_sky_sphere")
        self.sky = loader.loadModel("models/sky/solar_sky_sphere")
        # Load the texture for the sky.
        self.sky_tex = loader.loadTexture("models/sky/stars_1k_tex.jpg")
        # Set the sky texture to the sky model
        self.sky.setTexture(self.sky_tex, 1)
        # Parent the sky model to the render node so that the sky is rendered
        self.sky.reparentTo(self.render)
        # Scale the size of the sky.
        self.sky.setScale(15000)
        x = 0.005
        y = 1700.0
        z = 0.0
        self.sky.setPos(x, y, 0)

        # #milkyway 1
        self.milkyWay = loader.loadModel("models/sky/planet_sphere")
        self.milkWay_tex = loader.loadTexture("models/sky/milkyway_tex.jpg")
        self.milkyWay.setTexture(self.milkWay_tex, 1)
        self.milkyWay.reparentTo(self.milkyWayNp)
        self.milkyWay.setScale(200)
        self.milkyWay.setPos(x + 2000, y + 10000, z - 500)

        # milkyway 2
        self.milkyWay_2 = loader.loadModel("models/sky/planet_sphere")
        self.milkWay_2_tex = loader.loadTexture("models/sky/milkyway_2_tex.jpg")
        self.milkyWay_2.setTexture(self.milkWay_2_tex, 1)
        self.milkyWay_2.reparentTo(self.milkyWay_2Np)
        self.milkyWay_2.setScale(400)
        self.milkyWay_2.setPos(x - 3000, y + 10000, z + 500)

        # sun
        self.sun = loader.loadModel("models/sky/planet_sphere")
        self.sun_tex = loader.loadTexture("models/sky/sun_2_tex.jpg")
        self.sun.setTexture(self.sun_tex, 1)
        self.sun.reparentTo(self.sunNp)
        self.sun.setScale(600)
        self.sun.setPos(x + 1000, y + 10000, z + 1000)
        #
        # Load Mars
        self.mars = loader.loadModel("models/sky/planet_sphere")
        self.mars_tex = loader.loadTexture("models/sky/mars_1k_tex.jpg")
        self.mars.setTexture(self.mars_tex, 1)
        self.mars.reparentTo(self.marsNp)
        self.mars.setScale(200)
        self.mars.setPos(x + 3000, y + 10000, z + 500)

    def setUpCamera2(self):
        # If the camera is too far from ecco, move it closer.
        # If the camera is too close to ecco, move it farther.
        camvec = self.characterNP2.getPos() - self.camera.getPos()
        camvec.setZ(0.0)
        camdist = camvec.length()
        camvec.normalize()
        if camdist > 10.0:
            self.camera.setPos(self.camera.getPos() + camvec * (camdist - 40))
            camdist = 10.0
        if camdist < 5.0:
            self.camera.setPos(self.camera.getPos() - camvec * (35 - camdist))
            camdist = 5.0

    def setupSound2(self):
        # Set up sound
        mySound = base.loader.loadSfx("sounds/Farm Morning.ogg")
        mySound.play()
        mySound.setVolume(3.0)
        mySound.setLoop(True)
        footsteps = base.loader.loadSfx("sounds/Footsteps_on_Cement-Tim_Fryer.wav")
        footsteps.play()
        footsteps.setVolume(0.8)
        footsteps.setLoop(True)
        self.jumpSound2 = base.loader.loadSfx("sounds/Jump-SoundBible.com-1007297584.wav")
        self.jumpSound2.setVolume(0.2)
        self.collectSound2 = base.loader.loadSfx("sounds/pin_dropping-Brian_Rocca-2084700791.wav")
        self.gameOverSound2 = base.loader.loadSfx("sounds/Bike Horn-SoundBible.com-602544869.wav")
        self.levelCompleteSound2 = base.loader.loadSfx("sounds/Ta Da-SoundBible.com-1884170640.wav")

    def setupFloor2(self):
        size = Vec3(7.5, 3000, 1.81818)
        shape = BulletBoxShape(size * 0.55)
        # shape = BulletPlaneShape(Vec3(0, 0, 1), 0)
        node = BulletRigidBodyNode('Box-Floor')
        node.addShape(shape)
        node.setMass(0)
        stairNP = self.render.attachNewNode(node)
        stairNP.setPos(0, 0, 0)
        stairNP.setCollideMask(BitMask32.allOn())
        self.world2.attachRigidBody(stairNP.node())

        modelNP = loader.loadModel('models/box.egg')
        modelNP.reparentTo(stairNP)
        modelNP.setPos(-size.x / 2.0, -size.y / 2.0, -size.z / 2.0)
        modelNP.setScale(size)


    def setupCharacter2(self):
        # Character
        h = 1.75
        w = 0.4
        shape = BulletCapsuleShape(w, h - 2 * w, ZUp)
        self.character2 = BulletCharacterControllerNode(shape, 0.4, 'Player')
        self.character2.setGravity(35)
        self.characterNP2 = self.render.attachNewNode(self.character2)
        self.characterNP2.setPos(0, 10, 5)
        self.characterNP2.setCollideMask(BitMask32.allOn())
        self.world2.attachCharacter(self.character2)

        self.ecco2 = Actor('ralph-models/ralph.egg.pz', {
            'run': 'ralph-models/ralph-run.egg',
            'jump': 'ralph/ralph-run.egg',
            'damage': 'models/lack-damage.egg'})
        self.ecco2.reparentTo(self.characterNP2)
        self.ecco2.setScale(0.7048)
        self.ecco2.setH(180)


    def processInput2(self, dt):
        speed = Vec3(0, 0, 0)
        if inputState.isSet('esc'): sys.exit()
        if inputState.isSet('w'): speed.setY(35.0)
        if inputState.isSet('arrow_left'): speed.setX(-35.0)
        if inputState.isSet('arrow_right'): speed.setX(35.0)
        if inputState.isSet('space'):
            self.jump2()
            self.jumpSound2.play()
        if inputState.isSet('arrow_up'):
            self.jump2()
            self.jumpSound2.play()
        if inputState.isSet('cam-left'): self.camera.setX(self.camera, -20 * dt)
        if inputState.isSet('cam-right'): self.camera.setX(self.camera, +20 * dt)
        if inputState.isSet('cam-forward'): self.camera.setY(self.camera, -200 * dt)
        if inputState.isSet('cam-backward'): self.camera.setY(self.camera, +200 * dt)

        # Make Ecco run
        if self.isMoving2 is False:
            self.ecco2.loop("run")
            self.isMoving2 = True

        if self.pos2.getY() > 1450.0:
            speed.setY(0.0)
        else:
            speed.setY(40.0)

        self.character2.setLinearMovement(speed, True)

    def jump2(self):
        self.character2.setMaxJumpHeight(3.0)
        self.character2.setJumpSpeed(25.0)
        self.character2.doJump()

    def setupCoins2(self):
        # display coins = 0
        textN = TextNode('coin-score')
        textN.setText(str("Coins: " + str(self.coinsCollected2)))
        textN.setSlant(0.1)
        textNodePath = self.aspect2d.attachNewNode(textN)
        textNodePath.setPos(0, 0.95, 0.9)
        textNodePath.setScale(0.08)
        randNum = random.sample(range(0, 1500, 200), 6)

        # coins
        for i in range(6):
            randX = random.uniform(-3.0, 3.2)
            randY = float(randNum[i])
            shape = BulletSphereShape(0.3)
            coinNode = BulletGhostNode('Coin-' + str(i))
            coinNode.addShape(shape)
            np = self.render.attachNewNode(coinNode)
            np.setCollideMask(BitMask32.allOff())
            np.setPos(randX, randY, 2)

            # Adding sphere model
            sphereNp = loader.loadModel('models/smiley.egg')
            sphereNp_tex = loader.loadTexture("models/sky/coin_2_tex.jpg")
            sphereNp.setTexture(sphereNp_tex, 1)
            sphereNp.reparentTo(np)
            sphereNp.setScale(0.45)
            sphereNp.hprInterval(2.5, Vec3(360, 0, 0)).loop()

            self.world2.attachGhost(coinNode)
            self.coins2.append(coinNode)
            print "node name:" + str(coinNode.getName())

    def setupObstacles2(self):
        # Obstacle
        origin = Point3(2, 0, 0)
        size = Vec3(2, 2.75, 1.5)
        shape = BulletBoxShape(size * 0.55)
        randNum1 = random.sample(range(0, 1500, 300), 3)
        randNum2 = random.sample(range(0, 1500, 500), 3)
        for i in range(2):
            randX = random.uniform(-3.5, 3.5)
            randY = float(randNum1[i])
            pos = origin + size * i
            ObstacleNP = self.render.attachNewNode(BulletRigidBodyNode('Obstacle%i' % i))
            ObstacleNP.node().addShape(shape)
            ObstacleNP.node().setMass(1.0)
            ObstacleNP.setPos(randX, randY, 3)
            ObstacleNP.setCollideMask(BitMask32.allOn())

            modelNP = loader.loadModel('models/box.egg')
            modelNP_tex = loader.loadTexture("models/sky/milkyway_tex.jpg")
            modelNP.setTexture(modelNP_tex, 1)
            modelNP.reparentTo(ObstacleNP)
            # modelNP.setPos(0, 0, 0)
            modelNP.setPos(-size.x / 2.0, -size.y / 2.0, -size.z / 2.0)
            modelNP.setScale(size)
            self.world2.attachRigidBody(ObstacleNP.node())

        size_2 = Vec3(3, 2.75, 1.5)
        shape2 = BulletBoxShape(size_2 * 0.55)
        for i in range(2):
            randX = random.uniform(-3.5, 3.5)
            randY = float(randNum2[i])
            pos = origin + size_2 * i
            pos.setY(0)
            ObstacleNP = self.render.attachNewNode(BulletRigidBodyNode('ObstacleSmall%i' % i))
            ObstacleNP.node().addShape(shape2)
            ObstacleNP.node().setMass(1.0)
            ObstacleNP.setPos(randX, randY, 2)
            ObstacleNP.setCollideMask(BitMask32.allOn())

            modelNP = loader.loadModel('models/box.egg')
            modelNP_tex = loader.loadTexture("models/sky/moon_1k_tex.jpg")
            modelNP.setTexture(modelNP_tex, 1)
            modelNP.reparentTo(ObstacleNP)
            # modelNP.setPos(0, 0, 0)
            modelNP.setPos(-size_2.x / 2.0, -size_2.y / 2.0, -size_2.z / 2.0)
            modelNP.setScale(size_2)
            self.world2.attachRigidBody(ObstacleNP.node())

    def setupFloaters2(self):
        size = Vec3(3.5, 5.5, 0.3)
        randNum = random.sample(range(10, 1500, 500), 3)
        for i in range(3):
            randX = random.randrange(-2, 3, 10)
            randY = float(randNum[i])
            # randY = random.randint(1000, 1500)
            shape = BulletBoxShape(size * 0.55)
            node = BulletRigidBodyNode('Floater')
            node.setMass(0)
            node.addShape(shape)
            np = self.render.attachNewNode(node)
            # np.setPos(9, 30, 3)
            np.setPos(randX, randY, 6)
            np.setR(0)
            self.world2.attachRigidBody(node)

            dummyNp = self.render.attachNewNode('milkyway')
            dummyNp.setPos(randX, randY, 6)

            modelNP = loader.loadModel('models/box.egg')
            modelNP_tex = loader.loadTexture("models/sky/moon_tex.jpg")
            modelNP.setTexture(modelNP_tex, 1)
            modelNP.reparentTo(dummyNp)
            modelNP.setPos(-1, 0, -1)
            modelNP.setPos(-size.x / 2.0, -size.y / 2.0, -size.z / 2.0)
            modelNP.setScale(size)
            dummyNp.hprInterval(2.5, Vec3(360, 0, 0)).loop()

            # Put A Coin On the Floater
            shape = BulletSphereShape(0.75)
            coinNode = BulletGhostNode('FloaterCoin-' + str(i))
            coinNode.addShape(shape)
            np = self.render.attachNewNode(coinNode)
            np.setCollideMask(BitMask32.allOff())
            # np.setPos(randX, randY, 2)
            np.setPos(randX, randY, 7.0)

            # Adding sphere model
            sphereNp = loader.loadModel('models/smiley.egg')
            sphereNp_tex = loader.loadTexture("models/sky/coin_2_tex.jpg")
            sphereNp.setTexture(sphereNp_tex, 1)
            sphereNp.reparentTo(np)
            sphereNp.setScale(0.85)
            sphereNp.hprInterval(1.5, Vec3(360, 0, 0)).loop()

            self.world2.attachGhost(coinNode)
            self.coins2.append(coinNode)
            print "node name:" + str(coinNode.getName())

    def processContacts2(self):
        for coin in self.coins2:
            self.testWithSingleBody2(coin)

        self.coinsCollected2 = len(self.dictOfCoins2)

    def testWithSingleBody2(self, secondNode):
        contactResult = self.world2.contactTestPair(self.character2, secondNode)

        if contactResult.getNumContacts() > 0:
            self.collectSound2.play()
            for contact in contactResult.getContacts():
                cp = contact.getManifoldPoint()
                node0 = contact.getNode0()
                node1 = contact.getNode1()
                self.dictOfCoins2[node1.getName()] = 1
                np = self.render.find(node1.getName())
                np.node().removeAllChildren()
                self.world2.removeGhost(np.node())


    def checkIfEccoDied2(self):
        print "position" + str(self.pos2.getY())
        if self.pos2.getZ() > -50.0 and self.pos2.getZ() < 0.0:
            title = "Game Over"
            levelCompleteN = TextNode('ecco-died')
            font = loader.loadFont("font/Caveman.ttf")
            levelCompleteN.setFont(font)
            levelCompleteN.setText(title)
            levelCompleteN.setTextColor(1, 1, 1, 1)
            levelCompleteN.setSlant(0.1)
            levelCompleteN.setShadow(0.03)
            levelCompleteN.setShadowColor(0, 0, 200, 1)
            # levelN.setFrameAsMargin(0, 0, 0, 0)
            levelCompleteN.setFrameColor(200, 0, 0, 1)
            levelCompleteN.setFrameLineWidth(5.0)
            # textNp.node().setGlyphShift(1.0)
            textNodePath = self.aspect2d.attachNewNode(levelCompleteN)
            textNodePath.setPos(-0.9, 1.5, 0.5)
            textNodePath.setScale(0.2)
            if self.pos2.getZ() < -49.0:
                self.gameOverSound2.play()

        elif self.pos2.getZ() < -50.0:
            if self.gameOverSound2.status() != self.gameOverSound2.PLAYING:
                sys.exit(1)
        elif self.pos2.getY() > 1300.0:
            title = "Level 2 \n Complete"
            levelCompleteN = TextNode('level-complete')
            font = loader.loadFont("font/Caveman.ttf")
            levelCompleteN.setFont(font)
            levelCompleteN.setText(title)
            levelCompleteN.setTextColor(1, 1, 1, 1)
            levelCompleteN.setSlant(0.1)
            levelCompleteN.setShadow(0.03)
            levelCompleteN.setShadowColor(0, 0, 200, 1)
            # levelN.setFrameAsMargin(0, 0, 0, 0)
            levelCompleteN.setFrameColor(200, 0, 0, 1)
            levelCompleteN.setFrameLineWidth(5.0)
            # textNp.node().setGlyphShift(1.0)
            textNodePath = self.aspect2d.attachNewNode(levelCompleteN)
            textNodePath.setPos(-0.6, 1.5, 0.5)
            textNodePath.setScale(0.2)
            if self.levelCompleteSound2.status() != self.levelCompleteSound2.PLAYING:
                self.levelCompleteSound2.play()
        else:
            pass

    def coinScoreDisplay2(self):
        textNp = self.aspect2d.find('coin-score')
        textNp.node().clearText()
        textNp.node().setText(str("Coins: " + str(self.coinsCollected2)))
コード例 #6
0
ファイル: human.py プロジェクト: MattMcMullan/GdProj3
class Human():
    def __init__(self,parent, world, worldNP):
        """__init__
        parameters:
            self
            parent: the World object
            world: bullet world
            worldNP: where in the world to put it
        returns:
            none
        Description:
            Create the human player
        """
        self.traptime = 0
        self.world = world
        self.worldNP = worldNP
        
        self.projectiles = list()
        self.floatTraps = list()
        
        self.keymap = {"left": 0, "right":0, "up":0,"down":0, "m1":0}
        self.prevTime = 0
        # panda walk
        parent.accept("w",self.setKey,["up",1])
        parent.accept("w-up",self.setKey,["up",0])
        parent.accept("s",self.setKey,["down",1])
        parent.accept("s-up",self.setKey,["down",0])
        parent.accept("a",self.setKey,["left",1])
        parent.accept("a-up",self.setKey,["left",0])
        parent.accept("d",self.setKey,["right",1])
        parent.accept("d-up",self.setKey,["right",0])
        parent.accept("mouse1", self.setKey, ["m1",1])
        
        self.velocity = 0
        self.dir = (0,0,0)
        
        self.vel = (0,0,0)
        
        taskMgr.add(self.fpMove,"moveTask",sort=50)
        taskMgr.add(self.mouseTask, 'mouseTask')
        self.parent = parent
        #self.human = self.parent.human
        #self.human = collision.loadAndPositionModelFromFile("../assets/3d/Actors/robot rig 10 coll.egg",scale=.07,show=0)
        self.human = Actor('../assets/3d/Actors/robot_idle_final_actor.egg', {
          'idle':'../assets/3d/Actors/robot_idle_final_anim.egg',
        #  'throw':'../assets/3d/Actors/animation eggs/robot_throw_final.egg',
        #  'place':'../assets/3d/Actors/animation eggs/robot_place_final.egg',
        #  'death':'../assets/3d/Actors/animation eggs/robot_death_final.egg',
        })
        #print self.human.find("**/eyes_sphere").getPos()
        #self.human.flattenLight()
        print self.human.ls()
        #self.human.node().getChild(0).removeChild(0)
        self.human.setH(camera.getH()+180)
        campos = self.human.getPos()
        campos[2] = campos[2]-5
        camera.lookAt(campos)
        
        pnode = ModelRoot("player")
        self.player = render.attachNewNode(pnode)
        pc = self.player.attachNewNode(CollisionNode("playerCollision"))
        pc.node().addSolid(CollisionRay(0,0,-1,0,0,1))
        self.playerCnode = pc
        self.player.setPos(0,0,1)
        #self.human.play('idle')
        self.human.loop('idle')
    def bulletInit(self,world,pos):
        """bulletInit
        parameters:
            self
            task: the tskMgr structure
        returns:
            none
        Description:
            The rest of init requires bullet things
        """
        oldpath = self.human.find("**/body_coll")
        self.shape = BulletSphereShape(10)#oldpath.node().getSolid(0).getRadius())
        self.character = BulletCharacterControllerNode(self.shape, 0.4, 'Human')
        self.characterNP = render.attachNewNode(self.character)
        self.characterNP.setPos(pos[0],pos[1],pos[2])
        self.character.setGravity(0)
        #self.human.setPos(pos)
        self.human.reparentTo(self.characterNP)
        self.human.hide()
        #self.player.setPos(pos)
        self.player.reparentTo(self.characterNP)
        self.characterNP.setCollideMask(BitMask32.allOn())
        
        world.attachCharacter(self.character)
    def fpMove(self,task):
        """fpMove
        parameters:
            self
            task: the taskMgr structure
        returns:
            none
        Description:
            player movement
        """
        dt = task.time-self.prevTime
        camera.setPos(self.player.getPos()+(0,0,1))
        damp = (1.-(.2*dt))
        self.vel = map(lambda x: damp*x, self.vel)
        if self.traptime>0:
            self.traptime = self.traptime-dt
        #self.human.setZ(self.player.getZ()-.5)
        #if not self.parent.editMode:
        #camera.setPos(self.player.getPos()-(0.0264076, 4.60993, -10.0715))
        self.prevTime = task.time
        pos = self.player.getParent().getPos()
        delta = 10*dt
        h = deg2Rad(camera.getH())
        p = deg2Rad(camera.getP())
        # player control
        if self.keymap["up"] and self.traptime<=0:
            dir = (-cos(p)*sin(h), cos(p)*cos(h), sin(p))
            self.vel = map(lambda i: self.vel[i]+dir[i]*delta, range(3))
        if self.keymap["down"] and self.traptime<=0:
            dir = (-cos(p)*sin(h), cos(p)*cos(h), sin(p))
            self.vel = map(lambda i: self.vel[i]-dir[i]*delta, range(3))
        if self.keymap["m1"] and self.traptime<=0:
            weapon = self.parent.overlay.wepCounter
            if self.parent.overlay.wepAmmo[weapon] > 0:
                self.parent.overlay.changeAmmo(weapon, -1)
                if weapon == 0:
                    self.launch()
                    dir = (-cos(p)*sin(h), cos(p)*cos(h), sin(p))
                    self.vel = map(lambda i: self.vel[i]-dir[i]*100, range(3))
                elif weapon == 1:
                    self.placeFloatTrap()
                elif weapon == 2:
                    self.placeClawTrap()
            self.keymap["m1"] = 0
        self.character.setAngularMovement(0)
        self.character.setLinearMovement(LVector3(self.vel[0],self.vel[1],self.vel[2]),True)
        #get displacement
        dis = (self.vel[0]*dt,self.vel[1]*dt,self.vel[2]*dt)
        #set the new position
        self.player.setPos(pos[0]+dis[0],pos[1]+dis[1],pos[2]+dis[2])
        self.human.setPos(pos[0]+dis[0],pos[1]+dis[1],pos[2]+dis[2])
        #self.human.setX(self.player.getX()+sin(deg2Rad(camera.getH())+math.pi))
        #self.human.setY(self.player.getY()-cos(deg2Rad(camera.getH())+math.pi))
        return task.cont
    def launch(self):
        """launch
        parameters:
            self
        returns:
            none
        Description:
            Fire a projectile
        """
        self.projectiles.append(Projectile(self.player.getPos(),deg2Rad(camera.getH()),deg2Rad(camera.getP()),self,self.vel, self.world, self.worldNP))
    def placeFloatTrap(self):
        """placeFloatTrap
        parameters:
            self
        returns:
            none
        Description:
            Place a float trap
        """
        self.floatTraps.append(floatTrap(self.player.getPos(),self.world,self.worldNP)) 
    def placeClawTrap(self):
        """placeClawTrap
        parameters:
            self
        returns:
            none
        Description:
            Place a claw trap
        """
        trap = clawTrap(self.world,self.worldNP)
        weapon = self.parent.overlay.wepCounter
        self.parent.overlay.changeAmmo(weapon, trap.failed)
    def setKey(self,key,value):
        self.keymap[key] = value
    def mouseTask(self,task): 
        """mouseTask
        parameters:
            self
            task: the tskMgr structure
        returns:
            none
        Description:
            Keep track of the mouse and record its movement
        """
        global mousePos, mousePrevPos 
        
        if (not base.mouseWatcherNode.hasMouse() ): return Task.cont
        
        # Get mouse coordinates from mouse watcher 
        x=base.mouseWatcherNode.getMouseX()
        y=base.mouseWatcherNode.getMouseY()
        mousePos = [x,y] 
        # Calculate mouse movement from last frame and output (print) 
        move = [mousePos[0],mousePos[1]] 
        if move==[0,0]: return Task.cont
        #print "Moved:\t %f right, \t %f up." %(move[0], move[1]) 
        base.win.movePointer(0, base.win.getXSize() / 2, base.win.getYSize() / 2)
        # Save current position for next calculation 
        mousePrevPos = mousePos
        
        camera.setP(camera.getP()+75*move[1])
        camera.setH(camera.getH()-75*move[0])
        
        self.human.setH(camera.getH()+180)
        self.human.setX(self.player.getX()+sin(deg2Rad(camera.getH()+180)))
        self.human.setY(self.player.getY()-cos(deg2Rad(camera.getH()+180)))
        
        contacts = self.world.contactTest(self.character).getContacts()
        for c in contacts:
            contactObject = c.getNode0()
            if c.getNode0().getName()=="Human":
                contactObject = c.getNode1()
            if contactObject.getName()=="env":
                self.vel = map(lambda x: x*.9, self.vel)
        
        return Task.cont
    def die(self,event):
        """die
        parameters:
            self
            task: the tskMgr structure
        returns:
            none
        Description:
            Kill the player
        """
        #base.cTrav.removeCollider(self.wheelsphere)
        self.human.node().getChild(0).removeChild(0)
        self.filters.setInverted()
        print "You Died!"
    def trap1(self):
        """trap1
        parameters:
            self
        returns:
            none
        Description:
            Inflict the floating trap penalty
        """
        self.vel = map(lambda x: x*.25, self.vel)
        self.traptime = self.traptime + 20
        return
    def trap2(self):
        """trap2
        parameters:
            self
        returns:
            none
        Description:
            Inflict the claw trap penalty
        """
        self.vel = (0,0,0)
        self.traptime = self.traptime + 30
        return
    def impact(self,vel):
        diff = map(lambda i: self.vel[i]-vel[i], range(3))
        self.vel = map(lambda i: self.vel[i]-diff[i], range(3))