class Game(DirectObject): def __init__(self): base.setBackgroundColor(0.1, 0.1, 0.8, 1) base.setFrameRateMeter(True) base.cam.setPos(0, -20, 4) base.cam.lookAt(0, 0, 0) # Input self.accept('escape', self.doExit) self.accept('space', self.doJump) self.accept('c', self.doCrouch) self.accept('c-up', self.stopCrouch) self.accept('control', self.startFly) self.accept('control-up', self.stopFly) inputState.watchWithModifiers('forward', 'w') inputState.watchWithModifiers('left', 'a') inputState.watchWithModifiers('reverse', 's') inputState.watchWithModifiers('right', 'd') inputState.watchWithModifiers('turnLeft', 'q') inputState.watchWithModifiers('turnRight', 'e') inputState.watchWithModifiers('run', 'shift') inputState.watchWithModifiers('flyUp', 'r') inputState.watchWithModifiers('flyDown', 'f') # Task taskMgr.add(self.update, 'updateWorld') # Physics self.setup() # _____HANDLER_____ def doExit(self): self.cleanup() sys.exit(1) def doJump(self): self.character.startJump(10) def doCrouch(self): self.character.startCrouch() def stopCrouch(self): self.character.stopCrouch() def startFly(self): self.character.startFly() def stopFly(self): self.character.stopFly() def processInput(self, dt): speed = Vec3(0, 0, 0) omega = 0.0 v = 5.0 if inputState.isSet('run'): v = 15.0 if inputState.isSet('forward'): speed.setY(v) if inputState.isSet('reverse'): speed.setY(-v) if inputState.isSet('left'): speed.setX(-v) if inputState.isSet('right'): speed.setX(v) if inputState.isSet('flyUp'): speed.setZ(2.0) if inputState.isSet('flyDown'): speed.setZ(-2.0) if inputState.isSet('turnLeft'): omega = 120.0 if inputState.isSet('turnRight'): omega = -120.0 self.character.setAngularMovement(omega) self.character.setLinearMovement(speed, True) def update(self, task): dt = globalClock.getDt() self.processInput(dt) oldCharPos = self.character.getPos(render) self.character.setH(base.camera.getH(render)) self.character.update() # WIP newCharPos = self.character.getPos(render) delta = newCharPos - oldCharPos self.world.doPhysics(dt, 4, 1. / 120.) ml.orbitCenter = self.character.getPos(render) base.camera.setPos(base.camera.getPos(render) + delta) return task.cont def cleanup(self): self.world = None self.worldNP.removeNode() def setup(self): self.worldNP = render.attachNewNode('World') # 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()) # Ground shape = BulletPlaneShape(Vec3(0, 0, 1.0), 0) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Ground')) np.node().addShape(shape) np.setPos(0, 0, 0) np.setCollideMask(BitMask32.allOn()) cm = CardMaker('ground') cm.setFrame(-20, 20, -20, 20) gfx = render.attachNewNode(cm.generate()) gfx.setP(-90) gfx.setZ(-0.01) gfx.setColorScale(Vec4(0.4)) self.world.attachRigidBody(np.node()) X = 0.3 Y = 4.0 Z = 1.5 stepsY = 1.5 shapesData = [ dict(name='wall0', size=Vec3(X, Y, Z), pos=Point3(Y * 2.0, -(Y + stepsY), Z), hpr=Vec3()), dict(name='wall1', size=Vec3(X, Y, Z), pos=Point3(Y * 2.0, (Y + stepsY), Z), hpr=Vec3()), dict(name='wall4', size=Vec3(X, Y, Z), pos=Point3(Y, (Y * 2.0 + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='wall5', size=Vec3(X, Y, Z), pos=Point3(-Y, (Y * 2.0 + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='wall6', size=Vec3(X, Y, Z), pos=Point3(Y, -(Y * 2.0 + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='wall7', size=Vec3(X, Y, Z), pos=Point3(-Y, -(Y * 2.0 + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='ceiling', size=Vec3(Y, Y * 2.0, X), pos=Point3(0, -(Y + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='ceiling', size=Vec3(Y, Z, X), pos=Point3(-Z, (Y + stepsY - X), Z * 2.0 - X), hpr=Vec3(90, 0, 0)), dict(name='ceiling', size=Vec3(Y, Z, X), pos=Point3(Z, (Y + stepsY - X), Z * 4.0 - X), hpr=Vec3(90, 0, 0)), # CHANGE ROTATION TO TEST DIFFERENT SLOPES dict(name='slope', size=Vec3(20, stepsY + Y * 2.0, X), pos=Point3(-Y * 2.0, 0, 0), hpr=Vec3(0, 0, 50)), ] for i in range(10): s = Vec3(0.4, stepsY, 0.2) p = Point3(Y * 2.0 + i * s.x * 2.0, 0, s.z + i * s.z * 2.0) data = dict(name='Yall', size=s, pos=p, hpr=Vec3()) shapesData.append(data) for data in shapesData: shape = BulletBoxShape(data['size']) np = self.worldNP.attachNewNode(BulletRigidBodyNode(data['name'])) np.node().addShape(shape) np.setPos(data['pos']) np.setHpr(data['hpr']) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletSphereShape(0.5) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Ball')) np.node().addShape(shape) np.node().setMass(10.0) np.setPos(13.0, 0, 5.0) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletBoxShape(Vec3(0.5)) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Crate')) np.node().addShape(shape) np.node().setMass(10.0) np.setPos(-13.0, 0, 10.0) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletBoxShape(Vec3(1, 1, 2.5)) self.ghost = self.worldNP.attachNewNode(BulletGhostNode('Ghost')) self.ghost.node().addShape(shape) self.ghost.setPos(-5.0, 0, 3) self.ghost.setCollideMask(BitMask32.allOn()) self.world.attachGhost(self.ghost.node()) taskMgr.add(self.checkGhost, 'checkGhost') self.character = PandaBulletCharacterController( self.world, self.worldNP, 1.75, 1.3, 0.5, 0.4) self.character.setPos(render, Point3(0, 0, 0.5)) def checkGhost(self, task): ghost = self.ghost.node() for node in ghost.getOverlappingNodes(): print "Ghost collides with", node return task.cont
def setup(self): self.worldNP = render.attachNewNode('World') # 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()) # Ground shape = BulletPlaneShape(Vec3(0, 0, 1.0), 0) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Ground')) np.node().addShape(shape) np.setPos(0, 0, 0) np.setCollideMask(BitMask32.allOn()) cm = CardMaker('ground') cm.setFrame(-20, 20, -20, 20) gfx = render.attachNewNode(cm.generate()) gfx.setP(-90) gfx.setZ(-0.01) gfx.setColorScale(Vec4(0.4)) self.world.attachRigidBody(np.node()) X = 0.3 Y = 4.0 Z = 1.5 stepsY = 1.5 shapesData = [ dict(name='wall0', size=Vec3(X, Y, Z), pos=Point3(Y * 2.0, -(Y + stepsY), Z), hpr=Vec3()), dict(name='wall1', size=Vec3(X, Y, Z), pos=Point3(Y * 2.0, (Y + stepsY), Z), hpr=Vec3()), dict(name='wall4', size=Vec3(X, Y, Z), pos=Point3(Y, (Y * 2.0 + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='wall5', size=Vec3(X, Y, Z), pos=Point3(-Y, (Y * 2.0 + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='wall6', size=Vec3(X, Y, Z), pos=Point3(Y, -(Y * 2.0 + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='wall7', size=Vec3(X, Y, Z), pos=Point3(-Y, -(Y * 2.0 + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='ceiling', size=Vec3(Y, Y * 2.0, X), pos=Point3(0, -(Y + stepsY - X), Z), hpr=Vec3(90, 0, 0)), dict(name='ceiling', size=Vec3(Y, Z, X), pos=Point3(-Z, (Y + stepsY - X), Z * 2.0 - X), hpr=Vec3(90, 0, 0)), dict(name='ceiling', size=Vec3(Y, Z, X), pos=Point3(Z, (Y + stepsY - X), Z * 4.0 - X), hpr=Vec3(90, 0, 0)), # CHANGE ROTATION TO TEST DIFFERENT SLOPES dict(name='slope', size=Vec3(20, stepsY + Y * 2.0, X), pos=Point3(-Y * 2.0, 0, 0), hpr=Vec3(0, 0, 50)), ] for i in range(10): s = Vec3(0.4, stepsY, 0.2) p = Point3(Y * 2.0 + i * s.x * 2.0, 0, s.z + i * s.z * 2.0) data = dict(name='Yall', size=s, pos=p, hpr=Vec3()) shapesData.append(data) for data in shapesData: shape = BulletBoxShape(data['size']) np = self.worldNP.attachNewNode(BulletRigidBodyNode(data['name'])) np.node().addShape(shape) np.setPos(data['pos']) np.setHpr(data['hpr']) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletSphereShape(0.5) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Ball')) np.node().addShape(shape) np.node().setMass(10.0) np.setPos(13.0, 0, 5.0) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletBoxShape(Vec3(0.5)) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Crate')) np.node().addShape(shape) np.node().setMass(10.0) np.setPos(-13.0, 0, 10.0) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletBoxShape(Vec3(1, 1, 2.5)) self.ghost = self.worldNP.attachNewNode(BulletGhostNode('Ghost')) self.ghost.node().addShape(shape) self.ghost.setPos(-5.0, 0, 3) self.ghost.setCollideMask(BitMask32.allOn()) self.world.attachGhost(self.ghost.node()) taskMgr.add(self.checkGhost, 'checkGhost') self.character = PandaBulletCharacterController( self.world, self.worldNP, 1.75, 1.3, 0.5, 0.4) self.character.setPos(render, Point3(0, 0, 0.5))
def setup(self): self.worldNP = render.attachNewNode('World') # 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()) # Ground shape = BulletPlaneShape(Vec3(0, 0, 1.0), 0) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Ground')) np.node().addShape(shape) np.setPos(0, 0, 0) np.setCollideMask(BitMask32.allOn()) cm = CardMaker('ground') cm.setFrame(-20, 20, -20, 20) gfx = render.attachNewNode(cm.generate()) gfx.setP(-90) gfx.setZ(-0.01) gfx.setColorScale(Vec4(0.4)) self.world.attachRigidBody(np.node()) X = 0.3 Y = 4.0 Z = 1.5 stepsY = 1.5 shapesData = [ dict(name = 'wall0', size = Vec3(X, Y, Z), pos = Point3(Y*2.0, -(Y + stepsY), Z), hpr = Vec3()), dict(name = 'wall1', size = Vec3(X, Y, Z), pos = Point3(Y*2.0, (Y + stepsY), Z), hpr = Vec3()), dict(name = 'wall4', size = Vec3(X, Y, Z), pos = Point3(Y, (Y*2.0 + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'wall5', size = Vec3(X, Y, Z), pos = Point3(-Y, (Y*2.0 + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'wall6', size = Vec3(X, Y, Z), pos = Point3(Y, -(Y*2.0 + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'wall7', size = Vec3(X, Y, Z), pos = Point3(-Y, -(Y*2.0 + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'ceiling', size = Vec3(Y, Y*2.0, X), pos = Point3(0, -(Y + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'ceiling', size = Vec3(Y, Z, X), pos = Point3(-Z, (Y + stepsY - X), Z*2.0-X), hpr = Vec3(90, 0, 0)), dict(name = 'ceiling', size = Vec3(Y, Z, X), pos = Point3(Z, (Y + stepsY - X), Z*4.0-X), hpr = Vec3(90, 0, 0)), # CHANGE ROTATION TO TEST DIFFERENT SLOPES dict(name = 'slope', size = Vec3(20, stepsY+Y*2.0, X), pos = Point3(-Y*2.0, 0, 0), hpr = Vec3(0, 0, 50)), ] for i in range(10): s = Vec3(0.4, stepsY, 0.2) p = Point3(Y*2.0 + i * s.x * 2.0, 0, s.z + i * s.z * 2.0) data = dict(name = 'Yall', size = s, pos = p, hpr = Vec3()) shapesData.append(data) for data in shapesData: shape = BulletBoxShape(data['size']) np = self.worldNP.attachNewNode(BulletRigidBodyNode(data['name'])) np.node().addShape(shape) np.setPos(data['pos']) np.setHpr(data['hpr']) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletSphereShape(0.5) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Ball')) np.node().addShape(shape) np.node().setMass(10.0) np.setPos(13.0, 0, 5.0) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletBoxShape(Vec3(0.5)) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Crate')) np.node().addShape(shape) np.node().setMass(10.0) np.setPos(-13.0, 0, 10.0) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletBoxShape(Vec3(1, 1, 2.5)) self.ghost = self.worldNP.attachNewNode(BulletGhostNode('Ghost')) self.ghost.node().addShape(shape) self.ghost.setPos(-5.0, 0, 3) self.ghost.setCollideMask(BitMask32.allOn()) self.world.attachGhost(self.ghost.node()) taskMgr.add(self.checkGhost, 'checkGhost') self.character = PandaBulletCharacterController(self.world, self.worldNP, 1.75, 1.3, 0.5, 0.4) self.character.setPos(render, Point3(0, 0, 0.5))
class Game(DirectObject): def __init__(self): base.setBackgroundColor(0.1, 0.1, 0.8, 1) base.setFrameRateMeter(True) base.cam.setPos(0, -20, 4) base.cam.lookAt(0, 0, 0) # Input self.accept('escape', self.doExit) self.accept('space', self.doJump) self.accept('c', self.doCrouch) self.accept('c-up', self.stopCrouch) self.accept('control', self.startFly) self.accept('control-up', self.stopFly) inputState.watchWithModifiers('forward', 'w') inputState.watchWithModifiers('left', 'a') inputState.watchWithModifiers('reverse', 's') inputState.watchWithModifiers('right', 'd') inputState.watchWithModifiers('turnLeft', 'q') inputState.watchWithModifiers('turnRight', 'e') inputState.watchWithModifiers('run', 'shift') inputState.watchWithModifiers('flyUp', 'r') inputState.watchWithModifiers('flyDown', 'f') # Task taskMgr.add(self.update, 'updateWorld') # Physics self.setup() # _____HANDLER_____ def doExit(self): self.cleanup() sys.exit(1) def doJump(self): self.character.startJump(10) def doCrouch(self): self.character.startCrouch() def stopCrouch(self): self.character.stopCrouch() def startFly(self): self.character.startFly() def stopFly(self): self.character.stopFly() def processInput(self, dt): speed = Vec3(0, 0, 0) omega = 0.0 v = 5.0 if inputState.isSet('run'): v = 15.0 if inputState.isSet('forward'): speed.setY(v) if inputState.isSet('reverse'): speed.setY(-v) if inputState.isSet('left'): speed.setX(-v) if inputState.isSet('right'): speed.setX(v) if inputState.isSet('flyUp'): speed.setZ( 2.0) if inputState.isSet('flyDown'): speed.setZ( -2.0) if inputState.isSet('turnLeft'): omega = 120.0 if inputState.isSet('turnRight'): omega = -120.0 self.character.setAngularMovement(omega) self.character.setLinearMovement(speed, True) def update(self, task): dt = globalClock.getDt() self.processInput(dt) oldCharPos = self.character.getPos(render) self.character.setH(base.camera.getH(render)) self.character.update() # WIP newCharPos = self.character.getPos(render) delta = newCharPos - oldCharPos self.world.doPhysics(dt, 4, 1./120.) ml.orbitCenter = self.character.getPos(render) base.camera.setPos(base.camera.getPos(render) + delta) return task.cont def cleanup(self): self.world = None self.worldNP.removeNode() def setup(self): self.worldNP = render.attachNewNode('World') # 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()) # Ground shape = BulletPlaneShape(Vec3(0, 0, 1.0), 0) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Ground')) np.node().addShape(shape) np.setPos(0, 0, 0) np.setCollideMask(BitMask32.allOn()) cm = CardMaker('ground') cm.setFrame(-20, 20, -20, 20) gfx = render.attachNewNode(cm.generate()) gfx.setP(-90) gfx.setZ(-0.01) gfx.setColorScale(Vec4(0.4)) self.world.attachRigidBody(np.node()) X = 0.3 Y = 4.0 Z = 1.5 stepsY = 1.5 shapesData = [ dict(name = 'wall0', size = Vec3(X, Y, Z), pos = Point3(Y*2.0, -(Y + stepsY), Z), hpr = Vec3()), dict(name = 'wall1', size = Vec3(X, Y, Z), pos = Point3(Y*2.0, (Y + stepsY), Z), hpr = Vec3()), dict(name = 'wall4', size = Vec3(X, Y, Z), pos = Point3(Y, (Y*2.0 + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'wall5', size = Vec3(X, Y, Z), pos = Point3(-Y, (Y*2.0 + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'wall6', size = Vec3(X, Y, Z), pos = Point3(Y, -(Y*2.0 + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'wall7', size = Vec3(X, Y, Z), pos = Point3(-Y, -(Y*2.0 + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'ceiling', size = Vec3(Y, Y*2.0, X), pos = Point3(0, -(Y + stepsY - X), Z), hpr = Vec3(90, 0, 0)), dict(name = 'ceiling', size = Vec3(Y, Z, X), pos = Point3(-Z, (Y + stepsY - X), Z*2.0-X), hpr = Vec3(90, 0, 0)), dict(name = 'ceiling', size = Vec3(Y, Z, X), pos = Point3(Z, (Y + stepsY - X), Z*4.0-X), hpr = Vec3(90, 0, 0)), # CHANGE ROTATION TO TEST DIFFERENT SLOPES dict(name = 'slope', size = Vec3(20, stepsY+Y*2.0, X), pos = Point3(-Y*2.0, 0, 0), hpr = Vec3(0, 0, 50)), ] for i in range(10): s = Vec3(0.4, stepsY, 0.2) p = Point3(Y*2.0 + i * s.x * 2.0, 0, s.z + i * s.z * 2.0) data = dict(name = 'Yall', size = s, pos = p, hpr = Vec3()) shapesData.append(data) for data in shapesData: shape = BulletBoxShape(data['size']) np = self.worldNP.attachNewNode(BulletRigidBodyNode(data['name'])) np.node().addShape(shape) np.setPos(data['pos']) np.setHpr(data['hpr']) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletSphereShape(0.5) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Ball')) np.node().addShape(shape) np.node().setMass(10.0) np.setPos(13.0, 0, 5.0) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletBoxShape(Vec3(0.5)) np = self.worldNP.attachNewNode(BulletRigidBodyNode('Crate')) np.node().addShape(shape) np.node().setMass(10.0) np.setPos(-13.0, 0, 10.0) np.setCollideMask(BitMask32.allOn()) self.world.attachRigidBody(np.node()) shape = BulletBoxShape(Vec3(1, 1, 2.5)) self.ghost = self.worldNP.attachNewNode(BulletGhostNode('Ghost')) self.ghost.node().addShape(shape) self.ghost.setPos(-5.0, 0, 3) self.ghost.setCollideMask(BitMask32.allOn()) self.world.attachGhost(self.ghost.node()) taskMgr.add(self.checkGhost, 'checkGhost') self.character = PandaBulletCharacterController(self.world, self.worldNP, 1.75, 1.3, 0.5, 0.4) self.character.setPos(render, Point3(0, 0, 0.5)) def checkGhost(self, task): ghost = self.ghost.node() for node in ghost.getOverlappingNodes(): print "Ghost collides with", node return task.cont
# attach to the Bullet world world.attachRigidBody(node) # this is unnecessary since debug is on ## make it visible #BUG: model does not match up with the shape, offset properly #model = loader.loadModel('models/box.egg') #model.flattenLight() #model.reparentTo(np) ############# # character # ############# """This uses peterpodgorski's kcc. Refer to the source, it's nicely documented.""" # the controller takes care of all the internal things node = PandaBulletCharacterController(world, worldNP, 1.75, 1.3, 0.5, 0.4) # This isn't necessary anymore due to debug ## make it visible #BUG: this model too did not match the actual shape, be careful next time #model = loader.loadModel('models/box.egg') #model.flattenLight() #model.reparentTo(node.movementParent) # currently, the easiest way to parent a visible model is to use the movementParent # task to update the character, this is needed for now def c_update(task): dt = globalClock.getDt() node.update() return task.cont