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
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)
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
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()
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 = []
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
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)
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)
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))
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) """
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))
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
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)
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
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
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
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
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))
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
def __init__(self): ShowBase.__init__(self) self.disableMouse() properties = WindowProperties() properties.setSize(1000, 750) self.win.requestProperties(properties) self.exitFunc = self.cleanup mainLight = DirectionalLight("main light") self.mainLightNodePath = render.attachNewNode(mainLight) self.mainLightNodePath.setHpr(45, -45, 0) render.setLight(self.mainLightNodePath) ambientLight = AmbientLight("ambient light") ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1)) self.ambientLightNodePath = render.attachNewNode(ambientLight) render.setLight(self.ambientLightNodePath) render.setShaderAuto() self.environment = loader.loadModel("Models/Misc/environment") self.environment.reparentTo(render) self.camera.setPos(0, 0, 32) self.camera.setP(-90) self.keyMap = { "up": False, "down": False, "left": False, "right": False, "shoot": False } self.accept("w", self.updateKeyMap, ["up", True]) self.accept("w-up", self.updateKeyMap, ["up", False]) self.accept("s", self.updateKeyMap, ["down", True]) self.accept("s-up", self.updateKeyMap, ["down", False]) self.accept("a", self.updateKeyMap, ["left", True]) self.accept("a-up", self.updateKeyMap, ["left", False]) self.accept("d", self.updateKeyMap, ["right", True]) self.accept("d-up", self.updateKeyMap, ["right", False]) self.accept("mouse1", self.updateKeyMap, ["shoot", True]) self.accept("mouse1-up", self.updateKeyMap, ["shoot", False]) self.pusher = CollisionHandlerPusher() self.cTrav = CollisionTraverser() self.pusher.setHorizontal(True) self.pusher.add_in_pattern("%fn-into-%in") self.accept("trapEnemy-into-wall", self.stopTrap) self.accept("trapEnemy-into-trapEnemy", self.stopTrap) self.accept("trapEnemy-into-player", self.trapHitsSomething) self.accept("trapEnemy-into-walkingEnemy", self.trapHitsSomething) wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(8.0) wallSolid = CollisionTube(-8.0, 0, 0, 8.0, 0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setY(-8.0) wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setX(8.0) wallSolid = CollisionTube(0, -8.0, 0, 0, 8.0, 0, 0.2) wallNode = CollisionNode("wall") wallNode.addSolid(wallSolid) wall = render.attachNewNode(wallNode) wall.setX(-8.0) self.updateTask = taskMgr.add(self.update, "update") self.player = None self.enemies = [] self.trapEnemies = [] self.deadEnemies = [] self.spawnPoints = [] numPointsPerWall = 5 for i in range(numPointsPerWall): coord = 7.0 / numPointsPerWall + 0.5 self.spawnPoints.append(Vec3(-7.0, coord, 0)) self.spawnPoints.append(Vec3(7.0, coord, 0)) self.spawnPoints.append(Vec3(coord, -7.0, 0)) self.spawnPoints.append(Vec3(coord, 7.0, 0)) self.initialSpawnInterval = 1.0 self.minimumSpawnInterval = 0.2 self.spawnInterval = self.initialSpawnInterval self.spawnTimer = self.spawnInterval self.maxEnemies = 2 self.maximumMaxEnemies = 20 self.numTrapsPerSide = 2 self.difficultyInterval = 5.0 self.difficultyTimer = self.difficultyInterval self.enemySpawnSound = loader.loadSfx("Sounds/enemySpawn.ogg") self.gameOverScreen = DirectDialog(frameSize=(-0.7, 0.7, -0.7, 0.7), fadeScreen=0.4, relief=DGG.FLAT, frameTexture="UI/stoneFrame.png") self.gameOverScreen.hide() self.font = loader.loadFont("Fonts/Wbxkomik.ttf") buttonImages = (loader.loadTexture("UI/UIButton.png"), loader.loadTexture("UI/UIButtonPressed.png"), loader.loadTexture("UI/UIButtonHighlighted.png"), loader.loadTexture("UI/UIButtonDisabled.png")) label = DirectLabel(text="Game Over!", parent=self.gameOverScreen, scale=0.1, pos=(0, 0, 0.2), text_font=self.font, relief=None) self.finalScoreLabel = DirectLabel(text="", parent=self.gameOverScreen, scale=0.07, pos=(0, 0, 0), text_font=self.font, relief=None) btn = DirectButton(text="Restart", command=self.startGame, pos=(-0.3, 0, -0.2), parent=self.gameOverScreen, scale=0.07, text_font=self.font, clickSound=loader.loadSfx("Sounds/UIClick.ogg"), frameTexture=buttonImages, frameSize=(-4, 4, -1, 1), text_scale=0.75, relief=DGG.FLAT, text_pos=(0, -0.2)) btn.setTransparency(True) btn = DirectButton(text="Quit", command=self.quit, pos=(0.3, 0, -0.2), parent=self.gameOverScreen, scale=0.07, text_font=self.font, clickSound=loader.loadSfx("Sounds/UIClick.ogg"), frameTexture=buttonImages, frameSize=(-4, 4, -1, 1), text_scale=0.75, relief=DGG.FLAT, text_pos=(0, -0.2)) btn.setTransparency(True) self.titleMenuBackdrop = DirectFrame(frameColor=(0, 0, 0, 1), frameSize=(-1, 1, -1, 1), parent=render2d) self.titleMenu = DirectFrame(frameColor=(1, 1, 1, 0)) title = DirectLabel(text="Panda-chan", scale=0.1, pos=(0, 0, 0.9), parent=self.titleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) title2 = DirectLabel(text="and the", scale=0.07, pos=(0, 0, 0.79), parent=self.titleMenu, text_font=self.font, frameColor=(0.5, 0.5, 0.5, 1)) title3 = DirectLabel(text="Endless Horde", scale=0.125, pos=(0, 0, 0.65), parent=self.titleMenu, relief=None, text_font=self.font, text_fg=(1, 1, 1, 1)) btn = DirectButton(text="Start Game", command=self.startGame, pos=(0, 0, 0.2), parent=self.titleMenu, scale=0.1, text_font=self.font, clickSound=loader.loadSfx("Sounds/UIClick.ogg"), frameTexture=buttonImages, frameSize=(-4, 4, -1, 1), text_scale=0.75, relief=DGG.FLAT, text_pos=(0, -0.2)) btn.setTransparency(True) btn = DirectButton(text="Quit", command=self.quit, pos=(0, 0, -0.2), parent=self.titleMenu, scale=0.1, text_font=self.font, clickSound=loader.loadSfx("Sounds/UIClick.ogg"), frameTexture=buttonImages, frameSize=(-4, 4, -1, 1), text_scale=0.75, relief=DGG.FLAT, text_pos=(0, -0.2)) btn.setTransparency(True) music = loader.loadMusic("Music/Defending-the-Princess-Haunted.ogg") music.setLoop(True) music.setVolume(0.075) music.play()
def __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)
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))
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)
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)
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()
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)