Advertisement
Guest User

Untitled

a guest
Apr 3rd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.46 KB | None | 0 0
  1. import direct.directbase.DirectStart
  2. from direct.actor.Actor import Actor
  3. from direct.fsm.FSM import FSM
  4. from panda3d.core import *
  5. from direct.gui.OnscreenText import OnscreenText
  6. from direct.task.Task import Task
  7. from direct.interval.IntervalGlobal import Sequence
  8. import sys
  9.  
  10. class Game(object):
  11.     """
  12.        This is a very simple FPS like -
  13.         a building block of any game i guess
  14.    """
  15.     def __init__(self):
  16.  
  17.         props = WindowProperties()
  18.         props.setCursorHidden(True)
  19.         base.win.requestProperties(props)
  20.         """ create a FPS type game """
  21.         self.initCollision()
  22.         self.loadLevel()
  23.         self.initPlayer()
  24.         base.accept( "escape" , sys.exit)
  25.         base.disableMouse()
  26.        
  27.        
  28.     def initCollision(self):
  29.         """ create the collision system """
  30.         base.cTrav = CollisionTraverser()
  31.         base.pusher = CollisionHandlerPusher()
  32.        
  33.     def loadLevel(self):
  34.         """ load the self.level
  35.            must have
  36.            <Group> *something* {
  37.              <Collide> { Polyset keep descend }
  38.            in the egg file
  39.        """
  40.         self.level = loader.loadModel('level2.egg')
  41.         self.level.setPos(0,0,0)
  42.         self.level.reparentTo(render)
  43.         self.level.setTwoSided(True)
  44.  
  45.         self.door = loader.loadModel('door.egg')
  46.         self.door.setPos(0, 0, 0)
  47.         self.door.reparentTo(render)
  48.         self.door.setTwoSided(True)
  49.  
  50.        
  51.              
  52.     def initPlayer(self):
  53.         """ loads the player and creates all the controls for him"""
  54.         self.player = Player(self)
  55.        
  56.         #base.pusher.addCollider(self.door, self.node)
  57.  
  58.  
  59. class Player(object):
  60.     """
  61.        Player is the main actor in the fps game
  62.    """
  63.     speed = 50
  64.     FORWARD = Vec3(0,2,0)
  65.     BACK = Vec3(0,-1,0)
  66.     LEFT = Vec3(-1,0,0)
  67.     RIGHT = Vec3(1,0,0)
  68.     STOP = Vec3(0)
  69.     walk = STOP
  70.     strafe = STOP
  71.     readyToJump = False
  72.     jump = 0
  73.    
  74.     def __init__(self, game):
  75.         self.game = game
  76.         """ inits the player """
  77.         self.loadModel()
  78.         self.setUpCamera()
  79.         self.createCollisions()
  80.         self.attachControls()
  81.         # init mouse update task
  82.         taskMgr.add(self.mouseUpdate, 'mouse-task')
  83.         taskMgr.add(self.moveUpdate, 'move-task')
  84.         taskMgr.add(self.jumpUpdate, 'jump-task')
  85.        
  86.         self.pickerHandler = CollisionHandlerQueue()  # Make a handler
  87.         self.pickerNode = CollisionNode('mouseRay')
  88.         self.pickerNP = camera.attachNewNode(self.pickerNode)
  89.         self.pickerNode.setFromCollideMask(GeomNode.getDefaultCollideMask())
  90.         self.pickerRay = CollisionRay()
  91.         self.pickerNode.addSolid(self.pickerRay)
  92.          # Register the ray as something that can cause collisions
  93.         base.cTrav.addCollider(self.pickerNP, self.pickerHandler)
  94.  
  95.     def loadModel(self):
  96.         """ make the nodepath for player """
  97.         self.node = NodePath('player')
  98.         self.node.reparentTo(render)
  99.         self.node.setPos(0,0,20)
  100.         self.node.setScale(.1)
  101.         self.gun = Actor('GunTest.egg', {
  102.             'fire1': 'GunTest-fire1.egg',
  103.             })
  104.         self.gun.setPos(3, 5, -1.5)
  105.         self.gun.setH(-80)
  106.         self.gun.reparentTo(base.camera)
  107.    
  108.     def setUpCamera(self):
  109.         """ puts camera at the players node """
  110.         pl =  base.cam.node().getLens()
  111.         pl.setFov(90)
  112.         base.cam.node().setLens(pl)
  113.         base.camera.reparentTo(self.node)
  114.        
  115.     def createCollisions(self):
  116.         """ create a collision solid and ray for the pllayer """
  117.         cn = CollisionNode('player')
  118.         cn.addSolid(CollisionTube(0,0,0,0,.1,0,.1))
  119.         solid = self.node.attachNewNode(cn)
  120.         base.cTrav.addCollider(solid, base.pusher)
  121.         base.pusher.addCollider(solid, self.node, base.drive.node())
  122.  
  123.         # init players floor collisions
  124.         ray = CollisionRay()
  125.         ray.setOrigin(0,0,20)
  126.         ray.setDirection(0,0,-1)
  127.         cn = CollisionNode('playerRay')
  128.         cn.addSolid(ray)
  129.         solid = self.node.attachNewNode(cn)
  130.         self.nodeGroundHandler = CollisionHandlerQueue()
  131.         base.cTrav.addCollider(solid, self.nodeGroundHandler)
  132.         base.cTrav.showCollisions(render)
  133.        
  134.     def attachControls(self):
  135.         """ attach key events """
  136.         base.accept( "space" , self.__setattr__,["readyToJump",True])
  137.         base.accept( "space-up" , self.__setattr__,["readyToJump",False])
  138.         base.accept( "s" , self.__setattr__,["walk",self.STOP] )
  139.         base.accept( "w" , self.__setattr__,["walk",self.FORWARD])
  140.         base.accept( "s" , self.__setattr__,["walk",self.BACK] )
  141.         base.accept( "s-up" , self.__setattr__,["walk",self.STOP] )
  142.         base.accept( "w-up" , self.__setattr__,["walk",self.STOP] )
  143.         base.accept( "a" , self.__setattr__,["strafe",self.LEFT])
  144.         base.accept( "d" , self.__setattr__,["strafe",self.RIGHT] )
  145.         base.accept( "a-up" , self.__setattr__,["strafe",self.STOP] )
  146.         base.accept( "d-up" , self.__setattr__,["strafe",self.STOP] )
  147.         base.accept("mouse1", self.mouseHandler)
  148.         base.accept( "e" , self.doorHandler)
  149.         base.accept( "f", self.jerkCamera)
  150.    
  151.     def jerkCamera(self):
  152.         if base.camera.getP() < 80:
  153.             base.camera.setP(base.camera.getP()+10)
  154.  
  155.     def doorHandler(self):
  156.         mpos = base.mouseWatcherNode.getMouse()
  157.         self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
  158.  
  159.         base.cTrav.traverse(render)
  160.        
  161.         if self.pickerHandler.getNumEntries() > 0:
  162.             # This is so we get the closest object
  163.             self.pickerHandler.sortEntries()
  164.             pickedObj = self.pickerHandler.getEntry(0).getIntoNodePath()
  165.         render.ls()
  166.         print (pickedObj.getH())
  167.         print (pickedObj.getName())
  168.         if pickedObj.getParent().getH() >= 90:
  169.             doorHprInterval2 = pickedObj.getParent().hprInterval(1, Point3(0, 0, 0), startHpr=Point3(90,0,0))
  170.             doorHprInterval2.start()
  171.             print ("Used interval 1")
  172.         else:
  173.             doorHprInterval1 = pickedObj.getParent().hprInterval(1,
  174.                                                         Point3(90, 0, 0),
  175.                                                         startHpr=Point3(0, 0, 0))
  176.             doorHprInterval1.start()
  177.         print ("Used Interval 2")
  178.        
  179.  
  180.  
  181.     def mouseHandler(self):
  182.         print ("Mouse handler")
  183.         self.gun.play('fire1')
  184.         mpos = base.mouseWatcherNode.getMouse()
  185.         self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
  186.         base.cTrav.traverse(render)
  187.         if self.pickerHandler.getNumEntries() > 0:
  188.             # This is so we get the closest object
  189.             self.pickerHandler.sortEntries()
  190.             pickedObj = self.pickerHandler.getEntry(0).getIntoNodePath()
  191.             pickedObj.ls()
  192.  
  193.     def mouseUpdate(self,task):
  194.         """ this task updates the mouse """
  195.         md = base.win.getPointer(0)
  196.         x = md.getX()
  197.         y = md.getY()
  198.         if base.win.movePointer(0, int(base.win.getXSize()/2), int(base.win.getYSize()/2)):
  199.             self.node.setH(self.node.getH() -  (x - base.win.getXSize()/2)*0.1)
  200.             base.camera.setP(base.camera.getP() - (y - base.win.getYSize()/2)*0.1)
  201.         return task.cont
  202.    
  203.     def moveUpdate(self,task):
  204.         """ this task makes the player move """
  205.         # move where the keys set it
  206.         self.node.setPos(self.node,self.walk*globalClock.getDt()*self.speed)
  207.         self.node.setPos(self.node,self.strafe*globalClock.getDt()*self.speed)
  208.         return task.cont
  209.        
  210.     def jumpUpdate(self,task):
  211.         """ this task simulates gravity and makes the player jump """
  212.         # get the highest Z from the down casting ray
  213.         highestZ = -900
  214.         for i in range(self.nodeGroundHandler.getNumEntries()):
  215.             entry = self.nodeGroundHandler.getEntry(i)
  216.             z = entry.getSurfacePoint(render).getZ()
  217.             if z > highestZ and entry.getIntoNode().getName() == "Cube":
  218.                 highestZ = z
  219.         # gravity effects and jumps
  220.         self.node.setZ(self.node.getZ()+self.jump*globalClock.getDt())
  221.         self.jump -= 20*globalClock.getDt()
  222.         if highestZ > self.node.getZ()-1:
  223.             self.jump = 0
  224.             self.node.setZ(highestZ+1)
  225.             if self.readyToJump:
  226.                 self.jump = 7
  227.         return task.cont
  228.  
  229. Game()
  230. base.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement