def __init__(self, x, y, z): self.model = loader.loadModel("models/circle") self.model.reparentTo(render) self.model.setPos(x, y, z) self.model.setHpr(0, 0, 0) self.model.setColor(1, 1, 1, 1) self.model.setTexture(loader.loadTexture('textures/spiral.png')) self.glow = loader.loadModel("models/tube") self.glow.reparentTo(render) self.glow.setShaderOff() self.glow.setLightOff() self.glow.hide(BitMask32.allOn()) self.glow.show(BitMask32(0x01)) self.glow.setPos(x, y, z + 0.05) self.glow.setHpr(0, 0, 0) self.glow.setColor(1, 1, 1, 1) texture = loader.loadTexture('textures/green_glow.png') texture.setWrapU(Texture.WMClamp) texture.setWrapV(Texture.WMClamp) self.glow.setTexture(texture) self.glow.setTransparency(TransparencyAttrib.MAlpha) self._active = False self.visibility = 0 taskMgr.add(self._update_task, "AcceleratorUpdateTask")
def __init__(self, render, world, base, originMap, hopper, idNum, strength = 1, size = 1.2): self.render = render self.world = world self.base = base self.originMap = originMap self.hopper = hopper self.idNum = idNum self.strength = strength self.size = size self.volume = 1 self.turned = False self.isAttacking = False self.mult = 1 self.attackSound = self.base.loader.loadSfx("sounds/bloodSquirt.mp3") self.attackSound.setVolume(1) self.damageSound = self.base.loader.loadSfx("sounds/swordSlash.mp3") self.damageSound.setVolume(0.5) self.freeze = False #----- Setup Enemy ----- h = 2.75 w = self.size + 0.2 enemyShape = BulletCapsuleShape(w, h - 2 * w, ZUp) self.enemyBulletNode = BulletCharacterControllerNode(enemyShape, 0.4, "Enemy") self.enemyNP = self.render.attachNewNode(self.enemyBulletNode) self.enemyNP.setPos(originMap) self.enemyNP.setH(90) self.enemyNP.setCollideMask(BitMask32.allOn()) self.world.attachCharacter(self.enemyBulletNode) self.enemyModel = Actor("models/art/monster/bvw-f2004--monster/monster1.egg", { 'idle' : 'models/art/monster/bvw-f2004--monster/monster1-idle.egg', 'explode' : 'models/art/monster/bvw-f2004--monster/monster1-explode.egg', 'attackL' : 'models/art/monster/bvw-f2004--monster/monster1-pincer-attack-left.egg', 'attackR' : 'models/art/monster/bvw-f2004--monster/monster1-pincer-attack-right.egg', 'attackT' : 'models/art/monster/bvw-f2004--monster/monster1-tentacle-attack.egg', 'attackLR' : 'models/art/monster/bvw-f2004--monster/monster1-pincer-attack-both.egg'}) self.enemyModel.reparentTo(self.enemyNP) self.enemyModel.setScale(0.42 * self.size) self.enemyModel.setH(180) self.enemyModel.setPos(0, 0, 1) self.enemyModel.loop("idle") #self.setupPoison() self.enemyCollider = self.enemyModel.attachNewNode(CollisionNode('enemyNode')) self.enemyCollider.node().addSolid(CollisionSphere(0, 0, 0, 1)) self.enemyCollider.setTag("id", str(self.idNum))
def __setupEnvironment(self): cm = CardMaker("ground") size = 200 cm.setFrame(-size, size, -size, size) environment = render.attachNewNode(cm.generate()) environment.lookAt(0, 0, -1) environment.setPos(100, -100, 0) environment.setCollideMask(BitMask32.allOn()) environment.reparentTo(render) texture = loader.loadTexture("textures/ground.png") # This is so the textures can look better from a distance texture.setMinfilter(Texture.FTLinearMipmapLinear) environment.setTexGen(TextureStage.getDefault(), TexGenAttrib.MWorldPosition) environment.setTexScale(TextureStage.getDefault(), 0.02, 0.02) environment.setTexture(texture, 1)
def __setupEnvironment(self): cm = CardMaker("ground") size = 100 cm.setFrame(-size, size, -size, size) environment = render.attachNewNode(cm.generate()) environment.lookAt(0, 0, -1) environment.setPos(0, 0, 0) environment.setCollideMask(BitMask32.allOn()) environment.reparentTo(render) texture = loader.loadTexture("textures/ground.png") # This is so the textures can look better from a distance texture.setMinfilter(Texture.FTLinearMipmapLinear) environment.setTexGen(TextureStage.getDefault(), TexGenAttrib.MWorldPosition) environment.setTexScale(TextureStage.getDefault(), 0.02, 0.02) environment.setTexture(texture, 1)
class GameObject: bitmaskAll = BitMask32.allOn() bitmaskDefault = BitMask32.bit(0) bitmaskBullet = BitMask32.bit(1) bitmaskCharacter = BitMask32.bit(2) bitmaskBox = BitMask32.bit(3) bitmaskTileGlued = BitMask32.bit(4) bitmaskTile = BitMask32.bit(5) def __init__(self, world): world.addObject(self) self.world = world self.body = None self.geom = None self.node = None self.active = True self.visibleAfterDestroy = False self.dissipateCountdown = 0 def updatePosFromPhysics(self): if self.body != None: self.node.setPosQuat(render, self.body.getPosition(), Quat(self.body.getQuaternion())) def getMomentum(self): mass = self.body.getMass().getMagnitude() speed = self.body.getLinearVel().length() return mass * speed def dissipate(self, factor, interval=5): if self.body == None or self.dissipateCountdown > 0: return self.body.setLinearVel(self.body.getLinearVel() * factor) self.body.setAngularVel(self.body.getAngularVel() * factor) self.dissipateCountdown = interval + 1 self.dissipateRecover() def dissipateRecover(self): self.dissipateCountdown -= 1 if self.dissipateCountdown > 0: self.world.performAfterStep(self.dissipateRecover, []) def onCollision(self, otherBody, entry): pass def destroy(self): self.active = False self.world.removeObject(self) def doDestroy(self): if self.node != None and not self.visibleAfterDestroy: self.node.detachNode() if self.geom != None: self.geom.disable() if self.body != None: self.body.disable() return # This is the code that actually removes the elements instead of just disabling them. # But it doesn't work. obj = self print obj #DEBUG print threading.current_thread() #DEBUG print "0", #DEBUG if obj.node != None: obj.node.detachNode() obj.node = None print "1", #DEBUG if obj.geom != None: self.world.space.remove(obj.geom) #Probably unnecessary print "2", #DEBUG if obj.geom != None: obj.geom.destroy() obj.geom = None print "3", #DEBUG if obj.body != None: obj.body.destroy() obj.body = None print "4" #DEBUG
def __init__(self): self.keyMap = {"left":0, "right":0, "forward":0, "backward":0, "shoot":0} base.win.setClearColor(Vec4(0,0,0,1)) # Post the instructions self.inst6 = addInstructions(0.95, "Mad Max's Revenge!") self.inst1 = addInstructions(0.90, "[ESC]: Quit") self.inst2 = addInstructions(0.85, "[a]: Left Turn") self.inst3 = addInstructions(0.80, "[d]: Right Turn") self.inst4 = addInstructions(0.75, "[w]: Drive Forward") self.inst4 = addInstructions(0.70, "[s]: Reverse") self.inst5 = addInstructions(0.65, "[mouse]: Fire Rocket") # 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("Assets/Models/env") #models/environment self.environ.reparentTo(render) self.environ.setPos(0,0,0) self.sky = loader.loadModel("Assets/Models/sky") #models/environment self.sky.reparentTo(render) self.sky.setPos(0,0,0) # Create the main character, player playerStartPos = Point3(8,14,1) #self.environ.find("**/start_point").getPos() enemyStartPos = Point3(-7,-8,1) #self.environ.find("**/start_point").getPos() #~ print enemyStartPos enemyStartPos.addX(1.0) enemyStartPos.addY(1.0) #~ print enemyStartPos self.player = Actor("Assets/Models/player_model", {"drive":"Assets/Models/player_drive", "fire":"Assets/Models/player_turret", "drivefire":"Assets/Models/player_both"}) self.player.reparentTo(render) self.player.setScale(0.1) self.player.setPos(playerStartPos) #~ self.playerdrive=self.player.actorInterval("drive") #~ self.playerfire=self.player.actoraaaaaaaInterval("fire") #~ self.playerdrivefire=self.player.actorInterval("drivefire") # Create the enemy, Enemy self.enemy = Actor("Assets/Models/enemy_model", {"drive":"Assets/Models/enemy_drive", "fire":"Assets/Models/enemy_turret", "drivefire":"Assets/Models/enemy_both"}) self.enemy.reparentTo(render) self.enemy.setScale(0.1) tex = loader.loadTexture("Assets/Models/cartexture1.png") self.enemy.setTexture(tex, 1) self.enemy.setPos(enemyStartPos) self.enemyrockettiming = globalClock.getFrameTime() #print self.enemy.getCurrentAnim() #print self.enemy.getCurrentAnim() #~ self.enemydrive=self.enemy.actorInterval("drive") #~ self.enemyfire=self.enemy.actorInterval("fire") #~ self.enemydrivefire=self.enemy.actorInterval("drivefire") self.music = loader.loadMusic("Assets/Sound/music.mp3") SoundInterval(self.music).loop() audio3d.attachSoundToObject(EnemyRunning, self.enemy) audio3d.attachSoundToObject(EnemyIdling, self.enemy) backward = self.enemy.getNetTransform().getMat().getRow3(1) backward.setZ(0) backward.normalize() #self.enemy.setPos(self.enemy.getPos() - backward*(50)) #Set up the lighting self.playerleftlight=self.player.attachNewNode(Spotlight("playerheadleft")) self.playerleftlight.node().setColor(Vec4(0.75, 0.75, 0.75, 1)) self.playerleftlight.node().setLens( PerspectiveLens() ) self.playerleftlight.node().getLens().setFov( 50, 50) self.playerleftlight.node().setAttenuation( Vec3( 0.1, 0.005, 0.0 ) ) self.playerleftlight.node().setExponent( 60.0 ) self.playerleftlight.setPos(-1, -0.1, 1.5) self.playerleftlight.setHpr(180, -10, 0) render.setLight(self.playerleftlight) self.playerrightlight=self.player.attachNewNode(Spotlight("playerheadright")) self.playerrightlight.node().setColor(Vec4(0.75, 0.75, 0.75, 1)) self.playerrightlight.node().setLens( PerspectiveLens() ) self.playerrightlight.node().getLens().setFov( 50, 50) self.playerrightlight.node().setAttenuation( Vec3( 0.1, 0.005, 0.0 ) ) self.playerrightlight.node().setExponent( 60.0 ) self.playerrightlight.setPos(1, -0.1, 1.5) self.playerrightlight.setHpr(180, -10, 0) render.setLight(self.playerrightlight) self.playerlightson=1 self.enemyleftlight=self.enemy.attachNewNode(Spotlight("enemyheadleft")) self.enemyleftlight.node().setColor(Vec4(0.75, 0.75, 0.75, 1)) self.enemyleftlight.node().setLens( PerspectiveLens() ) self.enemyleftlight.node().getLens().setFov( 50, 50) self.enemyleftlight.node().setAttenuation( Vec3( 0.1, 0.005, 0.0 ) ) self.enemyleftlight.node().setExponent( 60.0 ) self.enemyleftlight.setPos(-1, -0.1, 1.5) self.enemyleftlight.setHpr(180, -10, 0) render.setLight(self.enemyleftlight) self.enemyrightlight=self.enemy.attachNewNode(Spotlight("enemyheadright")) self.enemyrightlight.node().setColor(Vec4(0.75, 0.75, 0.75, 1)) self.enemyrightlight.node().setLens( PerspectiveLens() ) self.enemyrightlight.node().getLens().setFov( 50, 50) self.enemyrightlight.node().setAttenuation( Vec3( 0.1, 0.005, 0.0 ) ) self.enemyrightlight.node().setExponent( 60.0 ) self.enemyrightlight.setPos(1, -0.1, 1.5) self.enemyrightlight.setHpr(180, -10, 0) render.setLight(self.enemyrightlight) self.enemylightson=1 self.spotlight=camera.attachNewNode(PointLight("spotlight")) #self.spotlight.setPos(0, 3, 0.5) #self.spotlight.setHpr(0, 0, 0) self.spotlight.node().setColor(Vec4(1, 1, 1, 1)) #self.spotlight.node().setLens( PerspectiveLens() ) #self.spotlight.node().getLens().setFov( 180, 120) self.spotlight.node().setAttenuation( Vec3( 1, 0, 0.05 )) #self.spotlight.node().setExponent( 60.0 ) render.setLight(self.spotlight) self.playerlight=self.player.attachNewNode(PointLight("spotlight")) self.playerlight.node().setColor(Vec4(1, 1, 1, 1)) #self.spotlight.node().setLens( PerspectiveLens() ) #self.spotlight.node().getLens().setFov( 180, 120) self.playerlight.node().setAttenuation( Vec3( 1, 0, 0.05 )) #self.spotlight.node().setExponent( 60.0 ) render.setLight(self.playerlight) self.ambientlight=self.sky.attachNewNode(AmbientLight("ambientLight")) self.ambientlight.node().setColor(Vec4(1, 1, 1, 1)) self.sky.setLight(self.ambientlight) # 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("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("l", self.playerLights,[]) self.accept("mouse1", self.setKey, ["shoot", 1]) self.accept("mouse1-up", self.setKey, ["shoot", 0]) #self.shootRocketshootRocket taskMgr.add(self.playerMove,"moveTask") taskMgr.add(self.enemyMove,"moveTask") taskMgr.add(self.shoot,"shootTask") taskMgr.add(self.rocketCollision,"rocketCollision") # Game state variables self.prevtime = 0 self.isMoving = False self.prevShotTime = 0 self.prevEnemyMoveTime = 0 # Set up the camera base.disableMouse() base.camera.setPos(self.player.getX(),self.player.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 player'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.playerGroundRay = CollisionRay() self.playerGroundRay.setOrigin(0,0,1000) self.playerGroundRay.setDirection(0,0,-1) self.playerGroundCol = CollisionNode('playerRay') self.playerGroundCol.addSolid(self.playerGroundRay) self.playerGroundCol.setFromCollideMask(BitMask32.bit(3)) self.playerGroundCol.setIntoCollideMask(BitMask32.allOff()) self.playerGroundColNp = self.player.attachNewNode(self.playerGroundCol) self.playerGroundHandler = CollisionHandlerQueue() self.cTrav.addCollider(self.playerGroundColNp, self.playerGroundHandler) 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(3)) 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.playerGroundColNp.show() #self.camGroundColNp.show() #Uncomment this line to show a visual representation of the #collisions occuring #self.cTrav.showCollisions(render) #Code for Enemy player self.enemyGroundRay = CollisionRay() self.enemyGroundRay.setOrigin(0,0,1000) self.enemyGroundRay.setDirection(0,0,-1) self.enemyGroundCol = CollisionNode('enemyRay') self.enemyGroundCol.addSolid(self.enemyGroundRay) self.enemyGroundCol.setFromCollideMask(BitMask32.bit(3)) self.enemyGroundCol.setIntoCollideMask(BitMask32.allOff()) self.enemyGroundColNp = self.enemy.attachNewNode(self.enemyGroundCol) self.enemyGroundHandler = CollisionHandlerQueue() self.cTrav.addCollider(self.enemyGroundColNp, self.enemyGroundHandler) self.cRocketHandler = CollisionHandlerQueue() self.worldEdge = CollisionInvSphere(0, 0, 0, 50) cNode = CollisionNode("worldEdge") cNode.addSolid(self.worldEdge) cNode.setFromCollideMask(BitMask32.allOff()) cNode.setIntoCollideMask(BitMask32.allOn()) self.worldEdgeNp=self.environ.attachNewNode(cNode) #self.cTrav.addCollider(self.worldEdgeNp, self.cRocketHandler) #cNP = render.attachNewNode(cNode) cNode2 = CollisionNode("wall") cNode2.addSolid(CollisionPlane(Plane(Vec3(-1,0,0), Point3(22.5,0,0)))) cNode2.addSolid(CollisionPlane(Plane(Vec3(1,0,0), Point3(-22.5,0,0)))) cNode2.addSolid(CollisionPlane(Plane(Vec3(0,-1,0), Point3(0,22.5,0)))) cNode2.addSolid(CollisionPlane(Plane(Vec3(0,1,0), Point3(0,-22.5,0)))) cNode2.setFromCollideMask(BitMask32.allOff()) cNode2.setIntoCollideMask(BitMask32.allOn()) cNP2=self.environ.attachNewNode(cNode2) 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.allOn()) self.pickerRay = CollisionRay() #Make our ray self.pickerNode.addSolid(self.pickerRay) #Add it to the collision node #Register the ray as something that can cause collisions self.picker.addCollider(self.pickerNP, self.pq) self.playerrocket = None self.enemyrocket = None self.enemyTurn = 0 self.enemyDestAng = 180 self.enemyHp = 3 self.playerHp = 3 #Collisions self.setupCollisions() self.playermoving = False #setup hud self.drawHud()
from pandac.PandaModules import CollisionRay from pandac.PandaModules import CollisionHandlerQueue from pandac.PandaModules import CollisionTraverser from pandac.PandaModules import GeomNode from pandac.PandaModules import LineSegs from pandac.PandaModules import NodePath from pandac.PandaModules import Point3 from pandac.PandaModules import Vec3 import math from math import sqrt wallRayNP = render.attachNewNode(CollisionNode("wall ray collision node")) wallRayNP.node().addSolid(CollisionRay(0,0,0,0,1,0)) wallRayNP.node().setIntoCollideMask(BitMask32.allOff()) wallRayNP.node().setFromCollideMask(BitMask32.allOn() & ~GeomNode.getDefaultCollideMask()) wallRayNP.node().setFromCollideMask(wallRayNP.node().getFromCollideMask() & ~BitMask32.bit(1)) #wallRayNP.show() collisionHandler = CollisionHandlerQueue() collisionTraverser = CollisionTraverser("pathfinder's collisionTraverser") collisionTraverser.addCollider(wallRayNP, collisionHandler) collisionTraverser.setRespectPrevTransform(True) class PathFinder(): ## def __init__(self, position, ID = -1): ## NodePath.__init__(self, "Waypoint") ## self.position = position ## self.texture = loader.loadTexture("textures/blue.jpg") ## self.costToThisNode = 0