def __init__(self, modelStanding, modelAnimationDict, turnRate, speed, agentList, massKg, collisionMask, name="", collisionHandler = None, collisionTraverser = None): NodePath.__init__(self, ActorNode(name + " actor node")) self.name = name self.actor = Actor() self.actor.loadModel(modelStanding) self.actor.loadAnims(modelAnimationDict) self.loop = self.actor.loop self.stop = self.actor.stop self.pose = self.actor.pose self.turnRate = turnRate self.speed = speed self.agentList = agentList self.massKg = massKg self.collisionMask = collisionMask if self.actor not in agentList: self.agentList.append(self.actor) self.actor.reparentTo(self) self.__setupCollisionHandling(collisionHandler, collisionTraverser)
avatarFloorHandler.setGravity(9.81 + 25) avatarFloorHandler.setMaxVelocity(100) #** the walls collider wallHandler = CollisionHandlerPusher() #** we'll use this to 'sense' the fallout impact velocity and also to 'read' various triggers we've put around the map for several purposes. collisionEvent = CollisionHandlerEvent() #** Collision masks - this time there is a new one: the TRIGGER_MASK is used to detect certain collision geometry to act as a trigger, therefore we need to distinguish'em from floor and walls. FLOOR_MASK = BitMask32.bit(1) WALL_MASK = BitMask32.bit(2) TRIGGER_MASK = BitMask32.bit(3) #** Our steering avatar avatarNP = base.render.attachNewNode(ActorNode('yolkyNP')) avatarNP.reparentTo(base.render) # by the way: this time we wont use the same old smiley but a 2d guy for this snippet purposes only - it is just a plane with a texture glued on, a so 2d object then. avatar = loader.loadModel('yolky') avatar.reparentTo(avatarNP) # why this? this is to have our flat puppet rendered always on top of all objects in the scene, either 2d and 3d. avatar.setDepthWrite(True, 100) # the rest of the stuff is as usual... avatar.setPos(0, 0, 1) avatar.setCollideMask(BitMask32.allOff()) avatarNP.setPos(0, 0, 15) # The yolky collision sphere used to detect when yolky hits walls avatarCollider = avatar.attachNewNode(CollisionNode('yolkycnode')) avatarCollider.node().addSolid(CollisionSphere(0, 0, 0, 1)) avatarCollider.node().setFromCollideMask(WALL_MASK) avatarCollider.node().setIntoCollideMask(BitMask32.allOff())
#========================================================================= #** Collision system ignition base.cTrav = CollisionTraverser() #** The floor collision handler - all stuff explained in step3 avatarFloorHandler = CollisionHandlerGravity() avatarFloorHandler.setGravity(9.81 + 25) avatarFloorHandler.setMaxVelocity(100) #** Collision masks FLOOR_MASK = BitMask32.bit(1) MASK_OFF = BitMask32.allOff() #** Our steering avatar avatarNP = base.render.attachNewNode(ActorNode('smileyNP')) avatarNP.reparentTo(base.render) avatar = loader.loadModel('smiley') avatar.reparentTo(avatarNP) avatar.setPos(0, 0, 1) avatar.setCollideMask(MASK_OFF) avatarNP.setPos(0, 0, 15) #** Stick and set the ray collider to the avatar raygeometry = CollisionRay(0, 0, 2, 0, 0, -1) avatarRay = avatarNP.attachNewNode(CollisionNode('avatarRay')) avatarRay.node().addSolid(raygeometry) # let's mask our floor FROM collider avatarRay.node().setFromCollideMask(FLOOR_MASK) avatarRay.node().setIntoCollideMask(MASK_OFF)