def __init__(self):
        ShowBase.__init__(self)

        base.disableMouse()

        self.makeAcog = loader.loadModel(
            "phase_5/models/cogdominium/tt_m_ara_cbr_barrelRoom.bam")
        self.makeAcog.reparentTo(render)
        self.stomper1 = (self.makeAcog.find('**/stomper_GRP_01'))
        self.stomper2 = (self.makeAcog.find('**/stomper_GRP_02'))
        self.stomper3 = (self.makeAcog.find('**/stomper_GRP_03'))
        self.stomper4 = (self.makeAcog.find('**/stomper_GRP_04'))
        self.stomper5 = (self.makeAcog.find('**/stomper_GRP_05'))
        self.stomper6 = (self.makeAcog.find('**/stomper_GRP_06'))
        self.stomper7 = (self.makeAcog.find('**/stomper_GRP_07'))
        self.stomper8 = (self.makeAcog.find('**/stomper_GRP_08'))
        self.stomper9 = (self.makeAcog.find('**/stomper_GRP_09'))
        self.stomper10 = (self.makeAcog.find('**/stomper_GRP_10'))
        self.stomper11 = (self.makeAcog.find('**/stomper_GRP_11'))
        self.stomper12 = (self.makeAcog.find('**/stomper_GRP_12'))
        self.stomper3.setPos(0, 0, 18.00)
        self.stomper5.setPos(0, 0, 10.00)
        self.stomper4.setPos(0, 0, 22.00)
        self.stomper2.setPos(0, 0, 7.00)
        self.stomper7.setPos(0, 0, 0)
        self.stomper8.setPos(0, 0, 5.00)
        self.stomper9.setPos(0, 0, 13.00)
        self.stomper10.setPos(0, 0, 10.00)
        self.stomper11.setPos(0, 0, 22.00)
        self.stomper12.setPos(0, 0, 7.00)
        self.lStomper = loader.loadModel(
            'phase_9/models/cogHQ/square_stomper.bam')
        self.lStomper.setHpr(-90, 0, 180)
        self.lStomper.reparentTo(render)
        self.lStomper.setScale(3)
        self.lStomper.setPos(-12.5, 0, 3)
        self.rStomper = loader.loadModel(
            'phase_9/models/cogHQ/square_stomper.bam')
        self.rStomper.setHpr(90, 0, 0)
        self.rStomper.reparentTo(render)
        self.rStomper.setScale(3)
        self.rStomper.setPos(12.5, 0, 3)
        self.lStomper.find('**/shaft').setScale(1, 3, 1)
        self.rStomper.find('**/shaft').setScale(1, 3, 1)
        self.lStomper.hide()
        self.rStomper.hide()

        self.music = loader.loadMusic(
            "phase_3/audio/bgm/cc_make-a-cog-theme.wav")
        self.music.play()
        self.music.setLoop(True)

        font = self.loader.loadFont(
            "phase_3/models/fonts/vtRemingtonPortable.ttf")

        self.elevator = loader.loadModel(
            "phase_5/models/cogdominium/cogdominiumElevator.bam")
        self.elevator.reparentTo(self.render)
        self.elevator.setY(25.37)
        self.elevator.find('**/floor_light_buttons').removeNode()
        self.rightDoor = (self.elevator.find('**/right_door'))
        self.leftDoor = (self.elevator.find('**/left_door'))
        self.leftDoor.setX(3.50)
        self.rightDoor.setX(-3.50)

        self.skelCog = Actor(
            "phase_5/models/char/cogC_robot-zero.bam", {
                'neutral': 'phase_3.5/models/char/suitC-neutral.bam',
                'victory': 'phase_4/models/char/suitC-victory.bam',
                'walk': 'phase_3.5/models/char/suitC-walk.bam'
            })
        self.skelCog.reparentTo(self.render)
        self.skelCog.setPos(-16, 0, -4.76)
        self.skelCog.loop('neutral')
        self.skelCog.setH(180)

        self.explosion = self.loader.loadModel(
            "phase_3.5/models/props/explosion.bam")
        self.explosion.reparentTo(self.render)
        self.explosion.setPos(0, -2, 3)
        self.explosion.hide()

        self.flyThru = self.loader.loadModel(
            "phase_5/models/cogdominium/tt_m_gui_csa_flyThru.bam")
        self.flyThru.reparentTo(self.render)
        self.flyThru.setScale(15.42)
        self.flyThru.setPos(-2.90, -8.61, 7.60)
        self.flyThru.find('**/blankScreen_locator').removeNode()
        self.flyThru.find('**/buttonUp_locator').removeNode()
        self.flyThru.find('**/buttonDown_locator').removeNode()
        self.flyThru.find('**/buttonHover_locator').removeNode()
        self.flyThru.hide()

        self.Lawbot = Actor(
            'phase_3.5/models/char/suitC-mod.bam', {
                'neutral': 'phase_3.5/models/char/suitC-neutral.bam',
                'victory': 'phase_4/models/char/suitC-victory.bam',
                'walk': 'phase_3.5/models/char/suitC-walk.bam'
            })
        self.Lawbot.reparentTo(render)
        self.Lawbot.loop('neutral')
        self.TorsoTex = loader.loadTexture('phase_3.5/maps/l_blazer.jpg')
        self.Lawbot.find('**/torso').setTexture(self.TorsoTex, 1)
        self.ArmTex = loader.loadTexture('phase_3.5/maps/l_sleeve.jpg')
        self.Lawbot.find('**/arms').setTexture(self.ArmTex, 1)
        self.LegTex = loader.loadTexture('phase_3.5/maps/l_leg.jpg')
        self.Lawbot.find('**/legs').setTexture(self.LegTex, 1)
        self.Head = loader.loadModel(
            'phase_3.5/models/char/suitC-heads.bam').find('**/flunky')
        self.headTexture = loader.loadTexture(
            "phase_3.5/maps/bottom-feeder.jpg")
        self.Head.reparentTo(self.Lawbot.find('**/joint_head'))
        self.Lawbot.findAllMatches('**/joint_head').setTexture(
            self.headTexture, 1)
        self.icon = loader.loadModel('phase_3/models/gui/cog_icons.bam')
        self.icon.reparentTo(render)
        self.icon.reparentTo(self.Lawbot.find('**/joint_attachMeter'))
        self.icon.find('**/MoneyIcon').removeNode()
        self.icon.find('**/cog').removeNode()
        self.icon.find('**/SalesIcon').removeNode()
        self.icon.find('**/CorpIcon').removeNode()
        self.icon.setH(180)
        self.icon.setScale(0.70)
        self.Lawbot.setH(180.00)
        self.Lawbot.setTransparency(TransparencyAttrib.MAlpha)
        self.Lawbot.setColor(0.0, 0.0, 1.0, 0.7)
        self.Lawbot.find('**/hands').setColor(0.0, 0.0, 0.0, 0.0)
        self.Lawbot.hide()
        Name = TextNode("nametag")
        Name.setText("Bottem Feeder\nLawbot\nLevel 1")
        Name.setFont(font)
        self.nameTag = render.attachNewNode(Name)
        self.nameTag.setBillboardAxis()
        self.nameTag.reparentTo(self.Lawbot.find('**/joint_nameTag'))
        self.nameTag.setZ(7.51)
        Name.setAlign(TextNode.ACenter)
        Name.setCardColor(0.8, 0.8, 0.8, 0.5)
        Name.setCardAsMargin(0.1, 0, 0, -0.2)
        Name.setCardDecal(True)
        Name.setTextColor(0, 0, 0, 1.0)
        self.nameTag.setScale(0.33)

        self.Cashbot = Actor(
            'phase_3.5/models/char/suitC-mod.bam', {
                'neutral': 'phase_3.5/models/char/suitC-neutral.bam',
                'victory': 'phase_4/models/char/suitC-victory.bam',
                'walk': 'phase_3.5/models/char/suitC-walk.bam'
            })
        self.Cashbot.reparentTo(render)
        self.Cashbot.loop('neutral')
        self.TorsoTex = loader.loadTexture('phase_3.5/maps/m_blazer.jpg')
        self.Cashbot.find('**/torso').setTexture(self.TorsoTex, 1)
        self.ArmTex = loader.loadTexture('phase_3.5/maps/m_sleeve.jpg')
        self.Cashbot.find('**/arms').setTexture(self.ArmTex, 1)
        self.LegTex = loader.loadTexture('phase_3.5/maps/m_leg.jpg')
        self.Cashbot.find('**/legs').setTexture(self.LegTex, 1)
        self.Head = loader.loadModel(
            'phase_3.5/models/char/suitC-heads.bam').find('**/coldcaller')
        self.Head.reparentTo(self.Cashbot.find('**/joint_head'))
        self.icon = loader.loadModel('phase_3/models/gui/cog_icons.bam')
        self.icon.reparentTo(render)
        self.icon.reparentTo(self.Cashbot.find('**/joint_attachMeter'))
        self.icon.find('**/SalesIcon').removeNode()
        self.icon.find('**/cog').removeNode()
        self.icon.find('**/LegalIcon').removeNode()
        self.icon.find('**/CorpIcon').removeNode()
        self.icon.setH(180)
        self.icon.setScale(0.70)
        self.Cashbot.setH(180.00)
        self.Cashbot.setTransparency(TransparencyAttrib.MAlpha)
        self.Cashbot.setColor(0.0, 1.0, 0.0, 0.5)
        self.Cashbot.find('**/hands').setColor(0.0, 0.0, 0.0, 0.0)
        self.Cashbot.hide()
        Name = TextNode("nametag")
        Name.setText("Short Change\nCashbot\nLevel 1")
        Name.setFont(font)
        self.nameTag = render.attachNewNode(Name)
        self.nameTag.setBillboardAxis()
        self.nameTag.reparentTo(self.Cashbot.find('**/joint_nameTag'))
        self.nameTag.setZ(7.51)
        Name.setAlign(TextNode.ACenter)
        Name.setCardColor(0.8, 0.8, 0.8, 0.5)
        Name.setCardAsMargin(0.1, 0, 0, -0.2)
        Name.setCardDecal(True)
        Name.setTextColor(0, 0, 0, 1.0)
        self.nameTag.setScale(0.33)
        self.Cashbot.hide()

        self.Sellbot = Actor(
            'phase_3.5/models/char/suitC-mod.bam', {
                'neutral': 'phase_3.5/models/char/suitC-neutral.bam',
                'victory': 'phase_4/models/char/suitC-victory.bam',
                'walk': 'phase_3.5/models/char/suitC-walk.bam'
            })
        self.Sellbot.reparentTo(render)
        self.Sellbot.loop('neutral')
        self.TorsoTex = loader.loadTexture('phase_3.5/maps/s_blazer.jpg')
        self.Sellbot.find('**/torso').setTexture(self.TorsoTex, 1)
        self.ArmTex = loader.loadTexture('phase_3.5/maps/s_sleeve.jpg')
        self.Sellbot.find('**/arms').setTexture(self.ArmTex, 1)
        self.LegTex = loader.loadTexture('phase_3.5/maps/s_leg.jpg')
        self.Sellbot.find('**/legs').setTexture(self.LegTex, 1)
        self.Head = loader.loadModel(
            'phase_3.5/models/char/suitC-heads.bam').find('**/coldcaller')
        self.Head.reparentTo(self.Sellbot.find('**/joint_head'))
        self.Head.reparentTo(self.Sellbot.find('**/joint_head'))
        self.icon = loader.loadModel('phase_3/models/gui/cog_icons.bam')
        self.icon.reparentTo(render)
        self.icon.reparentTo(self.Sellbot.find('**/joint_attachMeter'))
        self.icon.find('**/MoneyIcon').removeNode()
        self.icon.find('**/cog').removeNode()
        self.icon.find('**/LegalIcon').removeNode()
        self.icon.find('**/CorpIcon').removeNode()
        self.Head.setColor(0, 0, 1, 0.4)
        self.icon.setH(180)
        self.icon.setScale(0.70)
        self.Sellbot.setH(180.00)
        self.Sellbot.setTransparency(TransparencyAttrib.MAlpha)
        self.Sellbot.setColor(0.352, 0.227, 0.419, 0.7)
        self.Sellbot.find('**/hands').setColor(0.0, 0.0, 0.0, 0.0)
        Name = TextNode("nametag")
        Name.setText("Cold Caller\nSellbot\nLevel 1")
        Name.setFont(font)
        self.nameTag = render.attachNewNode(Name)
        self.nameTag.setBillboardAxis()
        self.nameTag.reparentTo(self.Sellbot.find('**/joint_nameTag'))
        self.nameTag.setZ(7.51)
        Name.setAlign(TextNode.ACenter)
        Name.setCardColor(0.8, 0.8, 0.8, 0.5)
        Name.setCardAsMargin(0.1, 0, 0, -0.2)
        Name.setCardDecal(True)
        Name.setTextColor(0, 0, 0, 1.0)
        self.nameTag.setScale(0.33)
        self.Sellbot.hide()
        self.Sellbot.setBlend(frameBlend=True)

        self.Bossbot = Actor(
            'phase_3.5/models/char/suitC-mod.bam', {
                'neutral': 'phase_3.5/models/char/suitC-neutral.bam',
                'victory': 'phase_4/models/char/suitC-victory.bam',
                'walk': 'phase_3.5/models/char/suitC-walk.bam'
            })
        self.Bossbot.reparentTo(render)
        self.Bossbot.loop('neutral')
        self.TorsoTex = loader.loadTexture('phase_3.5/maps/c_blazer.jpg')
        self.Bossbot.find('**/torso').setTexture(self.TorsoTex, 1)
        self.ArmTex = loader.loadTexture('phase_3.5/maps/c_sleeve.jpg')
        self.Bossbot.find('**/arms').setTexture(self.ArmTex, 1)
        self.LegTex = loader.loadTexture('phase_3.5/maps/c_leg.jpg')
        self.Bossbot.find('**/legs').setTexture(self.LegTex, 1)
        self.Head = loader.loadModel('phase_3.5/models/char/suitC-heads.bam')
        self.Head.find('**/coldcaller').hide()
        self.Head.find('**/gladhander').hide()
        self.Head.find('**/micromanager').hide()
        self.Head.find('**/moneybags').hide()
        self.Head.find('**/tightwad').hide()
        self.Head.reparentTo(self.Bossbot.find('**/joint_head'))
        self.icon = loader.loadModel('phase_3/models/gui/cog_icons.bam')
        self.icon.reparentTo(render)
        self.icon.reparentTo(self.Bossbot.find('**/joint_attachMeter'))
        self.icon.find('**/MoneyIcon').removeNode()
        self.icon.find('**/cog').removeNode()
        self.icon.find('**/LegalIcon').removeNode()
        self.icon.find('**/SalesIcon').removeNode()
        self.icon.setH(180)
        self.icon.setScale(0.70)
        self.Bossbot.setH(180.00)
        self.Bossbot.setTransparency(TransparencyAttrib.MAlpha)
        self.Bossbot.setColor(0.466, 0.0, 1.0, 0.7)
        self.Bossbot.find('**/hands').setColor(0.0, 0.0, 0.0, 0.0)
        Name = TextNode("nametag")
        Name.setText("Flunky\nBossbot\nLevel 1")
        Name.setFont(font)
        self.nameTag = render.attachNewNode(Name)
        self.nameTag.setBillboardAxis()
        self.nameTag.reparentTo(self.Bossbot.find('**/joint_nameTag'))
        self.nameTag.setZ(7.51)
        Name.setAlign(TextNode.ACenter)
        Name.setCardColor(0.8, 0.8, 0.8, 0.5)
        Name.setCardAsMargin(0.1, 0, 0, -0.2)
        Name.setCardDecal(True)
        Name.setTextColor(0, 0, 0, 1.0)
        self.nameTag.setScale(0.33)
        self.Bossbot.hide()

        self.Sourcebot = Actor(
            'phase_3.5/models/char/suitC-mod.bam', {
                'neutral': 'phase_3.5/models/char/suitC-neutral.bam',
                'victory': 'phase_4/models/char/suitC-victory.bam',
                'walk': 'phase_3.5/models/char/suitC-walk.bam'
            })

        self.Sourcebot.reparentTo(render)
        self.Sourcebot.loop('neutral')
        self.TorsoTex = loader.loadTexture('phase_3.5/maps/t_blazer.jpg')
        self.Sourcebot.find('**/torso').setTexture(self.TorsoTex, 1)
        self.ArmTex = loader.loadTexture('phase_3.5/maps/t_sleeve.jpg')
        self.Sourcebot.find('**/arms').setTexture(self.ArmTex, 1)
        self.LegTex = loader.loadTexture('phase_3.5/maps/t_leg.jpg')
        self.Sourcebot.find('**/legs').setTexture(self.LegTex, 1)
        self.Head = loader.loadModel(
            'phase_3.5/models/char/suitC-heads.bam').find('**/tightwad')
        self.headTexture = loader.loadTexture(
            "phase_3.5/maps/payroll-converter.jpg")
        self.Head.reparentTo(self.Sourcebot.find('**/joint_head'))
        self.Sourcebot.findAllMatches('**/joint_head').setTexture(
            self.headTexture, 1)
        self.icon = loader.loadModel('phase_3/models/gui/SourcebotIcon.bam')
        self.icon.reparentTo(render)
        self.iconTexture = loader.loadTexture('phase_3/maps/SourcebotIcon.png')
        self.icon.setTexture(self.iconTexture, 1)
        self.icon.setHpr(180, 0, 0)
        self.icon.setPos(0.1, 0, -0.30)
        self.icon.setScale(1.00)
        self.icon.reparentTo(self.Sourcebot.find('**/joint_attachMeter'))
        self.Sourcebot.setTransparency(TransparencyAttrib.MAlpha)
        self.Sourcebot.setColor(0.9, 0.6, 0.8, 0.7)
        self.Sourcebot.find('**/hands').setColor(0.0, 0.0, 0.0, 0.0)
        Name = TextNode("nametag")
        Name.setText("Payroll Converter\nSourcebot\nLevel 1")
        Name.setFont(font)
        self.nameTag = render.attachNewNode(Name)
        self.nameTag.setBillboardAxis()
        self.nameTag.reparentTo(self.Sourcebot.find('**/joint_nameTag'))
        self.nameTag.setZ(7.51)
        Name.setAlign(TextNode.ACenter)
        Name.setCardColor(0.8, 0.8, 0.8, 0.5)
        Name.setCardAsMargin(0.1, 0, 0, -0.2)
        Name.setCardDecal(True)
        Name.setTextColor(0, 0, 0, 1.0)
        self.nameTag.setScale(0.33)
        self.Sourcebot.setH(180)
        self.Sourcebot.hide()

        #------sfx------#

        self.cameraMoveSfx = self.loader.loadSfx(
            "phase_9/audio/sfx/CHQ_FACT_elevator_up_down_loop.ogg")
        self.cameraMoveSfx.setVolume(5.0)

        self.click = self.loader.loadSfx("phase_3/audio/sfx/cc_click.ogg")
        self.hover = self.loader.loadSfx(
            "phase_3/audio/sfx/cc_hover-over-button.ogg")

        self.poof = self.loader.loadSfx(
            "phase_4/audio/sfx/firework_distance_02.ogg")
        self.largeSmash = self.loader.loadSfx(
            "phase_9/audio/sfx/CHQ_FACT_stomper_large.ogg")
        self.largeSmashExec = SoundInterval(self.largeSmash, duration=5.5)

        self.conveyorBeltSfx = self.loader.loadSfx(
            "phase_12/audio/sfx/CHQ_FACT_conveyor_belt.ogg")

        self.cogDialSHORT = self.loader.loadSfx(
            "phase_3.5/audio/dial/COG_VO_grunt.ogg")
        self.cogDialMED = self.loader.loadSfx(
            "phase_3.5/audio/dial/COG_VO_statement.ogg")
        self.cogDialLONG = self.loader.loadSfx(
            "phase_3.5/audio/dial/COG_VO_murmur.ogg")
        self.cogDialQUESTION = self.loader.loadSfx(
            "phase_3.5/audio/dial/COG_VO_question.ogg")

        #-----Sequences------#

        Walk1 = self.stomper1.posInterval(9.50, Point3(0, 0, 18.00))
        Walk2 = self.stomper1.posInterval(9.50, Point3(0, 0, 0))
        self.stomperPound1 = Sequence(Walk1, Walk2)
        self.stomperPound1.loop()

        Walk1 = self.stomper6.posInterval(9.50, Point3(0, 0, 18.00))
        Walk2 = self.stomper6.posInterval(9.50, Point3(0, 0, 0))
        self.stomperPound2 = Sequence(Walk1, Walk2)
        self.stomperPound2.loop()

        Walk1 = self.stomper3.posInterval(9.50, Point3(0, 0, 0))
        Walk2 = self.stomper3.posInterval(9.50, Point3(0, 0, 18.00))
        self.stomperPound3 = Sequence(Walk1, Walk2)
        self.stomperPound3.loop()

        Walk1 = self.stomper5.posInterval(5.50, Point3(0, 0, 0))
        Walk2 = self.stomper5.posInterval(5.50, Point3(0, 0, 10.00))
        self.stomperPound4 = Sequence(Walk1, Walk2)
        self.stomperPound4.loop()

        Walk1 = self.stomper4.posInterval(5.50, Point3(0, 0, 0))
        Walk2 = self.stomper4.posInterval(5.50, Point3(0, 0, 22.00))
        self.stomperPound5 = Sequence(Walk1, Walk2)
        self.stomperPound5.loop()

        Walk1 = self.stomper2.posInterval(3.50, Point3(0, 0, 0))
        Walk2 = self.stomper2.posInterval(3.50, Point3(0, 0, 7.00))
        self.stomperPound6 = Sequence(Walk1, Walk2)
        self.stomperPound6.loop()

        Walk1 = self.stomper7.posInterval(9.50, Point3(0, 0, 18.00))
        Walk2 = self.stomper7.posInterval(9.50, Point3(0, 0, 0))
        self.stomperPound7 = Sequence(Walk1, Walk2)
        self.stomperPound7.loop()

        Walk1 = self.stomper8.posInterval(5.50, Point3(0, 0, 5.00))
        Walk2 = self.stomper8.posInterval(9.50, Point3(0, 0, 0))
        self.stomperPound8 = Sequence(Walk1, Walk2)
        self.stomperPound8.loop()

        Walk1 = self.stomper9.posInterval(6.50, Point3(0, 0, 0))
        Walk2 = self.stomper9.posInterval(6.50, Point3(0, 0, 13.00))
        self.stomperPound9 = Sequence(Walk1, Walk2)
        self.stomperPound9.loop()

        Walk1 = self.stomper10.posInterval(5.50, Point3(0, 0, 0))
        Walk2 = self.stomper10.posInterval(5.50, Point3(0, 0, 10.00))
        self.stomperPound10 = Sequence(Walk1, Walk2)
        self.stomperPound10.loop()

        Walk1 = self.stomper11.posInterval(5.50, Point3(0, 0, 0))
        Walk2 = self.stomper11.posInterval(5.50, Point3(0, 0, 22.00))
        self.stomperPound11 = Sequence(Walk1, Walk2)
        self.stomperPound11.loop()

        Walk1 = self.stomper12.posInterval(3.50, Point3(0, 0, 0))
        Walk2 = self.stomper12.posInterval(3.50, Point3(0, 0, 7.00))
        self.stomperPound12 = Sequence(Walk1, Walk2)
        self.stomperPound12.loop()

        Walk1 = self.camera.posInterval(1.50, Point3(0, -77.48, 3.42))
        Spin1 = self.camera.hprInterval(1.00, Vec3(0, 0, 0))
        Walk2 = self.camera.posInterval(2.50, Point3(0, -77.48, 3.42))
        Walk3 = self.camera.posInterval(3.00, Point3(0, -22.48, 3.42))
        self.cameraStart = Sequence(Walk1, Spin1, Walk2, Walk3)

        Walk1 = self.camera.posInterval(3.00, Point3(0, -22.48, 3.42))
        Spin1 = self.camera.hprInterval(0.00, Vec3(0, 0, 0))
        self.cameraStartAgain = Sequence(Walk1, Spin1)

        skelMove1 = self.skelCog.posInterval(0.50, Point3(-16, -0, 0))
        skelMove2 = self.skelCog.posInterval(2.00, Point3(0, -0, 0))
        self.skelMove = Sequence(skelMove1, skelMove2)

        Walk1 = self.camera.posInterval(15.50, Point3(6.31, -45.31, 9.27))
        Spin1 = self.camera.hprInterval(0.00, Vec3(337.52, 0, 0))
        Walk2 = self.camera.posInterval(0.00, Point3(6.08, -100.53, 9.27))
        Walk3 = self.camera.posInterval(12.00, Point3(14.07, -77.33, 9.27))
        Walk4 = self.camera.posInterval(0.00, Point3(18.93, -82.36, 25.51))
        Spin2 = self.camera.hprInterval(0.00, Vec3(30.26, 347.91, 0))
        Walk5 = self.camera.posInterval(15.00, Point3(0.44, -51.38, 21.411))
        Spin3 = self.camera.hprInterval(0.00, Vec3(337.52, 0, 0))
        self.cameraIntro = Sequence(Walk1, Spin1, Walk2, Walk3, Walk4, Spin2,
                                    Walk5, Spin3)
        self.cameraIntro.loop()

        rotate1 = self.camera.hprInterval(3.00, Vec3(-25, 0, 0))
        self.cameraRotate = Sequence(rotate1)

        fly = self.flyThru.hprInterval(1.00, Vec3(180, 0, 0))
        self.flyThruDONE = Sequence(fly)

        move1 = self.Sellbot.hprInterval(1.50, Vec3(196.26, 0, 0))
        move2 = self.Sellbot.posInterval(2.00, Point3(12.43, -5.09, 0))
        move3 = self.Sellbot.hprInterval(2.00, Vec3(140.91, 0, 0))
        self.SellbotMove = Sequence(move1, move2, move3)

        move1 = self.Lawbot.hprInterval(1.50, Vec3(196.26, 0, 0))
        move2 = self.Lawbot.posInterval(2.00, Point3(12.43, -5.09, 0))
        move3 = self.Lawbot.hprInterval(2.00, Vec3(140.91, 0, 0))
        self.LawbotMove = Sequence(move1, move2, move3)

        move1 = self.Cashbot.hprInterval(1.50, Vec3(196.26, 0, 0))
        move2 = self.Cashbot.posInterval(2.00, Point3(12.43, -5.09, 0))
        move3 = self.Cashbot.hprInterval(2.00, Vec3(140.91, 0, 0))
        self.CashbotMove = Sequence(move1, move2, move3)

        move1 = self.Bossbot.hprInterval(1.50, Vec3(196.26, 0, 0))
        move2 = self.Bossbot.posInterval(2.00, Point3(12.43, -5.09, 0))
        move3 = self.Bossbot.hprInterval(2.00, Vec3(140.91, 0, 0))
        self.BossbotMove = Sequence(move1, move2, move3)

        move1 = self.Sourcebot.hprInterval(1.50, Vec3(196.26, 0, 0))
        move2 = self.Sourcebot.posInterval(2.00, Point3(12.43, -5.09, 0))
        move3 = self.Sourcebot.hprInterval(2.00, Vec3(140.91, 0, 0))
        self.SourcebotMove = Sequence(move1, move2, move3)

        rotate1 = self.camera.hprInterval(1.00, Vec3(-21, 0, 0))
        move1 = self.camera.posInterval(1.00, Vec3(-2.24, -22.97, 5.02))
        self.toPro = Sequence(rotate1, move1)

        move1 = self.leftDoor.posInterval(1.50, Point3(0, 0, 0))
        self.elevatorOpenLeft = Sequence(move1)
        move1 = self.rightDoor.posInterval(1.50, Point3(0, 0, 0))
        self.elevatorOpenRight = Sequence(move1)

        lSmashB = self.lStomper.posInterval(0.125, Point3(0.01, 0, 3))
        lSmashE = self.lStomper.posInterval(1, Point3(-15, 0, 3))
        rSmashB = self.rStomper.posInterval(0.125, Point3(-0.01, 0, 3))
        rSmashE = self.rStomper.posInterval(1, Point3(15, 0, 3))
        lemmeSmashL = Sequence(lSmashB, Wait(1.25), lSmashE)
        lemmeSmashR = Sequence(rSmashB, Wait(1.25), rSmashE)
        self.lemmeSmash = \
            Parallel(
            lemmeSmashL, self.largeSmashExec,
            lemmeSmashR,
            name="Lemme Smash"
        )

        #----camera---#

        self.camera.setPos(6.31, -82.36, 9.27)
        self.camera.setHpr(35.71, 0, 0)

        #-----buttons-------#

        ButtonImage = self.loader.loadModel(
            "phase_3/models/gui/cc_icon_gui_check_x.bam")
        self.finish = DirectButton(frameSize=None,
                                   image=(ButtonImage.find('**/check_up'),
                                          ButtonImage.find('**/check_down'),
                                          ButtonImage.find('**/check_up')),
                                   relief=None,
                                   clickSound=self.click,
                                   command=self.moveCameraToNameTag,
                                   geom=None,
                                   pad=(0.01, 0.01),
                                   suppressKeys=0,
                                   pos=(1.5, 0, -0.8),
                                   borderWidth=(0.13, 0.01),
                                   scale=.3)
        self.finish.hide()

        ButtonImage = self.loader.loadModel(
            "phase_3/models/gui/cc_icon_gui_check_x.bam")
        self.finish2 = DirectButton(frameSize=None,
                                    image=(ButtonImage.find('**/check_up'),
                                           ButtonImage.find('**/check_down'),
                                           ButtonImage.find('**/check_up')),
                                    relief=None,
                                    clickSound=self.click,
                                    command=self.intoPro,
                                    geom=None,
                                    pad=(0.01, 0.01),
                                    suppressKeys=0,
                                    pos=(1.5, 0, -0.8),
                                    borderWidth=(0.13, 0.01),
                                    scale=.3)
        self.finish2.hide()

        ButtonImage = self.loader.loadModel(
            "phase_3/models/gui/cc_icon_gui_check_x.bam")
        self.exit = DirectButton(frameSize=None,
                                 image=(ButtonImage.find('**/close_up'),
                                        ButtonImage.find('**/close_down'),
                                        ButtonImage.find('**/close_up')),
                                 relief=None,
                                 command=self.goBack,
                                 clickSound=self.click,
                                 geom=None,
                                 pad=(0.01, 0.01),
                                 suppressKeys=0,
                                 pos=(-1.5, 0, -0.8),
                                 borderWidth=(0.13, 0.01),
                                 scale=.3)
        self.exit.hide()

        self.folder = OnscreenImage(image='phase_3.5/maps/cc_metal-plate.png',
                                    pos=(1.50, 0, 0.4),
                                    scale=(0.6))
        self.folder.setTransparency(TransparencyAttrib.MAlpha)
        self.folder.hide()

        ButtonImage = loader.loadModel(
            "phase_3/models/gui/cc_icon_gui_buttons_departments.bam")
        self.systems = DirectButton(
            frameSize=None,
            image=(ButtonImage.find('**/button_up'),
                   ButtonImage.find('**/button_down'),
                   ButtonImage.find('**/button_hover')),
            relief=None,
            command=self.systemGUIpopup,
            clickSound=self.click,
            rolloverSound=self.hover,
            geom=None,
            pad=(0.01, 0.01),
            suppressKeys=0,
            pos=(1.3, 0, 0.8),
            borderWidth=(0.13, 0.01),
            scale=0.5)
        self.systems.hide()

        ButtonImage = loader.loadModel(
            "phase_3/models/gui/cc_icon_gui_buttons_arrow_skip.bam")
        self.SellbotButton = DirectButton(
            frameSize=None,
            image=(ButtonImage.find('**/click_up'),
                   ButtonImage.find('**/click_down'),
                   ButtonImage.find('**/click_hover')),
            relief=None,
            command=self.spawnSellbot,
            clickSound=self.click,
            rolloverSound=self.hover,
            geom=None,
            pad=(0.01, 0.01),
            suppressKeys=0,
            pos=(1.5, 0, 0.6),
            borderWidth=(0.13, 0.01),
            scale=0.4)
        self.SellbotButton.hide()

        ButtonImage = loader.loadModel(
            "phase_3/models/gui/cc_icon_gui_buttons_arrow_skip.bam")
        self.LawbotButton = DirectButton(
            frameSize=None,
            image=(ButtonImage.find('**/click_up'),
                   ButtonImage.find('**/click_down'),
                   ButtonImage.find('**/click_hover')),
            relief=None,
            command=self.spawnLawbot,
            clickSound=self.click,
            rolloverSound=self.hover,
            geom=None,
            pad=(0.01, 0.01),
            suppressKeys=0,
            pos=(1.5, 0, 0.5),
            borderWidth=(0.13, 0.01),
            scale=0.4)
        self.LawbotButton.hide()

        ButtonImage = loader.loadModel(
            "phase_3/models/gui/cc_icon_gui_buttons_arrow_skip.bam")
        self.CashbotButton = DirectButton(
            frameSize=None,
            image=(ButtonImage.find('**/click_up'),
                   ButtonImage.find('**/click_down'),
                   ButtonImage.find('**/click_hover')),
            relief=None,
            command=self.spawnCashbot,
            clickSound=self.click,
            rolloverSound=self.hover,
            geom=None,
            pad=(0.01, 0.01),
            suppressKeys=0,
            pos=(1.5, 0, 0.4),
            borderWidth=(0.13, 0.01),
            scale=0.4)
        self.CashbotButton.hide()

        ButtonImage = loader.loadModel(
            "phase_3/models/gui/cc_icon_gui_buttons_arrow_skip.bam")
        self.BossbotButton = DirectButton(
            frameSize=None,
            image=(ButtonImage.find('**/click_up'),
                   ButtonImage.find('**/click_down'),
                   ButtonImage.find('**/click_hover')),
            relief=None,
            command=self.spawnBossbot,
            clickSound=self.click,
            rolloverSound=self.hover,
            geom=None,
            pad=(0.01, 0.01),
            suppressKeys=0,
            pos=(1.5, 0, 0.3),
            borderWidth=(0.13, 0.01),
            scale=0.4)
        self.BossbotButton.hide()

        ButtonImage = loader.loadModel(
            "phase_3/models/gui/cc_icon_gui_buttons_arrow_skip.bam")
        self.SourcebotButton = DirectButton(
            frameSize=None,
            image=(ButtonImage.find('**/click_up'),
                   ButtonImage.find('**/click_down'),
                   ButtonImage.find('**/click_hover')),
            relief=None,
            command=self.spawnSourcebot,
            clickSound=self.click,
            rolloverSound=self.hover,
            geom=None,
            pad=(0.01, 0.01),
            suppressKeys=0,
            pos=(1.5, 0, 0.2),
            borderWidth=(0.13, 0.01),
            scale=0.4)
        self.SourcebotButton.hide()

        ButtonImage = loader.loadModel(
            "phase_5/models/cogdominium/tt_m_gui_csa_flyThru.bam")
        self.flyThruButton = DirectButton(
            frameSize=None,
            image=(ButtonImage.find('**/buttonUp'),
                   ButtonImage.find('**/buttonDown'),
                   ButtonImage.find('**/buttonHover')),
            relief=None,
            command=self.setText,
            geom=None,
            pad=(0.01, 0.01),
            suppressKeys=0,
            pos=(-0.2, 0, 0.75),
            clickSound=self.click,
            rolloverSound=self.hover,
            borderWidth=(0.13, 0.01),
            scale=4)
        self.flyThruButton.hide()

        #-----texts-------#
        self.logoLeft = OnscreenImage(
            image='phase_3/maps/cogcitycodeaffix-logo-hor-left[OLD].png',
            pos=(-0.46, 0, 0.2),
            scale=(0.7))
        self.logoLeft.setTransparency(TransparencyAttrib.MAlpha)

        self.logoRight = OnscreenImage(
            image='phase_3/maps/cogcitycodeaffix-logo-hor-right[OLD].png',
            pos=(0.56, 0, 0.18),
            scale=(0.7))
        self.logoRight.setTransparency(TransparencyAttrib.MAlpha)

        self.nameType = OnscreenImage(
            image='phase_3.5/maps/cc_type-a-name.png',
            pos=(-0.49, 0, 0.1),
            scale=0.8)
        self.nameType.setTransparency(TransparencyAttrib.MAlpha)
        self.nameType.hide()

        b = DirectEntry(text="",
                        scale=.08,
                        pos=(-0.9, 0, 0.08),
                        numLines=2,
                        focus=3)
        b.hide()

        text = TextNode("play")
        text.setText("Press ENTER to play")
        text.setFont(font)

        self.textNodePath = aspect2d.attachNewNode(text)
        self.textNodePath.setScale(0.09)
        self.textNodePath.setPos(-0.5, 0, -0.7)

        self.text2 = TextNode("play")
        self.text2.setText(
            "Hello, I am The Big Cheese, one of your superiors...")
        self.text2.setFont(font)
        self.text2.setWordwrap(25)
        self.textNodePath2 = aspect2d.attachNewNode(self.text2)
        self.textNodePath2.setScale(0.05)
        self.textNodePath2.setPos(-1.2, 0, 0.6)
        self.textNodePath2.setColor(0, 0, 0)
        self.textNodePath2.hide()

        #-----collisions-----#

        self.collblock = self.loader.loadModel(
            "phase_4/models/modules/collisionBlock.bam")

        self.collblock = self.collblock.attachNewNode(
            CollisionNode('block_collision'))
        self.collblock.node().addSolid(CollisionSphere(0, 0, 0, 0.3))
        self.collblock.node().setIntoCollideMask(BitMask32.allOff())

        #-------times-----#

        self.t = Sequence(Func(self.finish.hide), Wait(9),
                          Func(self.flyThru.show),
                          Func(self.flyThruButton.show),
                          Func(self.textNodePath2.show),
                          Func(self.cogDialMED.play))
        self.t2 = Sequence(Func(self.explosion.show), Wait(0.30),
                           Func(self.explosion.hide))
        self.t3 = Sequence(Func(self.cameraMoveSfx.play), Wait(2.60),
                           Func(self.cameraMoveSfx.stop), Wait(2.50),
                           Func(self.cameraMoveSfx.play), Wait(2.78),
                           Func(self.cameraMoveSfx.stop), Wait(0.20))
        self.t4 = Sequence(Func(self.flyThruButton.hide), Wait(2.00),
                           Func(self.flyThruButton.show))
        self.t5 = Sequence(Func(self.conveyorBeltSfx.play), Wait(2.50),
                           Func(self.conveyorBeltSfx.stop))
        self.t6 = Sequence(Func(self.flyThruDONE.start), Wait(2.50),
                           Func(self.flyThru.hide))
        self.t7 = Sequence(Func(self.moveINT), Func(self.cameraMoveSfx.play),
                           Wait(5.50), Func(self.moveINTSTOP),
                           Func(self.cameraMoveSfx.stop), Func(b.show),
                           Func(self.finish2.show))
        self.t8 = Sequence(Func(self.cameraMoveSfx.play), Wait(2.00),
                           Func(self.cameraMoveSfx.stop), Wait(0.70),
                           Func(self.elevatorOpenLeft.start),
                           Func(self.elevatorOpenRight.start))

        #----------key/click-events-------#

        self.acceptOnce("enter-up", self.play)
        self.accept("alt-o", self.oobe)
    def __init__(self, base, Golog, folder_path, parent=None):
        # Set up basic attributes
        self.base = base
        self.golog = Golog
        self.bools = {'textboxes': True}
        self.buttons = dict()
        self.window_tasks = dict()
        self.bt = None
        self.mw = None
        self.listener = DirectObject()
        self.folder_path = folder_path
        self.file_path = os.path.abspath(self.folder_path + '/' +
                                         self.golog.label + '.golog')
        self.has_window = False
        self.parent = parent  #for autosaving up to original golog
        self.reset = self.basic_reset
        self.garbage = []  #list of deleted math_data/graphics_data etc.

        #create a 2d rende
        self.render2d = NodePath('2d render')
        self.camera2D = self.render2d.attachNewNode(Camera('2d Camera'))
        self.camera2D.setDepthTest(False)
        self.camera2D.setDepthWrite(False)
        lens = OrthographicLens()
        lens.setFilmSize(2, 2)
        lens.setNearFar(-1000, 1000)
        self.camera2D.node().setLens(lens)

        # make a dictionary of mode_heads in the underlying golog
        if hasattr(self.golog, 'mode_heads'):
            m = 0
            while m in self.golog.mode_heads.keys():
                m += 1  #get smallest unused mode_head index
            self.index = m
            self.label = self.golog.label + "_mode_head_" + str(self.index)
            self.golog.mode_heads[self.index] = self

        else:
            self.golog.mode_heads = dict()
            self.index = 0
            self.label = self.golog.label + "_mode_head_" + str(self.index)
            self.golog.mode_heads[self.index] = self
        ##########

        ### set up collision handling ###
        self.queue = CollisionHandlerQueue()
        self.selected = [[],
                         []]  #tracking previously selected nodes of each level

        # set up mouse picker
        self.pickerNode = CollisionNode('mouseRay')
        self.pickerNP = self.golog.camera.attachNewNode(
            self.pickerNode)  #attach collision node to camera
        self.pickerRay = CollisionRay()
        self.pickerNode.addSolid(self.pickerRay)
        self.pickerNode.set_into_collide_mask(
            0
        )  #so that collision rays don't collide into each other if there are two mode_heads
        self.golog.cTrav.addCollider(
            self.pickerNP, self.queue)  #send collisions to self.queue
        # set up plane for picking
        self.planeNode = self.golog.render.attachNewNode("plane")
        self.planeNode.setTag(
            "mode_head", self.label)  # tag to say it belongs to this mode_head
        self.planeNode.setTag("mode_node", 'plane')
        self.planeFromObject = self.planeNode.attachNewNode(
            CollisionNode("planeColNode"))
        self.planeFromObject.node().addSolid(
            CollisionPlane(Plane(Vec3(0, -1, 0), Point3(0, 0, 0))))
        ###
        # set up preview text
        self.textNP = self.render2d.attachNewNode(TextNode('text node'))
        self.textNP.setScale(.2)
        self.textNP.setPos(-1, 0, 0)
        self.textNP.show()
        #set up dragging info
        self.grabbed_dict = None
Beispiel #3
0
    def wallColliders(self):
        '''
            Creates and postions colliders that correspond to the walls of
            the game map.
        '''
        # walls
        wallSolid = CollisionTube(-7.0, 39, -2, 7, 39, -2, 1.2)
        #wallSolid = CollisionBox(Point3(-5,64,-4), Point3(2.5, 2.5, 0.25))
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        #wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(-2.0, 61, -2, 7, 61, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(-7.0, 30, -2, -7, 61, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(7.0, 40, -2, 7, 61, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(-38, -1, -2, -38, 124, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(38, -1, -2, 38, 124, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(-38, 124, -2, 38, 124, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(-38, -1, -2, 38, -1, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(-38, 101, -2, 0, 101, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(1, 101, -2, 1, 114, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(22.5, 62, -2, 22.5, 93, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
        #wall.show()

        wallSolid = CollisionTube(8, 92.5, -2, 22.5, 92.5, -2, 1.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)
Beispiel #4
0
    def getDropIval(self, x, y, dropObjName, generation, num):
        objType = PartyGlobals.Name2DropObjectType[dropObjName]
        id = (generation, num)
        dropNode = hidden.attachNewNode('catchDropNode%s' % (id, ))
        dropNode.setPos(x, y, 0)
        shadow = self.dropShadow.copyTo(dropNode)
        shadow.setZ(PartyGlobals.CatchDropShadowHeight)
        shadow.setColor(1, 1, 1, 1)
        object = self.getObjModel(dropObjName)
        object.reparentTo(hidden)
        if dropObjName in ('watermelon', 'anvil'):
            objH = object.getH()
            absDelta = {'watermelon': 12, 'anvil': 15}[dropObjName]
            delta = (self.randomNumGen.random() * 2.0 - 1.0) * absDelta
            newH = objH + delta
        else:
            newH = self.randomNumGen.random() * 360.0
        object.setH(newH)
        sphereName = 'FallObj%s' % (id, )
        radius = self.ObjRadius
        if objType.good:
            radius *= lerp(1.0, 1.3, 0.5)
        collSphere = CollisionSphere(0, 0, 0, radius)
        collSphere.setTangible(0)
        collNode = CollisionNode(sphereName)
        collNode.setCollideMask(PartyGlobals.CatchActivityBitmask)
        collNode.addSolid(collSphere)
        collNodePath = object.attachNewNode(collNode)
        collNodePath.hide()
        if self.ShowObjSpheres:
            collNodePath.show()
        catchEventName = 'ltCatch' + sphereName

        def eatCollEntry(forward, collEntry):
            forward()

        self.accept(
            catchEventName,
            Functor(eatCollEntry, Functor(self.__handleCatch, id[0], id[1])))

        def cleanup(self=self, dropNode=dropNode, id=id, event=catchEventName):
            self.ignore(event)
            dropNode.removeNode()

        duration = objType.fallDuration
        onscreenDuration = objType.onscreenDuration
        targetShadowScale = 0.3
        if self.trickShadows:
            intermedScale = targetShadowScale * (self.OffscreenTime /
                                                 self.BaselineDropDuration)
            shadowScaleIval = Sequence(
                LerpScaleInterval(shadow,
                                  self.OffscreenTime,
                                  intermedScale,
                                  startScale=0))
            shadowScaleIval.append(
                LerpScaleInterval(shadow,
                                  duration - self.OffscreenTime,
                                  targetShadowScale,
                                  startScale=intermedScale))
        else:
            shadowScaleIval = LerpScaleInterval(shadow,
                                                duration,
                                                targetShadowScale,
                                                startScale=0)
        targetShadowAlpha = 0.4
        shadowAlphaIval = LerpColorScaleInterval(
            shadow,
            self.OffscreenTime,
            Point4(1, 1, 1, targetShadowAlpha),
            startColorScale=Point4(1, 1, 1, 0))
        shadowIval = Parallel(shadowScaleIval, shadowAlphaIval)
        if self.useGravity:

            def setObjPos(t, objType=objType, object=object):
                z = objType.trajectory.calcZ(t)
                object.setZ(z)

            setObjPos(0)
            dropIval = LerpFunctionInterval(setObjPos,
                                            fromData=0,
                                            toData=onscreenDuration,
                                            duration=onscreenDuration)
        else:
            startPos = Point3(0, 0, self.MinOffscreenHeight)
            object.setPos(startPos)
            dropIval = LerpPosInterval(object,
                                       onscreenDuration,
                                       Point3(0, 0, 0),
                                       startPos=startPos,
                                       blendType='easeIn')
        ival = Sequence(Func(Functor(dropNode.reparentTo, self.root)),
                        Parallel(
                            Sequence(
                                WaitInterval(self.OffscreenTime),
                                Func(Functor(object.reparentTo, dropNode)),
                                dropIval), shadowIval),
                        Func(cleanup),
                        name='drop%s' % (id, ))
        if objType == PartyGlobals.Name2DropObjectType['anvil']:
            ival.append(Func(self.playAnvil))
        return ival
Beispiel #5
0
    def __init__(self):
        ShowBase.__init__(self)
        props = WindowProperties()
        props.setTitle("Gesture Maze")
        base.win.requestProperties(props)

        self.tital = OnscreenText(text="Gesture Maze Control",
                                  parent=base.a2dTopLeft,
                                  align=TextNode.ALeft,
                                  pos=(0.05, -0.08),
                                  fg=(1, 1, 1, 1),
                                  scale=0.06,
                                  shadow=(0, 0, 0, 0.5))
        self.accept("escape", sys.exit)

        camera_num = 0
        self.gesture_controler = gesture_control.GestureControler(0)

        self.disableMouse()
        camera.setPosHpr(0, 0, 25, 0, -90, 0)

        self.maze = loader.loadModel("models/%s" % settings.maze_id)
        self.maze.reparentTo(render)

        self.walls = self.maze.find("**/wall_collide")

        self.walls.node().setIntoCollideMask(BitMask32.bit(0))

        # self.walls.show()

        self.loseTriggers = []
        for i in range(6):
            trigger = self.maze.find("**/hole_collide" + str(i))
            trigger.node().setIntoCollideMask(BitMask32.bit(0))
            trigger.node().setName("loseTriggers")
            self.loseTriggers.append(trigger)

            # trigger.show()

        self.mazeGround = self.maze.find("**/ground_collide")
        self.mazeGround.node().setIntoCollideMask(BitMask32.bit(1))

        self.ballRoot = render.attachNewNode("ballRoot")
        self.ball = loader.loadModel("models/ball")
        self.ball.reparentTo(self.ballRoot)

        self.ballSphere = self.ball.find("**/ball")
        self.ballSphere.node().setFromCollideMask(BitMask32.bit(0))
        self.ballSphere.node().setIntoCollideMask(BitMask32.allOff())

        self.ballGroundRay = CollisionRay()
        self.ballGroundRay.setOrigin(0, 0, 10)
        self.ballGroundRay.setDirection(0, 0, -1)

        self.ballGroundCol = CollisionNode("groundRay")
        self.ballGroundCol.addSolid(self.ballGroundRay)
        self.ballGroundCol.setFromCollideMask(BitMask32.bit(1))
        self.ballGroundCol.setIntoCollideMask(BitMask32.allOff())

        self.ballGroundColNp = self.ballRoot.attachNewNode(self.ballGroundCol)
        # self.ballGroundColNp.show()

        self.cTrav = CollisionTraverser()
        self.cHandler = CollisionHandlerQueue()

        self.cTrav.addCollider(self.ballSphere, self.cHandler)
        self.cTrav.addCollider(self.ballGroundColNp, self.cHandler)
        # self.cTrav.showCollisions(render)

        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor((.55, .55, .55, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(LVector3(0, 0, -1))
        directionalLight.setColor((0.375, 0.375, 0.375, 1))
        directionalLight.setSpecularColor((1, 1, 1, 1))
        self.ballRoot.setLight(render.attachNewNode(ambientLight))
        self.ballRoot.setLight(render.attachNewNode(directionalLight))

        m = Material()
        m.setSpecular((1, 1, 1, 1))
        m.setShininess(96)
        self.ball.setMaterial(m, 1)

        self.start()
Beispiel #6
0
    def __init__(self, name='NONAME', id=None):
        NetEnt.__init__(self, id)
        self.node = NetNodePath(PandaNode('A Character'))
        self.node.setTag('ID', str(self.id))
        if not id:
            self.spawn()
        self.node.reparentTo(render)
        CharacterPool.add(self)
        self.xVelocity = 0
        self.yVelocity = 0
        self.vertVelocity = None
        self.duck = False
        self.deltaT = 0

        self.sprite = Sprite2d('resources/origsprite.png',
                               rows=3,
                               cols=8,
                               rowPerFace=(0, 1, 2, 1))
        self.sprite.createAnim('walk', (1, 0, 2, 0))
        self.sprite.createAnim('kick', (5, 6, 7, 6, 5))
        self.sprite.node.reparentTo(self.node)

        # set up character's name label
        self.nameNode = NodePath(TextNode('Char Name'))
        self.nameNode.node().setText(name)
        self.nameNode.node().setAlign(TextNode.ACenter)
        self.nameNode.node().setCardColor(0.2, 0.2, 0.2, 0.5)
        self.nameNode.node().setCardAsMargin(0, 0, 0, 0)
        self.nameNode.node().setCardDecal(True)
        self.nameNode.setZ(1.7)
        self.nameNode.setScale(0.2)
        self.nameNode.setBillboardAxis()
        self.nameNode.reparentTo(self.node)

        # collision
        self.collisionHandler = CollisionHandlerQueue()
        # set up 'from' collision - for detecting char hitting things
        self.fromCollider = self.node.attachNewNode(
            CollisionNode('fromCollider'))
        self.fromCollider.node().addSolid(CollisionRay(0, 0, 2, 0, 0, -1))
        self.fromCollider.node().setIntoCollideMask(BITMASK_EMPTY)
        self.fromCollider.node().setFromCollideMask(BITMASK_TERRAIN)
        if SHOW_COLLISIONS:
            self.fromCollider.show()
        Character.collisionTraverser.addCollider(self.fromCollider,
                                                 self.collisionHandler)

        # set up 'into' collision - for detecting things hitting char
        self.intoCollider = self.node.attachNewNode(
            CollisionNode('intoCollider'))
        self.intoCollider.node().addSolid(
            CollisionTube(0, 0, 0.5, 0, 0, 1, 0.5))
        self.intoCollider.node().setIntoCollideMask(BITMASK_CHARACTER)
        self.intoCollider.node().setFromCollideMask(BITMASK_EMPTY)
        if SHOW_COLLISIONS:
            self.intoCollider.show()

        self.oldPosition = self.node.getPos()
        self.collisionZ = self.node.getZ()

        # set up weapons
        self.sinceShoot = 10

        # speculated client history - used for input prediction
        self.posHistory = []
Beispiel #7
0
 def __init__(self, entity, center=(0, 0, 0), radius=.5):
     super().__init__()
     self.shape = CollisionSphere(center[0], center[1], center[2], radius)
     self.node_path = entity.attachNewNode(CollisionNode('CollisionNode'))
     self.node_path.node().addSolid(self.shape)
     self.visible = False
    def load(self):
        self.notify.debug('load')
        DistributedMinigame.load(self)
        self.music = base.loader.loadMusic('phase_4/audio/bgm/MG_CogThief.ogg')
        self.initCogInfo()
        for barrelIndex in xrange(CTGG.NumBarrels):
            barrel = loader.loadModel(
                'phase_4/models/minigames/cogthief_game_gagTank')
            barrel.setPos(CTGG.BarrelStartingPositions[barrelIndex])
            barrel.setScale(self.BarrelScale)
            barrel.reparentTo(render)
            barrel.setTag('barrelIndex', str(barrelIndex))
            collSphere = CollisionSphere(0, 0, 0, 4)
            collSphere.setTangible(0)
            name = 'BarrelSphere-%d' % barrelIndex
            collSphereName = self.uniqueName(name)
            collNode = CollisionNode(collSphereName)
            collNode.setFromCollideMask(CTGG.BarrelBitmask)
            collNode.addSolid(collSphere)
            colNp = barrel.attachNewNode(collNode)
            handler = CollisionHandlerEvent()
            handler.setInPattern('barrelHit-%fn')
            base.cTrav.addCollider(colNp, handler)
            self.accept('barrelHit-' + collSphereName, self.handleEnterBarrel)
            nodeToHide = '**/gagMoneyTen'
            if barrelIndex % 2:
                nodeToHide = '**/gagMoneyFive'
            iconToHide = barrel.find(nodeToHide)
            if not iconToHide.isEmpty():
                iconToHide.hide()
            self.barrels.append(barrel)

        self.gameBoard = loader.loadModel(
            'phase_4/models/minigames/cogthief_game')
        self.gameBoard.find('**/floor_TT').hide()
        self.gameBoard.find('**/floor_DD').hide()
        self.gameBoard.find('**/floor_DG').hide()
        self.gameBoard.find('**/floor_MM').hide()
        self.gameBoard.find('**/floor_BR').hide()
        self.gameBoard.find('**/floor_DL').hide()
        zone = self.getSafezoneId()
        if zone == ToontownGlobals.ToontownCentral:
            self.gameBoard.find('**/floor_TT').show()
        elif zone == ToontownGlobals.DonaldsDock:
            self.gameBoard.find('**/floor_DD').show()
        elif zone == ToontownGlobals.DaisyGardens:
            self.gameBoard.find('**/floor_DG').show()
        elif zone == ToontownGlobals.MinniesMelodyland:
            self.gameBoard.find('**/floor_MM').show()
        elif zone == ToontownGlobals.TheBrrrgh:
            self.gameBoard.find('**/floor_BR').show()
        elif zone == ToontownGlobals.DonaldsDreamland:
            self.gameBoard.find('**/floor_DL').show()
        else:
            self.gameBoard.find('**/floor_TT').show()
        self.gameBoard.setPosHpr(0, 0, 0, 0, 0, 0)
        self.gameBoard.setScale(1.0)
        self.toonSDs = {}
        avId = self.localAvId
        toonSD = CogThiefGameToonSD.CogThiefGameToonSD(avId, self)
        self.toonSDs[avId] = toonSD
        toonSD.load()
        self.loadCogs()
        self.toonHitTracks = {}
        self.toonPieTracks = {}
        self.sndOof = base.loader.loadSfx(
            'phase_4/audio/sfx/MG_cannon_hit_dirt.ogg')
        self.sndRewardTick = base.loader.loadSfx(
            'phase_3.5/audio/sfx/tick_counter.ogg')
        self.sndPerfect = base.loader.loadSfx(
            'phase_4/audio/sfx/ring_perfect.ogg')
        self.timer = ToontownTimer.ToontownTimer()
        self.timer.posInTopRightCorner()
        self.timer.hide()
        purchaseModels = loader.loadModel('phase_4/models/gui/purchase_gui')
        self.jarImage = purchaseModels.find('**/Jar')
        self.jarImage.reparentTo(hidden)
        self.rewardPanel = DirectLabel(parent=hidden,
                                       relief=None,
                                       pos=(-0.173, -1.2, -0.55),
                                       scale=0.65,
                                       text='',
                                       text_scale=0.2,
                                       text_fg=(0.95, 0.95, 0, 1),
                                       text_pos=(0, -0.13),
                                       text_font=ToontownGlobals.getSignFont(),
                                       image=self.jarImage)
        self.rewardPanelTitle = DirectLabel(parent=self.rewardPanel,
                                            relief=None,
                                            pos=(0, 0, 0.06),
                                            scale=0.08,
                                            text=TTLocalizer.CannonGameReward,
                                            text_fg=(0.95, 0.95, 0, 1),
                                            text_shadow=(0, 0, 0, 1))
        return
Beispiel #9
0
    def __init__(self):
        ShowBase.__init__(self)
        self.disableMouse()  
        camera.setPosHpr(0, -12, 8, 0, -35, 0)
        """
        self.environ = self.loader.loadModel("models/environment")
        # Reparent the model to render.
        self.environ.reparentTo(self.render)
        # Apply scale and position transforms on the model.
        self.environ.setScale(0.25, 0.25, 0.25)
        self.environ.setPos(-8, 42, 0)
        self.torus = loader.loadModel("torus.egg")
        self.torus.reparentTo(self.render)
        self.torus.setPos(circPos(0,1))
        self.torus.setColor(BLACK)
        self.torus.setScale(0.5,0.5,0.5)
        """
        self.setupLights()
        self.ended = False
        self.currentB = False
        self.firstTurn = True
        # Since we are using collision detection to do picking, we set it up like
        # any other collision detection system with a traverser and a handler
        self.picker = CollisionTraverser()  # Make a traverser
        self.pq = CollisionHandlerQueue()  # Make a handler
        # Make a collision node for our picker ray
        self.pickerNode = CollisionNode('mouseRay')
        # Attach that node to the camera since the ray will need to be positioned
        # relative to it
        self.pickerNP = camera.attachNewNode(self.pickerNode)
        # Everything to be picked will use bit 1. This way if we were doing other
        # collision we could seperate it
        self.pickerNode.setFromCollideMask(BitMask32.bit(1))
        self.pickerRay = CollisionRay()  # Make our ray
        # Add it to the collision node
        self.pickerNode.addSolid(self.pickerRay)
        # Register the ray as something that can cause collisions
        self.picker.addCollider(self.pickerNP, self.pq)
        self.picker.showCollisions(render)
        self.whiteTurn = True
        # Now we create the chess board and its pieces

        # We will attach all of the squares to their own root. This way we can do the
        # collision pass just on the sqaures and save the time of checking the rest
        # of the scene
        self.batonsRoot = render.attachNewNode("batonsRoot")
        self.batons = [None for i in range(9)]
        self.torus = [[None for j in range(3)] for i in range(9)]
        self.org = [[[None for j in range(3)] for i in range(3)] for i in range(3)]
        for i in range(9):
            # Load, parent, color, and position the model (a single square
            # polygon)
            self.batons[i] = loader.loadModel("bois.egg")
            self.batons[i].reparentTo(self.batonsRoot)
            self.batons[i].setPos(circPos(i,0))
            self.batons[i].setColor(0.75,0.5,0)
            self.batons[i].setScale(0.75,0.75,0.5)
            # Set the model itself to be collideable with the ray. If this model was
            # any more complex than a single polygon, you should set up a collision
            # sphere around it instead. But for single polygons this works
            # fine.
            self.batons[i].find("**/Cylinder").node().setIntoCollideMask(
                BitMask32.bit(1))
            # Set a tag on the square's node so we can look up what square this is
            # later during the collision pass
            self.batons[i].find("**/Cylinder").setTag('baton', str(i))

            # We will use this variable as a pointer to whatever piece is currently
            # in this square
        self.mouseTask = taskMgr.add(self.mouseTask, 'mouseTask')
        self.accept("mouse1", self.click)
        self.accept("w", self.bestPossibleMove)
Beispiel #10
0
    def __init__(self, mission):
        # Initialize the ShowBase class from which we inherit, which will
        # create a window and set up everything we need for rendering into it.
        self.mission = mission
        self.player = mission.player
        self.menu = mission.menu
        self.state = 0
        self.frame = DirectFrame(frameColor=(0.1, 0.1, 0.1, 0.5),
                                 frameSize=(-2, 2, -2, 2),
                                 pos=(0, 0, 0))
        self.frame.hide()
        self.dr2 = base.win.makeDisplayRegion()
        #self.dr2.setActive(False)
        # self.frame.attachNewNode(self.dr2.node())
        #self.dr2.setActive(False)
        self.dr2.setClearColorActive(True)
        self.dr2.setClearColor(VBase4(0.1, 0.1, 0.1, 1))
        self.dr2.setClearDepthActive(True)
        # base.win.setClearColor(VBase4(0.1,0.1,0.1,1))
        # base.win.setClearDepthActive()
        # base.win.setClearDepth(1)
        self.render2 = NodePath("render2")
        self.camNode = Camera("cam2")
        self.cam2 = self.render2.attachNewNode(self.camNode)
        self.dr2.setCamera(self.cam2)
        self.cam2.setPosHpr(0, -18, 10, 0, -30, 0)

        # Escape quits
        base.disableMouse()  # Disble mouse camera control
        # camera.setPosHpr(0, -12, 8, 0, -35, 0)  # Set the camera
        self.setupLights()  # Setup default lighting

        # Since we are using collision detection to do picking, we set it up like
        # any other collision detection system with a traverser and a handler
        self.picker = CollisionTraverser()  # Make a traverser
        self.pq = CollisionHandlerQueue()  # Make a handler
        # Make a collision node for our picker ray
        self.pickerNode = CollisionNode('mouseRay')
        # Attach that node to the camera since the ray will need to be positioned
        # relative to it
        # self.pickerNP = camera.attachNewNode(self.pickerNode)
        self.pickerNP = self.cam2.attachNewNode(self.pickerNode)
        # Everything to be picked will use bit 1. This way if we were doing other
        # collision we could separate it
        self.pickerNode.setFromCollideMask(BitMask32.bit(1))
        self.pickerRay = CollisionRay()  # Make our ray
        # Add it to the collision node
        self.pickerNode.addSolid(self.pickerRay)
        # Register the ray as something that can cause collisions
        self.picker.addCollider(self.pickerNP, self.pq)
        # self.picker.showCollisions(render)

        # Now we create the chess board and its pieces

        # We will attach all of the squares to their own root. This way we can do the
        # collision pass just on the squares and save the time of checking the rest
        # of the scene
        self.squareRoot = self.render2.attachNewNode("squareRoot")

        # For each square
        self.squares = [None for i in range(64)]
        self.pieces = [None for i in range(64)]
        for i in range(64):
            # Load, parent, color, and position the model (a single square
            # polygon)
            # self.squares[i] = loader.loadModel("../res/models/Scene3/Scene3Cat/hall/square")
            self.squares[i] = loader.loadModel(
                "res/models/Scene3/Scene3Cat/hall/square")
            self.squares[i].reparentTo(self.squareRoot)
            self.squares[i].setPos(SquarePos(i))
            self.squares[i].setColor(SquareColor(i))
            # Set the model itself to be collideable with the ray. If this model was
            # any more complex than a single polygon, you should set up a collision
            # sphere around it instead. But for single polygons this works
            # fine.
            self.squares[i].find("**/polygon").node().setIntoCollideMask(
                BitMask32.bit(1))
            # Set a tag on the square's node so we can look up what square this is
            # later during the collision pass
            self.squares[i].find("**/polygon").node().setTag('square', str(i))

            # We will use this variable as a pointer to whatever piece is currently
            # in this square

        # The order of pieces on a chessboard from white's perspective. This list
        # contains the constructor functions for the piece classes defined
        # below
        pieceOrder = (Rook, Knight, Bishop, Queen, King, Bishop, Knight, Rook)

        self.pieces[40] = Queen(self, 40, WHITE)
        self.pieces[51] = Bishop(self, 51, PIECEBLACK)
        self.pieces[33] = Knight(self, 33, PIECEBLACK)
        self.pieces[9] = Rook(self, 9, PIECEBLACK)
        self.pieces[20] = Rook(self, 20, PIECEBLACK)
        # This will represent the index of the currently highlited square
        self.hiSq = False
        # This wil represent the index of the square where currently dragged piece
        # was grabbed from
        self.dragging = False

        # self.eight = OnscreenText(text="8", style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1),
        #                           pos=(-0.9, 0.35), scale=.07)
        # self.seven = OnscreenText(text="7", style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1),
        #                           pos=(-0.93, 0.27), scale=.07)
        # self.six = OnscreenText(text="6", style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1),
        #                         pos=(-0.97, 0.18), scale=.07)
        # self.five = OnscreenText(text="5", style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1),
        #                          pos=(-1.02, 0.1), scale=.07)
        # self.four = OnscreenText(text="4", style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1),
        #                          pos=(-1.06, 0.02), scale=.07)
        # self.three = OnscreenText(text="3", style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1),
        #                           pos=(-1.12, -0.1), scale=.07)
        # self.two = OnscreenText(text="2", style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1),
        #                         pos=(-1.16, -0.18), scale=.07)
        # self.one = OnscreenText(text="1", style=1, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1),
        #                         pos=(-1.23, -0.32), scale=.07)
        x = -0.91
        y = 0.33
        dx = 0.04
        dy = 0.09
        self.eight = OnscreenText(text="8",
                                  style=1,
                                  fg=(1, 1, 1, 1),
                                  shadow=(0, 0, 0, 1),
                                  pos=(x, y),
                                  scale=.07)
        x -= dx
        y -= dy
        self.seven = OnscreenText(text="7",
                                  style=1,
                                  fg=(1, 1, 1, 1),
                                  shadow=(0, 0, 0, 1),
                                  pos=(x, y),
                                  scale=.07)
        x -= dx
        y -= dy
        self.six = OnscreenText(text="6",
                                style=1,
                                fg=(1, 1, 1, 1),
                                shadow=(0, 0, 0, 1),
                                pos=(x, y),
                                scale=.07)
        x -= dx
        y -= dy
        self.five = OnscreenText(text="5",
                                 style=1,
                                 fg=(1, 1, 1, 1),
                                 shadow=(0, 0, 0, 1),
                                 pos=(x, y),
                                 scale=.07)
        x -= dx
        y -= dy
        self.four = OnscreenText(text="4",
                                 style=1,
                                 fg=(1, 1, 1, 1),
                                 shadow=(0, 0, 0, 1),
                                 pos=(x, y),
                                 scale=.07)
        x -= dx
        y -= dy
        self.three = OnscreenText(text="3",
                                  style=1,
                                  fg=(1, 1, 1, 1),
                                  shadow=(0, 0, 0, 1),
                                  pos=(x, y),
                                  scale=.07)
        x -= dx
        y -= dy
        self.two = OnscreenText(text="2",
                                style=1,
                                fg=(1, 1, 1, 1),
                                shadow=(0, 0, 0, 1),
                                pos=(x, y),
                                scale=.07)
        x -= dx
        y -= dy
        self.one = OnscreenText(text="1",
                                style=1,
                                fg=(1, 1, 1, 1),
                                shadow=(0, 0, 0, 1),
                                pos=(x, y),
                                scale=.07)

        self.A = OnscreenText(text="A",
                              style=1,
                              fg=(1, 1, 1, 1),
                              shadow=(0, 0, 0, 1),
                              pos=(-1.05, -0.5),
                              scale=.07)
        self.B = OnscreenText(text="B",
                              style=1,
                              fg=(1, 1, 1, 1),
                              shadow=(0, 0, 0, 1),
                              pos=(-0.75, -0.5),
                              scale=.07)
        self.C = OnscreenText(text="C",
                              style=1,
                              fg=(1, 1, 1, 1),
                              shadow=(0, 0, 0, 1),
                              pos=(-0.45, -0.5),
                              scale=.07)
        self.D = OnscreenText(text="D",
                              style=1,
                              fg=(1, 1, 1, 1),
                              shadow=(0, 0, 0, 1),
                              pos=(-0.15, -0.5),
                              scale=.07)
        self.E = OnscreenText(text="E",
                              style=1,
                              fg=(1, 1, 1, 1),
                              shadow=(0, 0, 0, 1),
                              pos=(0.15, -0.5),
                              scale=.07)
        self.F = OnscreenText(text="F",
                              style=1,
                              fg=(1, 1, 1, 1),
                              shadow=(0, 0, 0, 1),
                              pos=(0.45, -0.5),
                              scale=.07)
        self.G = OnscreenText(text="G",
                              style=1,
                              fg=(1, 1, 1, 1),
                              shadow=(0, 0, 0, 1),
                              pos=(0.75, -0.5),
                              scale=.07)
        self.H = OnscreenText(text="H",
                              style=1,
                              fg=(1, 1, 1, 1),
                              shadow=(0, 0, 0, 1),
                              pos=(1.05, -0.5),
                              scale=.07)
        self.A.reparentTo(self.frame)
        self.B.reparentTo(self.frame)
        self.C.reparentTo(self.frame)
        self.D.reparentTo(self.frame)
        self.E.reparentTo(self.frame)
        self.F.reparentTo(self.frame)
        self.G.reparentTo(self.frame)
        self.H.reparentTo(self.frame)
        self.one.reparentTo(self.frame)
        self.two.reparentTo(self.frame)
        self.three.reparentTo(self.frame)
        self.four.reparentTo(self.frame)
        self.five.reparentTo(self.frame)
        self.six.reparentTo(self.frame)
        self.seven.reparentTo(self.frame)
        self.eight.reparentTo(self.frame)
        self.hide()
        # Start the task that handles the picking
        self.mouseTask = taskMgr.add(self.mouseTask, 'mouseTask')
        base.accept("mouse1", self.grabPiece)  # left-click grabs a piece
        base.accept("mouse1-up", self.releasePiece)  # releasing places it
        base.accept("escape", self.hide)
Beispiel #11
0
    def __init__(self):

        self.keyMap = {
            "left": 0,
            "right": 0,
            "forward": 0,
            "cam-left": 0,
            "cam-right": 0
        }

        self.separators = []
        self.crash = []
        self.statua = []
        self.lamp = []
        self.terrain = []
        self.bombero = []
        self.energy = []
        self.balloons = []

        self.buildings = [
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("modelos/building/building"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa7/dojo"),
            loader.loadModel("edificios/casas/casa12/funhouse"),
            loader.loadModel("edificios/casas/casa13/ringtoss")
        ]

        self.angleDegrees = 0
        self.isMoving = False
        self.isCollision = False
        self.mayor = 190.0
        self.bebidas = 0
        self.idStop = 0
        self.textIni = 0
        self.Perdio = 0
        self.sonidito = 0
        self.activate = 0
        base.disableMouse()
        base.camera.setZ(base.camera,
                         3 * globalClock.getDt())  # Initialization CameraZ
        base.camera.setY(base.camera,
                         -10 * globalClock.getDt())  # Initialization CameraY
        """self.Lvl1 = base.loader.loadSfx("tales.mp3")
        self.Lvl1.setLoop(True)
        self.Lvl1.setVolume(0.0)
        self.Lvl1.play()"""

        self.Lvl2 = base.loader.loadSfx("vel3.wav")
        self.Lvl2.setLoop(True)
        self.Lvl2.setVolume(0.6)

        self.Lvl4 = base.loader.loadSfx("instru.wav")
        self.Lvl4.setLoop(False)
        self.Lvl4.setVolume(1.0)

        self.punch = base.loader.loadSfx("punch.mp3")
        self.punch.setVolume(1.0)
        """  ---------------------------- Load the World ------------------------ """

        # this section of rendering will be extract in one class extern the wich
        # instace a segment of world acord to the position of the character.

        cont = 0
        while (cont < 79):
            self.terrain.append(loader.loadModel("modelos/pista/calle"))
            self.terrain[cont].reparentTo(render)
            self.terrain[cont].setScale(25)
            self.terrain[cont].setPos(-85, 130 + (308 * cont), -69)
            cont = cont + 1
        """ --------------------------------------------------------------------- """
        """  ---------------------------- Load Buildings ------------------------ """

        # Load all buildings in the Game for segments the last two of each part
        # Are diferents. PD. each part have 3 segments and each segment have
        # 5 buildings.

        cont = 0
        conta = -1
        while (cont < 200):
            self.buildings[cont].reparentTo(render)
            conta = conta + 1

            if (conta == 4):
                self.buildings[cont].setScale(3.5)
                self.buildings[cont].setPos(-68,
                                            380 + ((308 * ((cont) / 5) * 2)),
                                            -8)
                self.buildings[cont].setH(90.0)
                conta = -1
            if (conta == 3):
                self.buildings[cont].setScale(.8)
                self.buildings[cont].setPos(32,
                                            338 + ((308 * ((cont) / 5) * 2)),
                                            -8)
                self.buildings[cont].setH(180.0)
            if (conta == 2):
                self.buildings[cont].setScale(.2)
                self.buildings[cont].setPos(80,
                                            295 + ((308 * ((cont) / 5) * 2)),
                                            -8)
                self.buildings[cont].setH(90.0)
            if (conta == 1):
                self.buildings[cont].setScale(.2)
                self.buildings[cont].setPos(-85,
                                            295 + ((308 * ((cont) / 5) * 2)),
                                            -8)
                self.buildings[cont].setH(270.0)
            if (conta == 0):
                self.buildings[cont].setScale(.5)
                self.buildings[cont].setPos(-34,
                                            260 + ((308 * ((cont) / 5) * 2)),
                                            -8)
            cont = cont + 1

        cont = 1
        while (cont < 14):
            self.buildings[(cont * 15) - 2].setScale(5.2)
            self.buildings[(cont * 15) - 2].setPos(
                96, 375 + (cont * (308 * 4)) + 13, -8)
            self.buildings[(cont * 15) - 2].setH(180.0)
            self.buildings[(15 * cont) - 1].setScale(3.2)
            self.buildings[(15 * cont) - 1].setPos(
                -85, 380 + (cont * (308 * 4)) + 8, -8)
            self.buildings[(15 * cont) - 1].setH(180.0)
            cont = cont + 1
        """ --------------------------------------------------------------------- """
        """  ---------------------------- Load Separators ----------------------- """

        # Charge the Models of the separators between two segments of terrain only
        # only charge 8 and move the first 4 in the time.

        cont = 0
        ident = -1
        while (cont < 16):
            self.separators.append(
                loader.loadModel("modelos/separador/roadblock"))
            self.separators[cont].reparentTo(render)
            self.separators[cont].setScale(1.0)
            self.separators[cont].setH(90.0)
            posi = (308 * int(cont / 8))
            ident = ident + 1
            if (ident == 0): self.separators[cont].setPos(37, posi + 137, -8)
            if (ident == 1): self.separators[cont].setPos(37, posi + 152, -8)
            if (ident == 2): self.separators[cont].setPos(37, posi + 167, -8)
            if (ident == 3): self.separators[cont].setPos(37, posi + 182, -8)
            if (ident == 4): self.separators[cont].setPos(-38, posi + 137, -8)
            if (ident == 5): self.separators[cont].setPos(-38, posi + 152, -8)
            if (ident == 6): self.separators[cont].setPos(-38, posi + 167, -8)
            if (ident == 7):
                self.separators[cont].setPos(-38, posi + 182, -8)
                ident = -1
            cont = cont + 1
        """ --------------------------------------------------------------------- """
        """  ---------------------------- Load Objects ------------------------- """

        # Charge the estatuas , lamparas , hidrantes, etc in the world.

        cont = 0
        while (cont < 50):
            self.statua.append(loader.loadModel("modelos/estatua/estatua"))
            self.lamp.append(loader.loadModel("modelos/lampara/lampara"))
            self.statua[cont].reparentTo(render)
            self.lamp[cont].reparentTo(render)
            self.statua[cont].setScale(4.0)
            self.lamp[cont].setScale(4.0)
            self.statua[cont].setPos(-38, 95 + (308 * (cont * 2)), -8)
            self.lamp[cont].setPos(-38, 115 + (308 * (cont * 2)), -8)
            self.statua[cont].setH(270.0)
            self.lamp[cont].setH(270.0)
            cont = cont + 1
        """ --------------------------------------------------------------------- """
        """  ---------------------------- Load Energy --------------------------- """

        # Charge models of the energy bottle.

        cont = 0
        while (cont < 200):
            self.energy.append(loader.loadModel("modelos/energia/energia"))
            cont = cont + 1
        """ --------------------------------------------------------------------- """
        """  -------------------- Load The Principal Actor ---------------------- """

        # It's the Actor In the Game.

        self.jeep = Actor("modelos/jeep/jeep",
                          {"walk": "modelos/jeep/jeep-start"})
        self.jeep.setScale(0.7)
        self.jeep.setPos(0, 30, -6.8)
        self.jeep.reparentTo(render)
        self.jeep.setH(180.0)
        """ --------------------------------------------------------------------- """
        """  -------------------- Load The Secondary Actor ---------------------- """

        # This actor is the narrator of the game.
        """self.broman = Actor( "modelos/tutman/bullyactormodel",
                             {"ani": "modelos/tutman/bullyactoranimpieceofcrap",
                              "ani2": "modelos/tutman/bullyactoranimnoneofthese",
                              "ani3": "modelos/tutman/bullyactoranimfoodstamps",
                              "ani4": "modelos/tutman/bullyactoranimbeatme"})
        self.broman.setScale(15.0)
        self.broman.setPos(0,100,1.0)
        self.broman.reparentTo(render)
        # Loop its animation.
        self.broman.loop("ani2")
        self.broman.setH( 90.0 )"""
        """ --------------------------------------------------------------------- """
        """  -------------------- Load The Secondary Actor ---------------------- """

        # These are children who run for the sidewalk

        cont = 1
        posIni = -3400
        while (cont < 40):
            self.bombero.append(
                Actor(
                    "modelos/bombero/bombero", {
                        "ani": "modelos/bombero/bombero1",
                        "ani2": "modelos/bombero/bombero2",
                        "ani3": "modelos/bombero/bombero3"
                    }))
            self.bombero[cont - 1].reparentTo(render)
            self.bombero[cont - 1].setScale(1.0)
            if ((cont % 2) == 0):
                self.bombero[cont - 1].setPos(-26, posIni, -7.0)
            else:
                self.bombero[cont - 1].setPos(24, posIni, -7.0)
            self.bombero[cont - 1].loop("ani2")
            self.bombero[cont - 1].setH(180.0)
            posIni = posIni + 600
            cont = cont + 1
        """ --------------------------------------------------------------------- """
        """  -------------------- Load The Secondary Actor ---------------------- """

        # These are children who have balloons.

        cont = 0
        while (cont < 50):
            self.balloons.append(
                Actor("modelos/nino/nino", {"ani": "modelos/nino/nino2"}))
            self.balloons[cont].reparentTo(render)
            self.balloons[cont].setScale(.05)
            self.balloons[cont].setPos(30, 100 + (308 * (cont * 2)), 3.0)
            self.balloons[cont].loop("ani")
            self.balloons[cont].setH(270.0)
            cont = cont + 1
        """ --------------------------------------------------------------------- """
        """  ------------------ Load posicions of the bottles ------------------- """

        cont = 0
        while (cont < 80):
            x = random.randint(-26, 26)
            y = random.randint(0, 24090)
            self.energy[cont].reparentTo(render)
            self.energy[cont].setScale(.5)
            self.energy[cont].setPos(x, y, 0)
            self.energy[cont].setH(270.0)
            cont = cont + 1
        """ --------------------------------------------------------------------- """
        """  ---------------------- Prepara las Colisiones ---------------------- """

        self.cs = CollisionSphere(0, 0, 0, 15)
        cont = 0
        while (cont < 80):
            self.crash.append(self.energy[cont].attachNewNode(
                CollisionNode(str(cont))))
            self.crash[cont].node().addSolid(self.cs)
            #self.crash[cont].show()
            cont = cont + 1

        self.css = CollisionSphere(0, 0, 0, 12)
        self.cnodePath = self.jeep.attachNewNode(CollisionNode('cnode'))
        self.cnodePath.node().addSolid(self.css)

        #self.cnodePath.show()
        #self.cnodePath.show()

        self.traverser = CollisionTraverser()
        self.queue = CollisionHandlerQueue()
        """ --------------------------------------------------------------------- """
        """  ----------------- when do you pressed one key ---------------------- """

        self.accept("escape", sys.exit)
        self.accept("arrow_left", self.setKey, ["left", 1])
        self.accept("arrow_right", self.setKey, ["right", 1])
        self.accept("arrow_up", self.setKey, ["forward", 1])
        self.accept("a", self.setKey, ["cam-left", 1])
        self.accept("s", self.setKey, ["cam-right", 1])
        self.accept("r", self.setKey, ["look-back", 1])
        self.accept("arrow_left-up", self.setKey, ["left", 0])
        self.accept("arrow_right-up", self.setKey, ["right", 0])
        self.accept("arrow_up-up", self.setKey, ["forward", 0])
        self.accept("a-up", self.setKey, ["cam-left", 0])
        self.accept("s-up", self.setKey, ["cam-right", 0])
        """ --------------------------------------------------------------------- """

        taskMgr.add(self.move, "move")
        taskMgr.add(self.follow, "follow")
        taskMgr.add(self.stopSignal, "stopSignal")
        taskMgr.add(self.runBombero, "runBombero")
        taskMgr.add(self.collision, "collision")
    def __init__(self):
        
        ## Add the default values to the dictionary.
        self.keyMap = {"left":0, "right":0, "forward":0, \
                       "boost":0, "strafeL":0, "strafeR":0, \
                       "cam-left":0, "cam-right":0}
        
        base.win.setClearColor(Vec4(0,0,0,1))

        # Post the instructions
        self.title = addTitle("Panda3D Tutorial: Roaming Ralph (Walking on Uneven Terrain)")
        self.inst1 = addInstructions(0.95, "[ESC]: Quit")
        self.inst2 = addInstructions(0.90, "[Left Arrow]: Rotate Ralph Left")
        self.inst3 = addInstructions(0.85, "[Right Arrow]: Rotate Ralph Right")
        self.inst4 = addInstructions(0.80, "[Up Arrow]: Run Ralph Forward")
        self.inst6 = addInstructions(0.70, "[A]: Rotate Camera Left")
        self.inst7 = addInstructions(0.65, "[D]: Rotate Camera Right")
        self.inst8 = addInstructions(0.60, "[B]: Ralph Boost")
        self.inst9 = addInstructions(0.55, "[V]: Strafe Left")
        self.inst10 = addInstructions(0.50, "[N]: Strafe Right")
        
        # Set up the environment
        #
        # This environment model contains collision meshes.  If you look
        # in the egg file, you will see the following:
        #
        #    <Collide> { Polyset keep descend }
        #
        # This tag causes the following mesh to be converted to a collision
        # mesh -- a mesh which is optimized for collision, not rendering.
        # It also keeps the original mesh, so there are now two copies ---
        # one optimized for rendering, one for collisions.  

        self.environ = loader.loadModel("models/world")      
        self.environ.reparentTo(render)
        self.environ.setPos(0,0,0)
        
        ## Stops the sound as soon as the world renders 
        ## Note:Sound won't play very long becasue the game takes seconds to compile and load
        ## Remove loading screen after world is rendered and ready to go.
        
        loadingText.cleanup()
        mySound.stop()
        
        # Create the main character, Ralph

        ralphStartPos = self.environ.find("**/start_point").getPos()
        self.ralph = Actor("models/ralph",
                                 {"run":"models/ralph-run",
                                  "walk":"models/ralph-walk"})
        self.ralph.reparentTo(render)
        self.ralph.setScale(.2)
        self.ralph.setPos(ralphStartPos)

        # Create a floater object.  We use the "floater" as a temporary
        # variable in a variety of calculations.
        
        self.floater = NodePath(PandaNode("floater"))
        self.floater.reparentTo(render)

        # Accept the control keys for movement and rotation

        self.accept("escape", sys.exit)
        self.accept("arrow_left", self.setKey, ["left",1])
        self.accept("arrow_right", self.setKey, ["right",1])
        self.accept("arrow_up", self.setKey, ["forward",1])
        self.accept("a", self.setKey, ["cam-left",1])
        self.accept("d", self.setKey, ["cam-right",1])
        self.accept("b", self.setKey, ["boost",1])
        self.accept("v", self.setKey, ["strafeL",1])
        self.accept("n", self.setKey, ["strafeR",1])
        
        ## -up to signify what happens when you let go of the key
        self.accept("b-up", self.setKey, ["boost",0])
        self.accept("v-up", self.setKey, ["strafeL",0])
        self.accept("n-up", self.setKey, ["strafeR",0])
        self.accept("arrow_left-up", self.setKey, ["left",0])
        self.accept("arrow_right-up", self.setKey, ["right",0])
        self.accept("arrow_up-up", self.setKey, ["forward",0])
        self.accept("a-up", self.setKey, ["cam-left",0])
        self.accept("d-up", self.setKey, ["cam-right",0])

        taskMgr.add(self.move,"moveTask")

        # Game state variables
        self.isMoving = False

        # Set up the camera
        
        base.disableMouse()
        base.camera.setPos(self.ralph.getX(),self.ralph.getY()+10,2)
        
        # We will detect the height of the terrain by creating a collision
        # ray and casting it downward toward the terrain.  One ray will
        # start above ralph's head, and the other will start above the camera.
        # A ray may hit the terrain, or it may hit a rock or a tree.  If it
        # hits the terrain, we can detect the height.  If it hits anything
        # else, we rule that the move is illegal.

        self.cTrav = CollisionTraverser()

        self.ralphGroundRay = CollisionRay()
        self.ralphGroundRay.setOrigin(0,0,1000)
        self.ralphGroundRay.setDirection(0,0,-1)
        self.ralphGroundCol = CollisionNode('ralphRay')
        self.ralphGroundCol.addSolid(self.ralphGroundRay)
        self.ralphGroundCol.setFromCollideMask(BitMask32.bit(0))
        self.ralphGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.ralphGroundColNp = self.ralph.attachNewNode(self.ralphGroundCol)
        self.ralphGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler)

        self.camGroundRay = CollisionRay()
        self.camGroundRay.setOrigin(0,0,1000)
        self.camGroundRay.setDirection(0,0,-1)
        self.camGroundCol = CollisionNode('camRay')
        self.camGroundCol.addSolid(self.camGroundRay)
        self.camGroundCol.setFromCollideMask(BitMask32.bit(0))
        self.camGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.camGroundColNp = base.camera.attachNewNode(self.camGroundCol)
        self.camGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)

        # Uncomment this line to see the collision rays
        #self.ralphGroundColNp.show()
        #self.camGroundColNp.show()
       
        # Uncomment this line to show a visual representation of the 
        # collisions occuring
        #self.cTrav.showCollisions(render)
        
        # Create some lighting
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor(Vec4(.3, .3, .3, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(Vec3(-5, -5, -5))
        directionalLight.setColor(Vec4(1, 1, 1, 1))
        directionalLight.setSpecularColor(Vec4(1, 1, 1, 1))
        render.setLight(render.attachNewNode(ambientLight))
        render.setLight(render.attachNewNode(directionalLight))
Beispiel #13
0
    def setup(self):
        self.worldNP = render.attachNewNode('World')
        self.distance_text = OnscreenText(
            text='Distance=0', pos=(0.75, 0.85), scale=0.08,
            mayChange=1)  #Directxxxxxx(distance='Distance=%d'%(0))
        self.speed_text = OnscreenText(
            text='Speed=0', pos=(0.75, 0.78), scale=0.08,
            mayChange=1)  #Directxxxxxx(distance='Distance=%d'%(0))
        self.time_text = OnscreenText(
            text='TotalTime=0', pos=(0.75, 0.71), scale=0.08,
            mayChange=1)  #Directxxxxxx(distance='Distance=%d'%(0))
        #self.time_maxsteer_text = OnscreenText(text='TotalTimeMaxSteer=0', pos = (0.85,0.70), scale = 0.05, mayChange=1)#Directxxxxxx(distance='Distance=%d'%(0))
        #self.nn_image = OnscreenImage(image='blank.png', pos= (0.85,0,0.15), scale=0.45) # http://dev-wiki.gestureworks.com/index.php/GestureWorksCore:Python_%26_Panda3D:_Getting_Started_II_(Hello_Multitouch)#8._Create_a_method_to_draw_touchpoint_data
        self.total_time = 0.
        self.time_max_steering = 0.
        # World
        self.debugNP = self.worldNP.attachNewNode(BulletDebugNode('Debug'))
        self.debugNP.show()

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

        #terrain = GeoMipTerrain("mySimpleTerrain")
        #terrain.setHeightfield("./models/heightfield_2.png")
        #terrain.getRoot().reparentTo(self.worldNP)#render)
        #terrain.generate()

        # Plane
        shape = BulletPlaneShape(Vec3(0, 0, 1), 0)

        np = self.worldNP.attachNewNode(BulletRigidBodyNode('Ground'))
        np.node().addShape(shape)
        np.setPos(0, 0, -1)
        np.setCollideMask(BitMask32.allOn())

        self.world.attachRigidBody(np.node())

        #np = self.worldNP.attachNewNode(BulletRigidBodyNode('Track'))
        #np.node().setMass(5000.0)
        #np.setPos(3, 0, 10)
        #np.setCollideMask(BitMask32.allOn())#(0x0f))
        #self.track = BulletVehicle(self.world, np.node())
        #self.track.setCoordinateSystem(ZUp)
        self.track_np = loader.loadModel(
            'models/race_track_2.egg'
        )  # https://discourse.panda3d.org/t/panda3d-and-bullet-physics/15724/10
        self.track_np.setPos(-72, -7, -3.5)
        self.track_np.setScale(10)
        self.track_np.reparentTo(render)

        self.track_np.setCollideMask(BitMask32.allOn())  #(0))#.allOn())
        self.world.attachRigidBody(np.node())
        self.track_np = np
        #self.track_np.show()

        # Chassis
        shape = BulletBoxShape(Vec3(0.6, 1.4, 0.5))
        ts = TransformState.makePos(Point3(0, 0, 0.5))

        np = self.worldNP.attachNewNode(BulletRigidBodyNode('Vehicle'))
        np.node().addShape(shape, ts)
        np.setPos(0, 0, 0.05)
        np.node().setMass(800.0)
        np.node().setDeactivationEnabled(False)

        self.world.attachRigidBody(np.node())

        #np.node().setCcdSweptSphereRadius(1.0)
        #np.node().setCcdMotionThreshold(1e-7)
        self.cTrav = CollisionTraverser()
        # Vehicle
        self.vehicle = BulletVehicle(self.world, np.node())
        self.vehicle.setCoordinateSystem(ZUp)
        self.yugoNP = loader.loadModel('models/yugo/yugo.egg')
        self.yugoNP.setCollideMask(BitMask32(0))  #.allOn())
        self.yugoNP.reparentTo(np)
        self.colHandler = CollisionHandlerQueue()

        # travel distance
        self.distance = 0.
        """self.sphere = CollisionSphere(0,0,0,2)
    self.sphere_col = CollisionNode('yugo')
    self.sphere_col.addSolid(self.sphere)
    self.sphere_col.setFromCollideMask(BitMask32.allOn())
    self.sphere_col_np = self.yugoNP.attachNewNode(self.sphere_col)
    self.cTrav.addCollider(self.sphere_col_np,self.colHandler)
    self.sphere_col_np.show()"""

        self.yugo_col = CollisionNode('yugo_box')
        self.yugo_col.addSolid(CollisionBox(Point3(0, 0, 0.7), 0.9, 1.6, 0.05))
        self.yugo_col.setFromCollideMask(BitMask32(1))
        self.box_col_np = self.yugoNP.attachNewNode(self.yugo_col)
        self.cTrav.addCollider(self.box_col_np, self.colHandler)
        self.box_col_np.show()

        self.ray_col_np = {}
        self.ray_col_vec_dict = {}
        self.n_rays = self.model.shape[0]
        for i, ray_dir in enumerate(
                numpy.linspace(-numpy.pi / 4, numpy.pi / 4,
                               self.n_rays)):  # populate collision rays
            #print(ray_dir)
            self.ray = CollisionRay()
            y_dir, x_dir = numpy.cos(ray_dir), numpy.sin(ray_dir)
            self.ray.setOrigin(1.3 * x_dir, 1.3 * y_dir, 0.5)
            self.ray.setDirection(x_dir, y_dir, 0)
            self.ray_col = CollisionNode('ray%d' % (i))
            self.ray_col.addSolid(self.ray)
            self.ray_col.setFromCollideMask(
                BitMask32.allOn())  #(0x0f))#CollideMask.bit(0)
            #self.ray_col.setIntoCollideMask(CollideMask.allOff())
            self.ray_col_np['ray%d' % (i)] = self.yugoNP.attachNewNode(
                self.ray_col)
            self.cTrav.addCollider(self.ray_col_np['ray%d' % (i)],
                                   self.colHandler)
            self.ray_col_np['ray%d' % (i)].show()
            self.ray_col_vec_dict['ray%d' % (i)] = []
        self.world.attachVehicle(self.vehicle)
        self.cTrav.showCollisions(render)

        # FIXME
        base.camera.reparentTo(self.yugoNP)

        # Right front wheel
        np = loader.loadModel('models/yugo/yugotireR.egg')
        np.reparentTo(self.worldNP)
        self.addWheel(Point3(0.70, 1.05, 0.3), True, np)

        # Left front wheel
        np = loader.loadModel('models/yugo/yugotireL.egg')
        np.reparentTo(self.worldNP)
        self.addWheel(Point3(-0.70, 1.05, 0.3), True, np)

        # Right rear wheel
        np = loader.loadModel('models/yugo/yugotireR.egg')
        np.reparentTo(self.worldNP)
        self.addWheel(Point3(0.70, -1.05, 0.3), False, np)

        # Left rear wheel
        np = loader.loadModel('models/yugo/yugotireL.egg')
        np.reparentTo(self.worldNP)
        self.addWheel(Point3(-0.70, -1.05, 0.3), False, np)

        # Steering info
        self.steering = 0.0  # degree
        self.steeringClamp = 38.0  #45.0      # degree
        self.steeringIncrement = 105.0  #120.0 # degree per second

        # add previous positions
        self.prevPos = []
        self.prevPos.append(self.yugoNP.getPos(render))

        self.model_offset = 0.5 if self.model.activation == 'relu' else 0.
        # Box
        """
    for i,j in [(0,8),(-3,5),(6,-5),(8,3),(-4,-4),(0,0)]:
        shape = BulletBoxShape(Vec3(0.5, 0.5, 0.5))
        # https://discourse.panda3d.org/t/wall-collision-help/23606
        np = self.worldNP.attachNewNode(BulletRigidBodyNode('Box'))
        np.node().setMass(1.0)
        np.node().addShape(shape)
        np.setPos(i, j, 2)
        np.setCollideMask(BitMask32.allOn())#(0x0f))

        self.world.attachRigidBody(np.node())
        self.boxNP = np
        #self.colHandler2 = CollisionHandlerQueue()


        visualNP = loader.loadModel('models/box.egg')
        visualNP.reparentTo(self.boxNP)
    #self.cTrav.addCollider(self.boxNP,self.colHandler)
    """
        """
    aNode = CollisionNode("TheRay")

    self.ray = CollisionRay()
    self.ray.setOrigin( self.yugoNP.getPos() )
    self.ray.setDirection( Vec3(0, 10, 0) )
    #self.ray.show()


    aNodePath = self.yugoNP.attachNewNode( CollisionNode("TheRay") )
    aNodePath.node().addSolid(self.ray)
    aNodePath.show()
    """
        #aNode.addSolid(self.ray)
        #self.ray = CollisionRay(0,0,0,10,0,0)
        #self.ray.reparentTo(self.yugoNP)
        #self.rayColl = CollisionNode('PlayerRay')
        #self.rayColl.addSolid(self.ray)

        #self.playerRayNode = self.yugoNP.attachNewNode( self.rayColl )
        #self.playerRayNode.show()

        #base.myTraverser.addCollider (self.playerRayNode, base.floor)
        #base.floor.addCollider( self.playerRayNode, self.yugoNP)
        """
Beispiel #14
0
    def __init__(self):
        # Set up the window, camera, etc.
        ShowBase.__init__(self)

        # Create and configure the VR environment

        self.ovr = P3DOpenVR()
        self.ovr.init(msaa=4)
        main_dir = ExecutionEnvironment.getEnvironmentVariable("MAIN_DIR")
        # Setup the application manifest, it will identify and configure the app
        # We force it in case it has changed.
        self.ovr.identify_application(os.path.join(main_dir,
                                                   "ralph.vrmanifest"),
                                      "p3dopenvr.demo.ralph",
                                      force=True)
        # Load the actions manifest, it must be the same as the manifest referenced in the application manifest
        self.ovr.load_action_manifest(
            os.path.join(main_dir, "manifest/actions.json"))
        # Use the '/actions/platformer' action set. This action set will be updated each frame
        self.ovr.add_action_set("/actions/platformer")
        # Get the handle of the action '/actions/platformer/in/Move'. This hande will be used to retrieve the data of the action.
        self.action_move = self.ovr.vr_input.getActionHandle(
            '/actions/platformer/in/Move')

        # Set the background color to black
        self.win.setClearColor((0, 0, 0, 1))

        # Post the instructions
        self.title = addTitle(
            "Panda3D Tutorial: Roaming Ralph (Walking on Uneven Terrain)")
        self.inst1 = addInstructions(0.06, "[ESC]: Quit")
        self.inst2 = addInstructions(0.12, "[Left trackpad]: Rotate Left")
        self.inst3 = addInstructions(0.18, "[Right trackpad]: Rotate Right")
        self.inst4 = addInstructions(0.24, "[Up trackpad]: Walk Forward")
        self.inst4 = addInstructions(0.30, "[Down trackpad]: Walk Backward")

        # Set up the environment
        #
        # This environment model contains collision meshes.  If you look
        # in the egg file, you will see the following:
        #
        #    <Collide> { Polyset keep descend }
        #
        # This tag causes the following mesh to be converted to a collision
        # mesh -- a mesh which is optimized for collision, not rendering.
        # It also keeps the original mesh, so there are now two copies ---
        # one optimized for rendering, one for collisions.

        self.environ = loader.loadModel("models/world")
        self.environ.reparentTo(render)

        # Create the main character, Ralph

        self.ralph = render.attachNewNode('ralph')
        self.ralphStartPos = self.environ.find("**/start_point").getPos()
        self.ovr.tracking_space.setPos(self.ralphStartPos)
        self.ralph.setPos(self.ovr.hmd_anchor.getPos(render))

        self.accept("escape", sys.exit)

        taskMgr.add(self.move, "moveTask")
        taskMgr.add(self.collision, "collisionTask")

        # Set up the camera
        self.disableMouse()

        # We will detect the height of the terrain by creating a collision
        # ray and casting it downward toward the terrain.  One ray will
        # start above ralph's head, and the other will start above the camera.
        # A ray may hit the terrain, or it may hit a rock or a tree.  If it
        # hits the terrain, we can detect the height.  If it hits anything
        # else, we rule that the move is illegal.
        self.cTrav = CollisionTraverser()

        self.ralphGroundRay = CollisionRay()
        self.ralphGroundRay.setOrigin(0, 0, 9)
        self.ralphGroundRay.setDirection(0, 0, -1)
        self.ralphGroundCol = CollisionNode('ralphRay')
        self.ralphGroundCol.addSolid(self.ralphGroundRay)
        self.ralphGroundCol.setFromCollideMask(CollideMask.bit(0))
        self.ralphGroundCol.setIntoCollideMask(CollideMask.allOff())
        self.ralphGroundColNp = self.ralph.attachNewNode(self.ralphGroundCol)
        self.ralphGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler)

        # Uncomment this line to see the collision rays
        #self.ralphGroundColNp.show()

        # Uncomment this line to show a visual representation of the
        # collisions occuring
        #self.cTrav.showCollisions(render)

        # Create some lighting
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor((.3, .3, .3, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection((-5, -5, -5))
        directionalLight.setColor((1, 1, 1, 1))
        directionalLight.setSpecularColor((1, 1, 1, 1))
        render.setLight(render.attachNewNode(ambientLight))
        render.setLight(render.attachNewNode(directionalLight))
Beispiel #15
0
        def makeTile(x, y, tile):
            # the idea here is to make
            # all the needed nodes,
            # then instance them to all the LODNode's children that show them

            x2 = x + size
            y2 = y + size

            tileCenter = Vec3(x + x2, y + y2, 0) / 2

            collisionNode = NodePath(
                CollisionNode("tile_collisionNode")) if collision else None

            for l in levels:
                l.initForTile(tile)
            for f, levs in factoryToLevels.iteritems():
                f.draw(dict((l.lod, l.drawResourcesFactory) for l in levs), x,
                       y, x2, y2, tileCenter, collisionNode)

            collisionUtil.colTree(collisionNode)
            lodNode = LODNode('tile_lod')
            lodNodePath = NodePath(lodNode)

            subTileNodeLists = []
            s = size / 2
            for f in subTileFactories:
                nodeList = [
                    f(x, y, tile),
                    f(x + s, y, tile),
                    f(x, y + s, tile),
                    f(x + s, y + s, tile)
                ]
                subTileNodeLists.append(nodeList)

            for l in levels:
                l.finishTile()

            lodNodePath.setPos(tileCenter)
            if collision: collisionNode.setPos(tileCenter)
            for lod, levs in LODAndLevelList:
                holder = NodePath("holder")
                # instance regular meshes
                for l in levs:
                    n = l.node
                    if n is not None:
                        n.instanceTo(holder)
                # instance subtile LOD nodes
                if lod in LODtoSubTileFactoryIndexs:
                    for i in LODtoSubTileFactoryIndexs[lod]:
                        for n in subTileNodeLists[i]:
                            instanceTo(holder)

                holder.reparentTo(lodNodePath)
                lodNode.addSwitch(lod.high, lod.low)

            # TODO, better center LOD Node using bounds
            # lodNode.setCenter()

            for l in levels:
                l.clean()

            if collision:
                tileHolder = NodePath("tile_holder")
                collisionNode.reparentTo(tileHolder)
                lodNodePath.reparentTo(tileHolder)
                return tileHolder
            else:
                return lodNodePath
Beispiel #16
0
    def __init__(self, base):
        self.base = base
        self.lastUpdate = 0.0

        # Parameters
        self.wheelBaseOffset = 3.4
        self.wheelSideOffset = 3.1
        self.speedMax = 50.0
        self.steerAngleMax = 20.0
        self.numSensors = 15
        self.sensorHeight = 2.0

        # Load car model
        self.car = self.base.loader.loadModel("models/carBody")
        self.carCollider = self.car.attachNewNode(CollisionNode("carCollider"))
        self.carCollider.node().addSolid(CollisionSphere(1.5, 0.0, 4.0, 4.0))
        self.carCollider.node().setFromCollideMask(BitMask32(0xF0))
        self.carCollider.setCollideMask(BitMask32(0))
        self.car.reparentTo(self.base.render)

        self.wheelFrontLeft = self.base.loader.loadModel("models/carWheel")
        self.wheelFrontLeft.reparentTo(self.car)
        self.wheelFrontLeft.setX(self.wheelBaseOffset)
        self.wheelFrontLeft.setY(self.wheelSideOffset)

        self.wheelFrontRight = self.base.loader.loadModel("models/carWheel")
        self.wheelFrontRight.reparentTo(self.car)
        self.wheelFrontRight.setX(self.wheelBaseOffset)
        self.wheelFrontRight.setY(-self.wheelSideOffset)

        self.wheelBackLeft = self.base.loader.loadModel("models/carWheel")
        self.wheelBackLeft.reparentTo(self.car)
        self.wheelBackLeft.setX(-self.wheelBaseOffset)
        self.wheelBackLeft.setY(self.wheelSideOffset)

        self.wheelBackRight = self.base.loader.loadModel("models/carWheel")
        self.wheelBackRight.reparentTo(self.car)
        self.wheelBackRight.setX(-self.wheelBaseOffset)
        self.wheelBackRight.setY(-self.wheelSideOffset)

        # Car properties
        self.steerAngle = 0.0
        self.speed = 0.0
        self.checkpointCount = 0
        self.wheelFront = Vec3(1.0, 0.0, 0.0) * self.wheelBaseOffset
        self.wheelBack = Vec3(-1.0, 0.0, 0.0) * self.wheelBaseOffset
        self.sensorCollisionHandlers = []
        self.sensorDistances = []
        self.initSensors()

        # Controls
        self.arrowUpDown = False
        self.arrowLeftDown = False
        self.arrowRightDown = False

        # Read neural network parameters
        self.theta1 = np.genfromtxt('data/theta1.csv', delimiter=',')
        self.theta2 = np.genfromtxt('data/theta2.csv', delimiter=',')
        self.theta3 = np.genfromtxt('data/theta3.csv', delimiter=',')

        # Run task that checks for sensor collisions
        self.base.taskMgr.add(self.checkCollisions, "CheckCollisionsTask", priority=2)

        # Run task that computes inputs
        self.base.taskMgr.add(self.getInput, "getInputTask", priority=3)

        # Run task that updates car
        self.base.taskMgr.add(self.updateCar, "UpdateCarTask", priority=4)
Beispiel #17
0
    def intersects(self, traverse_target=scene, ignore=(), debug=False):
        if isinstance(self.collider, MeshCollider):
            raise Exception(
                '''error: mesh colliders can't intersect other shapes, only primitive shapes can. Mesh colliders can "recieve" collisions though.'''
            )

        from ursina.hit_info import HitInfo

        if not self.collision or not self.collider:
            self.hit = HitInfo(hit=False)
            return self.hit

        from ursina import distance
        if not hasattr(self, '_picker'):
            from panda3d.core import CollisionTraverser, CollisionNode, CollisionHandlerQueue
            from panda3d.core import CollisionRay, CollisionSegment, CollisionBox

            self._picker = CollisionTraverser()  # Make a traverser
            self._pq = CollisionHandlerQueue()  # Make a handler
            self._pickerNode = CollisionNode('raycaster')
            self._pickerNode.set_into_collide_mask(0)
            self._pickerNP = self.attach_new_node(self._pickerNode)
            self._picker.addCollider(self._pickerNP, self._pq)
            self._pickerNP.show()
            self._pickerNode.addSolid(self._collider.shape)

        if debug:
            self._pickerNP.show()
        else:
            self._pickerNP.hide()

        self._picker.traverse(traverse_target)

        if self._pq.get_num_entries() == 0:
            self.hit = HitInfo(hit=False)
            return self.hit

        ignore += (self, )
        ignore += tuple([e for e in scene.entities if not e.collision])

        self._pq.sort_entries()
        self.entries = [  # filter out ignored entities
            e for e in self._pq.getEntries()
            if e.get_into_node_path().parent not in ignore
        ]

        if len(self.entries) == 0:
            self.hit = HitInfo(hit=False, distance=0)
            return self.hit

        collision = self.entries[0]
        nP = collision.get_into_node_path().parent
        point = collision.get_surface_point(nP)
        point = Vec3(*point)
        world_point = collision.get_surface_point(render)
        world_point = Vec3(*world_point)
        hit_dist = distance(self.world_position, world_point)

        self.hit = HitInfo(hit=True)
        self.hit.entity = next(e for e in scene.entities if e == nP)

        self.hit.point = point
        self.hit.world_point = world_point
        self.hit.distance = hit_dist

        normal = collision.get_surface_normal(
            collision.get_into_node_path().parent).normalized()
        self.hit.normal = Vec3(*normal)

        normal = collision.get_surface_normal(render).normalized()
        self.hit.world_normal = Vec3(*normal)

        self.hit.entities = []
        for collision in self.entries:
            self.hit.entities.append(
                next(e for e in scene.entities
                     if e == collision.get_into_node_path().parent))

        return self.hit
Beispiel #18
0
    def intersects(self, traverse_target=scene, ignore=(), debug=False):
        if not self.collision or not self.collider:
            return False

        from ursina.hit_info import HitInfo
        from ursina import distance
        if not hasattr(self, '_picker'):
            from panda3d.core import CollisionTraverser, CollisionNode, CollisionHandlerQueue
            from panda3d.core import CollisionRay, CollisionSegment, CollisionBox

            self._picker = CollisionTraverser()  # Make a traverser
            self._pq = CollisionHandlerQueue()  # Make a handler
            self._pickerNode = CollisionNode('raycaster')
            self._pickerNode.set_into_collide_mask(0)
            self._pickerNP = self.attach_new_node(self._pickerNode)
            self._picker.addCollider(self._pickerNP, self._pq)
            self._pickerNP.show()
            self._pickerNode.addSolid(self._collider.shape)

        if debug:
            self._pickerNP.show()
        else:
            self._pickerNP.hide()

        self._picker.traverse(traverse_target)

        if self._pq.get_num_entries() == 0:
            self.hit = HitInfo(hit=False)
            return self.hit

        ignore = (self, )
        ignore += tuple([e for e in scene.entities if not e.collision])

        self._pq.sort_entries()
        self.entries = [  # filter out ignored entities
            e for e in self._pq.getEntries()
            if e.get_into_node_path().parent not in ignore
        ]

        if len(self.entries) == 0:
            self.hit = HitInfo(hit=False)
            return self.hit

        collision = self.entries[0]
        nP = collision.get_into_node_path().parent
        point = collision.get_surface_point(nP)
        point = Vec3(*point)
        world_point = collision.get_surface_point(render)
        world_point = Vec3(*world_point)
        hit_dist = distance(self.world_position, world_point)

        if nP.name.endswith('.egg'):
            nP = nP.parent

        self.hit = HitInfo(hit=True)
        for e in scene.entities:
            if e == nP:
                self.hit.entity = e

        self.hit.point = point
        self.hit.world_point = world_point
        self.hit.distance = hit_dist

        normal = collision.get_surface_normal(
            collision.get_into_node_path().parent)
        self.hit.normal = Vec3(*normal)

        normal = collision.get_surface_normal(render)
        self.hit.world_normal = Vec3(*normal)
        return self.hit

        self.hit = HitInfo(hit=False)
        return self.hit
Beispiel #19
0
    def __init__(self, entity, mesh=None, center=(0, 0, 0)):
        super().__init__()
        center = Vec3(center)
        if mesh == None and entity.model:
            mesh = entity.model
            # print('''auto generating mesh collider from entity's mesh''')

        self.node_path = entity.attachNewNode(CollisionNode('CollisionNode'))
        self.node = self.node_path.node()
        self.collision_polygons = list()

        if isinstance(mesh, Mesh):
            if mesh.triangles:
                triangles = mesh.triangles
                if not isinstance(mesh.triangles[0], tuple):
                    triangles = [
                        triangles[i:i + 3]
                        for i in range(0, len(triangles), 3)
                    ]  # group into groups of three

                for tri in triangles:
                    if len(tri) == 3:
                        poly = CollisionPolygon(
                            Vec3(mesh.vertices[tri[2]]),
                            Vec3(mesh.vertices[tri[1]]),
                            Vec3(mesh.vertices[tri[0]]),
                        )
                        self.collision_polygons.append(poly)
                    elif len(tri) == 4:
                        poly = CollisionPolygon(Vec3(mesh.vertices[tri[2]]),
                                                Vec3(mesh.vertices[tri[1]]),
                                                Vec3(mesh.vertices[tri[0]]))
                        self.collision_polygons.append(poly)
                        poly = CollisionPolygon(Vec3(mesh.vertices[tri[0]]),
                                                Vec3(mesh.vertices[tri[3]]),
                                                Vec3(mesh.vertices[tri[2]]))
                        self.collision_polygons.append(poly)

            elif mesh.mode == 'triangle':
                for i in range(0, len(mesh.vertices), 3):
                    poly = CollisionPolygon(
                        Vec3(mesh.vertices[i + 2]),
                        Vec3(mesh.vertices[i + 1]),
                        Vec3(mesh.vertices[i]),
                    )
                    self.collision_polygons.append(poly)

            else:
                print('error: mesh collider does not support', mesh.mode,
                      'mode')
                return None

        elif isinstance(mesh, NodePath):
            from panda3d.core import GeomVertexReader
            verts = []
            geomNodeCollection = mesh.findAllMatches('**/+GeomNode')
            for nodePath in geomNodeCollection:
                geomNode = nodePath.node()
                for i in range(geomNode.getNumGeoms()):
                    geom = geomNode.getGeom(i)
                    vdata = geom.getVertexData()
                    for i in range(geom.getNumPrimitives()):
                        prim = geom.getPrimitive(i)
                        vertex_reader = GeomVertexReader(vdata, 'vertex')
                        prim = prim.decompose()

                        for p in range(prim.getNumPrimitives()):
                            s = prim.getPrimitiveStart(p)
                            e = prim.getPrimitiveEnd(p)
                            for i in range(s, e):
                                vi = prim.getVertex(i)
                                vertex_reader.setRow(vi)
                                verts.append(vertex_reader.getData3())

            for i in range(0, len(verts) - 3, 3):
                p = CollisionPolygon(Vec3(verts[i + 2]), Vec3(verts[i + 1]),
                                     Vec3(verts[i]))
                self.collision_polygons.append(p)

        for poly in self.collision_polygons:
            self.node.addSolid(poly)
        self.visible = False
Beispiel #20
0
class CollisionZoom:
    collision: CollisionNode = field(default_factory=lambda: CollisionNode("cam collisions"))
    traverser: CollisionTraverser = field(default_factory=lambda: CollisionTraverser("cam traverser"))
    queue: CollisionHandlerQueue = field(default_factory=lambda: CollisionHandlerQueue())
    body_width: float = 0.5
Beispiel #21
0
    def __init__(self):
        # Set up the window, camera, etc.
        ShowBase.__init__(self)

        # This is used to store which keys are currently pressed.
        self.keyMap = {
            "left": 0,
            "right": 0,
            "forward": 0,
            "backward": 0,
            "cam-left": 0,
            "cam-right": 0,
        }

        # Post the instructions
        self.title = addTitle(
            "Panda3D Tutorial: Roaming Ralph (Walking on Uneven Terrain)")
        self.inst1 = addInstructions(0.06, "[ESC]: Quit")
        self.inst2 = addInstructions(0.12, "[Left Arrow]: Rotate Ralph Left")
        self.inst3 = addInstructions(0.18, "[Right Arrow]: Rotate Ralph Right")
        self.inst4 = addInstructions(0.24, "[Up Arrow]: Run Ralph Forward")
        self.inst5 = addInstructions(0.30, "[Down Arrow]: Walk Ralph Backward")
        self.inst6 = addInstructions(0.36, "[A]: Rotate Camera Left")
        self.inst7 = addInstructions(0.42, "[S]: Rotate Camera Right")

        # Set up the environment
        #
        # This environment model contains collision meshes.  If you look
        # in the egg file, you will see the following:
        #
        #    <Collide> { Polyset keep descend }
        #
        # This tag causes the following mesh to be converted to a collision
        # mesh -- a mesh which is optimized for collision, not rendering.
        # It also keeps the original mesh, so there are now two copies ---
        # one optimized for rendering, one for collisions.

        self.environ = loader.loadModel("models/world")
        self.environ.reparentTo(render)

        # We do not have a skybox, so we will just use a sky blue background color
        self.setBackgroundColor(0.53, 0.80, 0.92, 1)

        # Create the main character, Ralph

        ralphStartPos = self.environ.find("**/start_point").getPos()
        self.ralph = Actor("models/ralph", {
            "run": "models/ralph-run",
            "walk": "models/ralph-walk"
        })
        self.ralph.reparentTo(render)
        self.ralph.setScale(.2)
        self.ralph.setPos(ralphStartPos + (0, 0, 1.5))

        # Create a floater object, which floats 2 units above ralph.  We
        # use this as a target for the camera to look at.

        self.floater = NodePath(PandaNode("floater"))
        self.floater.reparentTo(self.ralph)
        self.floater.setZ(2.0)

        # Accept the control keys for movement and rotation

        self.accept("escape", sys.exit)
        self.accept("arrow_left", self.setKey, ["left", True])
        self.accept("arrow_right", self.setKey, ["right", True])
        self.accept("arrow_up", self.setKey, ["forward", True])
        self.accept("arrow_down", self.setKey, ["backward", True])
        self.accept("a", self.setKey, ["cam-left", True])
        self.accept("s", self.setKey, ["cam-right", True])
        self.accept("arrow_left-up", self.setKey, ["left", False])
        self.accept("arrow_right-up", self.setKey, ["right", False])
        self.accept("arrow_up-up", self.setKey, ["forward", False])
        self.accept("arrow_down-up", self.setKey, ["backward", False])
        self.accept("a-up", self.setKey, ["cam-left", False])
        self.accept("s-up", self.setKey, ["cam-right", False])

        taskMgr.add(self.move, "moveTask")

        # Set up the camera
        self.disableMouse()
        self.camera.setPos(self.ralph.getX(), self.ralph.getY() + 10, 2)

        self.cTrav = CollisionTraverser()

        # Use a CollisionHandlerPusher to handle collisions between Ralph and
        # the environment. Ralph is added as a "from" object which will be
        # "pushed" out of the environment if he walks into obstacles.
        #
        # Ralph is composed of two spheres, one around the torso and one
        # around the head.  They are slightly oversized since we want Ralph to
        # keep some distance from obstacles.
        self.ralphCol = CollisionNode('ralph')
        self.ralphCol.addSolid(CollisionSphere(center=(0, 0, 2), radius=1.5))
        self.ralphCol.addSolid(
            CollisionSphere(center=(0, -0.25, 4), radius=1.5))
        self.ralphCol.setFromCollideMask(CollideMask.bit(0))
        self.ralphCol.setIntoCollideMask(CollideMask.allOff())
        self.ralphColNp = self.ralph.attachNewNode(self.ralphCol)
        self.ralphPusher = CollisionHandlerPusher()
        self.ralphPusher.horizontal = True

        # Note that we need to add ralph both to the pusher and to the
        # traverser; the pusher needs to know which node to push back when a
        # collision occurs!
        self.ralphPusher.addCollider(self.ralphColNp, self.ralph)
        self.cTrav.addCollider(self.ralphColNp, self.ralphPusher)

        # We will detect the height of the terrain by creating a collision
        # ray and casting it downward toward the terrain.  One ray will
        # start above ralph's head, and the other will start above the camera.
        # A ray may hit the terrain, or it may hit a rock or a tree.  If it
        # hits the terrain, we can detect the height.
        self.ralphGroundRay = CollisionRay()
        self.ralphGroundRay.setOrigin(0, 0, 9)
        self.ralphGroundRay.setDirection(0, 0, -1)
        self.ralphGroundCol = CollisionNode('ralphRay')
        self.ralphGroundCol.addSolid(self.ralphGroundRay)
        self.ralphGroundCol.setFromCollideMask(CollideMask.bit(0))
        self.ralphGroundCol.setIntoCollideMask(CollideMask.allOff())
        self.ralphGroundColNp = self.ralph.attachNewNode(self.ralphGroundCol)
        self.ralphGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler)

        self.camGroundRay = CollisionRay()
        self.camGroundRay.setOrigin(0, 0, 9)
        self.camGroundRay.setDirection(0, 0, -1)
        self.camGroundCol = CollisionNode('camRay')
        self.camGroundCol.addSolid(self.camGroundRay)
        self.camGroundCol.setFromCollideMask(CollideMask.bit(0))
        self.camGroundCol.setIntoCollideMask(CollideMask.allOff())
        self.camGroundColNp = self.camera.attachNewNode(self.camGroundCol)
        self.camGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)

        # Uncomment this line to see the collision rays
        #self.ralphColNp.show()
        #self.camGroundColNp.show()

        # Uncomment this line to show a visual representation of the
        # collisions occuring
        #self.cTrav.showCollisions(render)

        # Create some lighting
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor((.3, .3, .3, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection((-5, -5, -5))
        directionalLight.setColor((1, 1, 1, 1))
        directionalLight.setSpecularColor((1, 1, 1, 1))
        render.setLight(render.attachNewNode(ambientLight))
        render.setLight(render.attachNewNode(directionalLight))
Beispiel #22
0
    def getSprayTrack(self,
                      origin,
                      target,
                      scaleUp,
                      hold,
                      scaleDown,
                      horizScale=1.0,
                      vertScale=1.0):
        if self.sprayJoint.isEmpty():
            self.build()
            self.origin = self.getSprayStartPos()
        base.localAvatar.stop(self.toonAnim)
        self.lastFrame = self.avatar.getCurrentFrame(self.toonAnim)
        track = Sequence()
        sprayProp = loader.loadModel(GagGlobals.SPRAY_MDL)
        sprayProp.setTwoSided(1)
        sprayScale = hidden.attachNewNode('spray-parent')
        sprayRot = hidden.attachNewNode('spray-rotate')
        sprayRot.setColor(GagGlobals.WATER_SPRAY_COLOR)
        sprayRot.setTransparency(1)
        collNode = CollisionNode('Collision')
        spraySphere = CollisionSphere(0, 0, 0, 1)
        spraySphere.setTangible(0)
        collNode.addSolid(spraySphere)
        collNode.setCollideMask(CIGlobals.WallBitmask)
        sprayNP = sprayRot.attachNewNode(collNode)
        sprayNP.setY(1)
        self.sprayNP = sprayNP
        event = CollisionHandlerEvent()
        event.set_in_pattern('%fn-into')
        event.set_out_pattern('%fn-out')
        base.cTrav.add_collider(sprayNP, event)
        self.avatar.acceptOnce(sprayNP.node().getName() + '-into',
                               self.onCollision)

        def showSpray(sprayScale, sprayProp, origin, target):
            objects = [sprayRot, sprayScale, sprayProp]
            for item in objects:
                index = objects.index(item)
                if index == 0:
                    item.reparentTo(self.sprayJoint)
                    item.setPos(0, 0, 0)
                    item.setHpr(self.sprayRotation)
                    item.wrtReparentTo(render)
                else:
                    item.reparentTo(objects[index - 1])

        track.append(Func(showSpray, sprayScale, sprayProp, origin, target))
        self.spray = sprayRot

        def calcTargetScale():
            distance = Vec3(target - origin).length()
            yScale = distance / GagGlobals.SPRAY_LEN
            targetScale = Point3(yScale * horizScale, yScale,
                                 yScale * vertScale)
            return targetScale

        track.append(
            Parallel(
                LerpScaleInterval(sprayScale,
                                  scaleUp,
                                  calcTargetScale,
                                  startScale=GagGlobals.PNT3NEAR0),
                sprayNP.posInterval(
                    0.25,
                    self.spray.getPos(render) + Point3(0, 50, 0),
                    startPos=self.spray.getPos(render) + Point3(0, 5, 0))))
        track.append(Wait(hold))
        track.append(Func(self.handleMiss))
        track.append(LerpScaleInterval(sprayScale, 0.75, GagGlobals.PNT3NEAR0))

        def hideSpray():
            (lambda prop: prop.removeNode(), [sprayProp, sprayRot, sprayScale])

        track.append(Func(hideSpray))
        track.append(Func(self.completeSquirt))
        return track
Beispiel #23
0
    def __init__(self):
        ShowBase.__init__(self)

        self.disableMouse()

        properties = WindowProperties()
        properties.setSize(1000, 750)
        self.win.requestProperties(properties)

        self.exitFunc = self.cleanup

        mainLight = DirectionalLight("main light")
        self.mainLightNodePath = render.attachNewNode(mainLight)
        self.mainLightNodePath.setHpr(45, -45, 0)
        render.setLight(self.mainLightNodePath)

        ambientLight = AmbientLight("ambient light")
        ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1))
        self.ambientLightNodePath = render.attachNewNode(ambientLight)
        render.setLight(self.ambientLightNodePath)

        render.setShaderAuto()

        self.environment = loader.loadModel("Models/Misc/environment")
        self.environment.reparentTo(render)

        self.camera.setPos(0, 0, 32)
        self.camera.setP(-90)

        self.keyMap = {
            "up": False,
            "down": False,
            "left": False,
            "right": False,
            "shoot": False
        }

        self.accept("w", self.updateKeyMap, ["up", True])
        self.accept("w-up", self.updateKeyMap, ["up", False])
        self.accept("s", self.updateKeyMap, ["down", True])
        self.accept("s-up", self.updateKeyMap, ["down", False])
        self.accept("a", self.updateKeyMap, ["left", True])
        self.accept("a-up", self.updateKeyMap, ["left", False])
        self.accept("d", self.updateKeyMap, ["right", True])
        self.accept("d-up", self.updateKeyMap, ["right", False])
        self.accept("mouse1", self.updateKeyMap, ["shoot", True])
        self.accept("mouse1-up", self.updateKeyMap, ["shoot", False])

        self.pusher = CollisionHandlerPusher()
        self.cTrav = CollisionTraverser()

        self.pusher.setHorizontal(True)

        self.pusher.add_in_pattern("%fn-into-%in")
        self.accept("trapEnemy-into-wall", self.stopTrap)
        self.accept("trapEnemy-into-trapEnemy", self.stopTrap)
        self.accept("trapEnemy-into-player", self.trapHitsSomething)
        self.accept("trapEnemy-into-walkingEnemy", self.trapHitsSomething)

        wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(8.0)

        wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setY(-8.0)

        wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setX(8.0)

        wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = render.attachNewNode(wallNode)
        wall.setX(-8.0)

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

        self.player = None

        self.enemies = []
        self.trapEnemies = []

        self.deadEnemies = []

        self.spawnPoints = []
        numPointsPerWall = 5
        for i in range(numPointsPerWall):
            coord = 7.0 / numPointsPerWall + 0.5
            self.spawnPoints.append(Vec3(-7.0, coord, 0))
            self.spawnPoints.append(Vec3(7.0, coord, 0))
            self.spawnPoints.append(Vec3(coord, -7.0, 0))
            self.spawnPoints.append(Vec3(coord, 7.0, 0))

        self.initialSpawnInterval = 1.0
        self.minimumSpawnInterval = 0.2
        self.spawnInterval = self.initialSpawnInterval
        self.spawnTimer = self.spawnInterval
        self.maxEnemies = 2
        self.maximumMaxEnemies = 20

        self.numTrapsPerSide = 2

        self.difficultyInterval = 5.0
        self.difficultyTimer = self.difficultyInterval

        self.enemySpawnSound = loader.loadSfx("Sounds/enemySpawn.ogg")

        self.gameOverScreen = DirectDialog(frameSize=(-0.7, 0.7, -0.7, 0.7),
                                           fadeScreen=0.4,
                                           relief=DGG.FLAT,
                                           frameTexture="UI/stoneFrame.png")
        self.gameOverScreen.hide()

        self.font = loader.loadFont("Fonts/Wbxkomik.ttf")

        buttonImages = (loader.loadTexture("UI/UIButton.png"),
                        loader.loadTexture("UI/UIButtonPressed.png"),
                        loader.loadTexture("UI/UIButtonHighlighted.png"),
                        loader.loadTexture("UI/UIButtonDisabled.png"))

        label = DirectLabel(text="Game Over!",
                            parent=self.gameOverScreen,
                            scale=0.1,
                            pos=(0, 0, 0.2),
                            text_font=self.font,
                            relief=None)

        self.finalScoreLabel = DirectLabel(text="",
                                           parent=self.gameOverScreen,
                                           scale=0.07,
                                           pos=(0, 0, 0),
                                           text_font=self.font,
                                           relief=None)

        btn = DirectButton(text="Restart",
                           command=self.startGame,
                           pos=(-0.3, 0, -0.2),
                           parent=self.gameOverScreen,
                           scale=0.07,
                           text_font=self.font,
                           clickSound=loader.loadSfx("Sounds/UIClick.ogg"),
                           frameTexture=buttonImages,
                           frameSize=(-4, 4, -1, 1),
                           text_scale=0.75,
                           relief=DGG.FLAT,
                           text_pos=(0, -0.2))
        btn.setTransparency(True)

        btn = DirectButton(text="Quit",
                           command=self.quit,
                           pos=(0.3, 0, -0.2),
                           parent=self.gameOverScreen,
                           scale=0.07,
                           text_font=self.font,
                           clickSound=loader.loadSfx("Sounds/UIClick.ogg"),
                           frameTexture=buttonImages,
                           frameSize=(-4, 4, -1, 1),
                           text_scale=0.75,
                           relief=DGG.FLAT,
                           text_pos=(0, -0.2))
        btn.setTransparency(True)

        self.titleMenuBackdrop = DirectFrame(frameColor=(0, 0, 0, 1),
                                             frameSize=(-1, 1, -1, 1),
                                             parent=render2d)

        self.titleMenu = DirectFrame(frameColor=(1, 1, 1, 0))

        title = DirectLabel(text="Panda-chan",
                            scale=0.1,
                            pos=(0, 0, 0.9),
                            parent=self.titleMenu,
                            relief=None,
                            text_font=self.font,
                            text_fg=(1, 1, 1, 1))
        title2 = DirectLabel(text="and the",
                             scale=0.07,
                             pos=(0, 0, 0.79),
                             parent=self.titleMenu,
                             text_font=self.font,
                             frameColor=(0.5, 0.5, 0.5, 1))
        title3 = DirectLabel(text="Endless Horde",
                             scale=0.125,
                             pos=(0, 0, 0.65),
                             parent=self.titleMenu,
                             relief=None,
                             text_font=self.font,
                             text_fg=(1, 1, 1, 1))

        btn = DirectButton(text="Start Game",
                           command=self.startGame,
                           pos=(0, 0, 0.2),
                           parent=self.titleMenu,
                           scale=0.1,
                           text_font=self.font,
                           clickSound=loader.loadSfx("Sounds/UIClick.ogg"),
                           frameTexture=buttonImages,
                           frameSize=(-4, 4, -1, 1),
                           text_scale=0.75,
                           relief=DGG.FLAT,
                           text_pos=(0, -0.2))
        btn.setTransparency(True)

        btn = DirectButton(text="Quit",
                           command=self.quit,
                           pos=(0, 0, -0.2),
                           parent=self.titleMenu,
                           scale=0.1,
                           text_font=self.font,
                           clickSound=loader.loadSfx("Sounds/UIClick.ogg"),
                           frameTexture=buttonImages,
                           frameSize=(-4, 4, -1, 1),
                           text_scale=0.75,
                           relief=DGG.FLAT,
                           text_pos=(0, -0.2))
        btn.setTransparency(True)

        music = loader.loadMusic("Music/Defending-the-Princess-Haunted.ogg")
        music.setLoop(True)
        music.setVolume(0.075)
        music.play()
Beispiel #24
0
    def __init__(self, base, label):
        self.base = base

        # Parameters
        self.wheelBaseOffset = 3.4
        self.wheelSideOffset = 3.1
        self.speedMax = 50.0 / 30.0
        self.steerAngleMax = 15.0
        self.numSensors = 9
        self.sensorHeight = 2.0

        # Load car model
        self.car = self.base.loader.loadModel("models/carBody")
        self.carCollider = self.car.attachNewNode(
            CollisionNode("carCollider{}".format(label)))
        self.carCollider.node().addSolid(CollisionSphere(1.5, 0.0, 4.0, 4.0))
        self.carCollider.node().setFromCollideMask(BitMask32(0xF0))
        self.carCollider.setCollideMask(BitMask32(0))
        self.car.reparentTo(self.base.render)

        self.wheelFrontLeft = self.base.loader.loadModel("models/carWheel")
        self.wheelFrontLeft.reparentTo(self.car)
        self.wheelFrontLeft.setX(self.wheelBaseOffset)
        self.wheelFrontLeft.setY(self.wheelSideOffset)

        self.wheelFrontRight = self.base.loader.loadModel("models/carWheel")
        self.wheelFrontRight.reparentTo(self.car)
        self.wheelFrontRight.setX(self.wheelBaseOffset)
        self.wheelFrontRight.setY(-self.wheelSideOffset)

        self.wheelBackLeft = self.base.loader.loadModel("models/carWheel")
        self.wheelBackLeft.reparentTo(self.car)
        self.wheelBackLeft.setX(-self.wheelBaseOffset)
        self.wheelBackLeft.setY(self.wheelSideOffset)

        self.wheelBackRight = self.base.loader.loadModel("models/carWheel")
        self.wheelBackRight.reparentTo(self.car)
        self.wheelBackRight.setX(-self.wheelBaseOffset)
        self.wheelBackRight.setY(-self.wheelSideOffset)

        # Car properties
        self.simulationDone = True
        self.timeAlive = 0
        self.checkpointCount = 0

        self.steerAngle = 0.0
        self.speed = 0.0
        self.sensorDistances = []

        self.wheelFront = Vec3(1.0, 0.0, 0.0) * self.wheelBaseOffset
        self.wheelBack = Vec3(-1.0, 0.0, 0.0) * self.wheelBaseOffset
        self.sensorCollisionHandlers = []
        self.initSensors()

        # Neural network parameters
        self.theta1 = None
        self.theta2 = None
        self.theta3 = None

        # Controls
        self.arrowUpDown = False
        self.arrowLeftDown = False
        self.arrowRightDown = False

        # Run task that checks for sensor collisions
        self.base.taskMgr.add(self.checkCollisions,
                              "CheckCollisionsTask",
                              priority=2)

        # Run task that computes inputs
        self.base.taskMgr.add(self.getInput, "GetInputTask", priority=3)

        # Run task that updates car
        self.base.taskMgr.add(self.updateCar, "UpdateCarTask", priority=4)
Beispiel #25
0
    def __init__(self):

        # Setup window size, title and so on
        load_prc_file_data("", """
        win-size 1600 900
        window-title Render Pipeline - Roaming Ralph Demo
        """)

        # ------ Begin of render pipeline code ------

        # Insert the pipeline path to the system path, this is required to be
        # able to import the pipeline classes
        pipeline_path = "../../"

        # Just a special case for my development setup, so I don't accidentally
        # commit a wrong path. You can remove this in your own programs.
        if not os.path.isfile(os.path.join(pipeline_path, "setup.py")):
            pipeline_path = "../../RenderPipeline/"

        sys.path.insert(0, pipeline_path)

        from rpcore import RenderPipeline, SpotLight
        self.render_pipeline = RenderPipeline()
        self.render_pipeline.create(self)

        # ------ End of render pipeline code, thats it! ------

        # Set time of day
        self.render_pipeline.daytime_mgr.time = "7:40"

        # Use a special effect for rendering the scene, this is because the
        # roaming ralph model has no normals or valid materials
        self.render_pipeline.set_effect(render, "scene-effect.yaml", {}, sort=250)

        self.keyMap = {"left":0, "right":0, "forward":0, "backward":0, "cam-left":0, "cam-right":0}
        self.speed = 1.0
        base.win.setClearColor(Vec4(0,0,0,1))

        # Post the instructions

        self.inst1 = addInstructions(0.95, "[ESC]  Quit")
        self.inst4 = addInstructions(0.90, "[W]  Run Ralph Forward")
        self.inst4 = addInstructions(0.85, "[S]  Run Ralph Backward")
        self.inst2 = addInstructions(0.80, "[A]  Rotate Ralph Left")
        self.inst3 = addInstructions(0.75, "[D]  Rotate Ralph Right")
        self.inst6 = addInstructions(0.70, "[Left Arrow]  Rotate Camera Left")
        self.inst7 = addInstructions(0.65, "[Right Arrow]  Rotate Camera Right")

        # Set up the environment
        #
        # This environment model contains collision meshes.  If you look
        # in the egg file, you will see the following:
        #
        #    <Collide> { Polyset keep descend }
        #
        # This tag causes the following mesh to be converted to a collision
        # mesh -- a mesh which is optimized for collision, not rendering.
        # It also keeps the original mesh, so there are now two copies ---
        # one optimized for rendering, one for collisions.

        self.environ = loader.loadModel("resources/world")
        self.environ.reparentTo(render)
        self.environ.setPos(0,0,0)


        # Remove wall nodes
        self.environ.find("**/wall").remove_node()

        # Create the main character, Ralph
        self.ralph = Actor("resources/ralph",
                                 {"run":"resources/ralph-run",
                                  "walk":"resources/ralph-walk"})
        self.ralph.reparentTo(render)
        self.ralph.setScale(.2)
        self.ralph.setPos(Vec3(-110.9, 29.4, 1.8))

        # Create a floater object.  We use the "floater" as a temporary
        # variable in a variety of calculations.

        self.floater = NodePath(PandaNode("floater"))
        self.floater.reparentTo(render)

        # Accept the control keys for movement and rotation

        self.accept("escape", sys.exit)
        self.accept("a", self.setKey, ["left",1])
        self.accept("d", self.setKey, ["right",1])
        self.accept("w", self.setKey, ["forward",1])
        self.accept("s", self.setKey, ["backward",1])
        self.accept("arrow_left", self.setKey, ["cam-left",1])
        self.accept("arrow_right", self.setKey, ["cam-right",1])
        self.accept("a-up", self.setKey, ["left",0])
        self.accept("d-up", self.setKey, ["right",0])
        self.accept("w-up", self.setKey, ["forward",0])
        self.accept("s-up", self.setKey, ["backward",0])
        self.accept("arrow_left-up", self.setKey, ["cam-left",0])
        self.accept("arrow_right-up", self.setKey, ["cam-right",0])
        self.accept("=", self.adjustSpeed, [0.25])
        self.accept("+", self.adjustSpeed, [0.25])
        self.accept("-", self.adjustSpeed, [-0.25])

        taskMgr.add(self.move,"moveTask")

        # Game state variables
        self.isMoving = False

        # Set up the camera

        base.disableMouse()
        base.camera.setPos(self.ralph.getX() + 10,self.ralph.getY() + 10, 2)
        base.camLens.setFov(80)

        # We will detect the height of the terrain by creating a collision
        # ray and casting it downward toward the terrain.  One ray will
        # start above ralph's head, and the other will start above the camera.
        # A ray may hit the terrain, or it may hit a rock or a tree.  If it
        # hits the terrain, we can detect the height.  If it hits anything
        # else, we rule that the move is illegal.
        self.cTrav = CollisionTraverser()

        self.ralphGroundRay = CollisionRay()
        self.ralphGroundRay.setOrigin(0,0,1000)
        self.ralphGroundRay.setDirection(0,0,-1)
        self.ralphGroundCol = CollisionNode('ralphRay')
        self.ralphGroundCol.addSolid(self.ralphGroundRay)
        self.ralphGroundCol.setFromCollideMask(BitMask32.bit(0))
        self.ralphGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.ralphGroundColNp = self.ralph.attachNewNode(self.ralphGroundCol)
        self.ralphGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler)

        self.camGroundRay = CollisionRay()
        self.camGroundRay.setOrigin(0,0,1000)
        self.camGroundRay.setDirection(0,0,-1)
        self.camGroundCol = CollisionNode('camRay')
        self.camGroundCol.addSolid(self.camGroundRay)
        self.camGroundCol.setFromCollideMask(BitMask32.bit(0))
        self.camGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.camGroundColNp = base.camera.attachNewNode(self.camGroundCol)
        self.camGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)

        # Uncomment this line to see the collision rays
        #self.ralphGroundColNp.show()
        #self.camGroundColNp.show()

        # Uncomment this line to show a visual representation of the
        # collisions occuring
        #self.cTrav.showCollisions(render)

        # Create some lighting
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor(Vec4(.3, .3, .3, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(Vec3(-5, -5, -5))
        directionalLight.setColor(Vec4(1, 1, 1, 1))
        directionalLight.setSpecularColor(Vec4(1, 1, 1, 1))
        render.setLight(render.attachNewNode(ambientLight))
        render.setLight(render.attachNewNode(directionalLight))
Beispiel #26
0
    def __init__(self):

        # Set up the window, camera, etc.
        ShowBase.__init__(self)
        self.ser = serial.Serial('/dev/tty.usbmodem1421', 9600)
        # Set the background color to black
        self.win.setClearColor((0, 0, 0, 1))

        # This is used to store which keys are currently pressed.
        self.keyMap = {
            "left": 0,
            "right": 0,
            "forward": 0,
            "reverse": 0,
            "cam-left": 0,
            "cam-right": 0
        }

        #Initialize Track
        self.track = self.loader.loadModel("luigi_circuit")
        self.track.setScale(1.5)
        self.track.reparentTo(render)

        #Intitial where Mario needs to be
        #marioStartPos = self.track.find("**/start_point").getPos()
        marioStartPos = Vec3(50, -29, 0.35)  #Actual start possition
        #Using ralph because the model is made with correct collision masking and animation
        self.marioActor = Actor("models/ralph", {
            "run": "models/ralph-run",
            "walk": "models/ralph-walk"
        })
        self.marioActor.setScale(0.1, 0.1, 0.1)
        self.marioActor.setH(self.marioActor, 270)
        self.marioActor.reparentTo(self.render)
        self.marioActor.setPos(marioStartPos + (0, 0, 0.5))

        #Floater above so Camera has something to look at
        self.floater = NodePath(PandaNode("floater"))
        self.floater.reparentTo(self.marioActor)
        self.floater.setZ(2.0)

        taskMgr.add(self.move, "moveTask")
        # Game state variables
        self.isMoving = False

        # Set up the camera
        self.disableMouse()
        self.camera.setPos(self.marioActor.getX() + 100,
                           self.marioActor.getY(), 1)

        #Collision Rays
        self.cTrav = CollisionTraverser()

        self.marioGroundRay = CollisionRay()
        self.marioGroundRay.setOrigin(0, 0, 9)
        self.marioGroundRay.setDirection(0, 0, -1)
        self.marioGroundCol = CollisionNode('marioRay')
        self.marioGroundCol.addSolid(self.marioGroundRay)
        self.marioGroundCol.setFromCollideMask(CollideMask.bit(0))
        self.marioGroundCol.setIntoCollideMask(CollideMask.allOff())
        self.marioGroundColNp = self.marioActor.attachNewNode(
            self.marioGroundCol)
        self.marioGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.marioGroundColNp, self.marioGroundHandler)

        self.camGroundRay = CollisionRay()
        self.camGroundRay.setOrigin(0, 0, 9)
        self.camGroundRay.setDirection(0, 0, -1)
        self.camGroundCol = CollisionNode('camRay')
        self.camGroundCol.addSolid(self.camGroundRay)
        self.camGroundCol.setFromCollideMask(CollideMask.bit(0))
        self.camGroundCol.setIntoCollideMask(CollideMask.allOff())
        self.camGroundColNp = self.camera.attachNewNode(self.camGroundCol)
        self.camGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)
Beispiel #27
0
 def setupCollision(self):
     self.sphere = self.eNode.attachNewNode(CollisionNode('object'))
     self.sphere.node().addSolid(CollisionSphere(0, 0, 0, 0.1))
     self.sphere.node().setFromCollideMask(BitMask32.allOff())
     self.sphere.node().setIntoCollideMask(BitMask32(2))
    def __init__(self):
        ShowBase.__init__(self)

        # This is used to store which keys are currently pressed.
        self.keyMap = {"left": 0, "right": 0, "forward": 0, "back": 0, "up": 0}

        # Set up the environment
        #
        # This environment model contains collision meshes.  If you look
        # in the egg file, you will see the following:
        #
        #    <Collide> { Polyset keep descend }
        #
        # This tag causes the following mesh to be converted to a collision
        # mesh -- a mesh which is optimized for collision, not rendering.
        # It also keeps the original mesh, so there are now two copies ---
        # one optimized for rendering, one for collisions.

        self.environ = loader.loadModel("EggMod/SandPlan.egg")
        self.environ.reparentTo(render)
        self.environ.setScale(20)

        StartPos = LVector3(0, 0, 0)
        self.movint = loader.loadModel("EggMod/HailPar.egg")
        self.movint.reparentTo(render)
        self.movint.setScale(2)
        self.movint.setPos(StartPos + (0, 0, 0.5))

        # Accept the control keys for movement and rotation

        self.accept("escape", sys.exit)
        self.accept("arrow_left", self.setKey, ["left", True])
        self.accept("arrow_right", self.setKey, ["right", True])
        self.accept("arrow_up", self.setKey, ["forward", True])
        self.accept("arrow_down", self.setKey, ["back", True])
        self.accept("f", self.setKey, ["up", True])
        self.accept("arrow_left-up", self.setKey, ["left", False])
        self.accept("arrow_right-up", self.setKey, ["right", False])
        self.accept("arrow_up-up", self.setKey, ["forward", False])
        self.accept("arrow_down-up", self.setKey, ["back", False])
        self.accept("f-up", self.setKey, ["up", False])

        self.mopan = Pmango()

        self.alin = LinearEulerIntegrator()
        self.mopan.attachLinearIntegrator(self.alin)
        self.arin = AngularEulerIntegrator()
        self.mopan.attachAngularIntegrator(self.arin)

        taskMgr.add(self.move, "moveTask")

        self.cTrav = CollisionTraverser()
        #base.cTrav.setRespectPrevTransform(True)

        self.actMove = NodePath("ActMove")
        self.actMove.reparentTo(render)
        self.actMove.setPos(0, 0, 190)
        self.an = ActorNode("BMova")
        self.anp = self.actMove.attachNewNode(self.an)

        self.mopan.attachPhysicalNode(self.an)
        self.movint.reparentTo(self.actMove)

        self.anp.node().getPhysicsObject().setMass(1)
        #self.an.getPhysicsObject().setTerminalVelocity(1.0)

        self.dvi = 0
        self.grava = ForceNode('GravAll')
        self.grar = render.attachNewNode(self.grava)
        self.grdi = LinearVectorForce(0.0, -0.0, -8.0)
        #self.grdi.setMassDependent(1)
        self.grava.addForce(
            self.grdi)  #Forces have to be added to force nodes and to
        # a physics manager

        self.mopan.addLinearForce(self.grdi)

        self.BMoveBalance = CollisionSphere(0, 0, -7.0, 1)
        self.BMoveBalanceNode = CollisionNode('BMove')
        self.BMoveBalanceNode.addSolid(self.BMoveBalance)

        #self.BMABalance = CollisionSphere(0, 0, -7.0, 1)
        #self.BMABalanceNode = CollisionNode('BMAove')
        #self.BMABalanceNode.addSolid(self.BMABalance)

        self.BMoveBalancePath = self.actMove.attachNewNode(
            self.BMoveBalanceNode)

        #self.BMAoveBalancePath=self.anp.attachNewNode(self.BMABalanceNode)
        #self.BMAoveBalancePath.setPos(0,0,-8)

        self.BMAoveBalancePath = self.BMoveBalancePath.copyTo(self.anp)
        self.BMAoveBalancePath.setPos(0, 0, -5)

        self.BMoveBalancePath.setPos(
            self.actMove.getRelativePoint(self.BMoveBalancePath,
                                          self.BMoveBalancePath.getPos()))
        self.DinGro = PhysicsCollisionHandler()
        self.DinGro.setStaticFrictionCoef(1)
        self.DinGro.setDynamicFrictionCoef(2)
        self.DinGro.setAlmostStationarySpeed(0.1)

        self.DinGro.addCollider(
            self.BMAoveBalancePath,
            self.anp)  #Colliders use nodepaths for collisions instead of nodes
        self.cTrav.addCollider(self.BMAoveBalancePath, self.DinGro)

        self.DinGro.addCollider(self.BMoveBalancePath, self.anp)
        self.cTrav.addCollider(self.BMoveBalancePath, self.DinGro)

        # Uncomment this line to see the collision rays
        self.BMoveBalancePath.show()
        self.BMAoveBalancePath.show()

        # Uncomment this line to show a visual representation of the
        # collisions occuring
        self.cTrav.showCollisions(render)

        # Create some lighting
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection((-5, -5, -5))
        render.setLight(render.attachNewNode(directionalLight))

        self.calrun = 0
        self.upcal = None
        self.anp.setPos(0, 0, 0)
Beispiel #29
0
    def __init__(self):
        # Initialize the ShowBase class from which we inherit, which will
        # create a window and set up everything we need for rendering into it.
        ShowBase.__init__(self)

        # This code puts the standard title and instruction text on screen
        self.title = \
            OnscreenText(text="Panda3D: Tutorial - Collision Detection",
                         parent=base.a2dBottomRight, align=TextNode.ARight,
                         fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.08,
                         shadow=(0, 0, 0, 0.5))
        self.instructions = \
            OnscreenText(text="Mouse pointer tilts the board",
                         parent=base.a2dTopLeft, align=TextNode.ALeft,
                         pos=(0.05, -0.08), fg=(1, 1, 1, 1), scale=.06,
                         shadow=(0, 0, 0, 0.5))

        self.accept("escape", sys.exit)  # Escape quits

        # Disable default mouse-based camera control.  This is a method on the
        # ShowBase class from which we inherit.
        self.disableMouse()
        camera.setPosHpr(0, 0, 25, 0, -90, 0)  # Place the camera

        # Load the maze and place it in the scene
        self.maze = loader.loadModel("models/maze")
        self.maze.reparentTo(render)

        # Most times, you want collisions to be tested against invisible geometry
        # rather than every polygon. This is because testing against every polygon
        # in the scene is usually too slow. You can have simplified or approximate
        # geometry for the solids and still get good results.
        #
        # Sometimes you'll want to create and position your own collision solids in
        # code, but it's often easier to have them built automatically. This can be
        # done by adding special tags into an egg file. Check maze.egg and ball.egg
        # and look for lines starting with <Collide>. The part is brackets tells
        # Panda exactly what to do. Polyset means to use the polygons in that group
        # as solids, while Sphere tells panda to make a collision sphere around them
        # Keep means to keep the polygons in the group as visable geometry (good
        # for the ball, not for the triggers), and descend means to make sure that
        # the settings are applied to any subgroups.
        #
        # Once we have the collision tags in the models, we can get to them using
        # NodePath's find command

        # Find the collision node named wall_collide
        self.walls = self.maze.find("**/wall_collide")

        # Collision objects are sorted using BitMasks. BitMasks are ordinary numbers
        # with extra methods for working with them as binary bits. Every collision
        # solid has both a from mask and an into mask. Before Panda tests two
        # objects, it checks to make sure that the from and into collision masks
        # have at least one bit in common. That way things that shouldn't interact
        # won't. Normal model nodes have collision masks as well. By default they
        # are set to bit 20. If you want to collide against actual visable polygons,
        # set a from collide mask to include bit 20
        #
        # For this example, we will make everything we want the ball to collide with
        # include bit 0
        self.walls.node().setIntoCollideMask(BitMask32.bit(0))
        # CollisionNodes are usually invisible but can be shown. Uncomment the next
        # line to see the collision walls
        #self.walls.show()

        # We will now find the triggers for the holes and set their masks to 0 as
        # well. We also set their names to make them easier to identify during
        # collisions
        self.loseTriggers = []
        for i in range(6):
            trigger = self.maze.find("**/hole_collide" + str(i))
            trigger.node().setIntoCollideMask(BitMask32.bit(0))
            trigger.node().setName("loseTrigger")
            self.loseTriggers.append(trigger)
            # Uncomment this line to see the triggers
            # trigger.show()

        # Ground_collide is a single polygon on the same plane as the ground in the
        # maze. We will use a ray to collide with it so that we will know exactly
        # what height to put the ball at every frame. Since this is not something
        # that we want the ball itself to collide with, it has a different
        # bitmask.
        self.mazeGround = self.maze.find("**/ground_collide")
        self.mazeGround.node().setIntoCollideMask(BitMask32.bit(1))

        # Load the ball and attach it to the scene
        # It is on a root dummy node so that we can rotate the ball itself without
        # rotating the ray that will be attached to it
        self.ballRoot = render.attachNewNode("ballRoot")
        self.ball = loader.loadModel("models/ball")
        self.ball.reparentTo(self.ballRoot)

        # Find the collison sphere for the ball which was created in the egg file
        # Notice that it has a from collision mask of bit 0, and an into collison
        # mask of no bits. This means that the ball can only cause collisions, not
        # be collided into
        self.ballSphere = self.ball.find("**/ball")
        self.ballSphere.node().setFromCollideMask(BitMask32.bit(0))
        self.ballSphere.node().setIntoCollideMask(BitMask32.allOff())

        # No we create a ray to start above the ball and cast down. This is to
        # Determine the height the ball should be at and the angle the floor is
        # tilting. We could have used the sphere around the ball itself, but it
        # would not be as reliable
        self.ballGroundRay = CollisionRay()     # Create the ray
        self.ballGroundRay.setOrigin(0, 0, 10)    # Set its origin
        self.ballGroundRay.setDirection(0, 0, -1)  # And its direction
        # Collision solids go in CollisionNode
        # Create and name the node
        self.ballGroundCol = CollisionNode('groundRay')
        self.ballGroundCol.addSolid(self.ballGroundRay)  # Add the ray
        self.ballGroundCol.setFromCollideMask(
            BitMask32.bit(1))  # Set its bitmasks
        self.ballGroundCol.setIntoCollideMask(BitMask32.allOff())
        # Attach the node to the ballRoot so that the ray is relative to the ball
        # (it will always be 10 feet over the ball and point down)
        self.ballGroundColNp = self.ballRoot.attachNewNode(self.ballGroundCol)
        # Uncomment this line to see the ray
        #self.ballGroundColNp.show()

        # Finally, we create a CollisionTraverser. CollisionTraversers are what
        # do the job of walking the scene graph and calculating collisions.
        # For a traverser to actually do collisions, you need to call
        # traverser.traverse() on a part of the scene. Fortunately, ShowBase
        # has a task that does this for the entire scene once a frame.  By
        # assigning it to self.cTrav, we designate that this is the one that
        # it should call traverse() on each frame.
        self.cTrav = CollisionTraverser()

        # Collision traversers tell collision handlers about collisions, and then
        # the handler decides what to do with the information. We are using a
        # CollisionHandlerQueue, which simply creates a list of all of the
        # collisions in a given pass. There are more sophisticated handlers like
        # one that sends events and another that tries to keep collided objects
        # apart, but the results are often better with a simple queue
        self.cHandler = CollisionHandlerQueue()
        # Now we add the collision nodes that can create a collision to the
        # traverser. The traverser will compare these to all others nodes in the
        # scene. There is a limit of 32 CollisionNodes per traverser
        # We add the collider, and the handler to use as a pair
        self.cTrav.addCollider(self.ballSphere, self.cHandler)
        self.cTrav.addCollider(self.ballGroundColNp, self.cHandler)

        # Collision traversers have a built in tool to help visualize collisions.
        # Uncomment the next line to see it.
        #self.cTrav.showCollisions(render)

        # This section deals with lighting for the ball. Only the ball was lit
        # because the maze has static lighting pregenerated by the modeler
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor((.55, .55, .55, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(LVector3(0, 0, -1))
        directionalLight.setColor((0.375, 0.375, 0.375, 1))
        directionalLight.setSpecularColor((1, 1, 1, 1))
        self.ballRoot.setLight(render.attachNewNode(ambientLight))
        self.ballRoot.setLight(render.attachNewNode(directionalLight))

        # This section deals with adding a specular highlight to the ball to make
        # it look shiny.  Normally, this is specified in the .egg file.
        m = Material()
        m.setSpecular((1, 1, 1, 1))
        m.setShininess(96)
        self.ball.setMaterial(m, 1)

        # Finally, we call start for more initialization
        self.start()
Beispiel #30
0
 def create_collision_solid(self, radius=1.0):
     cs = CollisionSphere(0, 0, 0, radius)
     self.collision_solid = self.instance.attachNewNode(
         CollisionNode('cnode'))
     self.collision_solid.node().addSolid(cs)