コード例 #1
0
    def __init__(self):
        self.line_dir = NodePath()

        base.cTrav = CollisionTraverser()
        self.col_handler = CollisionHandlerEvent()

        picker_node = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(picker_node)
        self.pickerRay = CollisionRay()
        picker_node.addSolid(self.pickerRay)

        plane_node = CollisionNode("base_plane")
        plane = base.render.attachNewNode(plane_node)
        self.plane_col = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        picker_node.addSolid(self.pickerRay)

        picker_node.setTag("rays", "mray")
        base.cTrav.addCollider(pickerNPos, self.col_handler)

        self.col_handler.addInPattern("%(rays)ft-into-%(type)it")
        self.col_handler.addOutPattern("%(rays)ft-out-%(type)it")
        self.col_handler.addAgainPattern("ray_again_all%("
                                         "rays"
                                         ")fh%("
                                         "type"
                                         ")ih")

        self.model = loader.loadModel("../models/chest.egg")
        self.model_node = NodePath("sdfafd")
        self.model.reparentTo(self.model_node)
        self.model_node.reparentTo(render)
        #
        #        self.text_node = TextNode("battle_text")
        #        self.text_node.setText("TEXTYTEXTYTEXTTEXT")
        #        self.text_node_path = render.attachNewNode(self.text_node)
        #        self.text_node_path.reparentTo(render)
        #        self.text_node_path.setPos(0,0,4)
        #        self.text_node_path.setHpr(0,0,0)
        #        self.text_node_path.setScale(1)
        #        #self.text_node_path.setTransparency(TransparencyAttrib.MAlpha)
        #        self.text_node.setTextColor((1,1,1,1))
        #        self.text_node.setAlign(TextNode.ALeft)

        self.placement_ghost = EditorObjects.PlacementGhost(
            0, "tower", base.object_scale)

        z = 0
        self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))

        taskMgr.add(self.ray_update, "updatePicker")
        taskMgr.add(self.get_mouse_plane_pos, "MousePositionOnPlane")
        taskMgr.add(self.task_mouse_press_check, "checkMousePress")

        self.input_init()

        self.pickable = None
コード例 #2
0
    def __init__(self, tileMap):
        self._tileMap = tileMap
        self._groundPlane = Plane(Point3(0, 0, 1), Point3(0, 0, 1))
        self._hoveredCoord = None  # The coordinates we are hovering over.
        self._highlightMode = None  # Targeter reference
        self._highlightModeParams = None  # Targeter params dict
        self._highlightedTiles = list()  # List of tile highlighted by pointer.
        self._previewTiles = list()  # List of tiles highlighted by preview.

        # Perform mouse raycasting every frame:
        taskMgr.add(self._updateHovered, "mouseScanning")
コード例 #3
0
ファイル: mos.py プロジェクト: UIKit0/Dota2War
class YourClass(ShowBase): 
  def __init__(self): 
    ShowBase.__init__(self) 
    self.disableMouse()
    self.pos3d=None
    self.nearPoint=None
    self.farPoint=None 
    self.camera.setPos(0, 60, 25) 
    self.camera.lookAt(0, 0, 0) 
    z = 0 
    self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z)) 
    self.model = loader.loadModel("ralph") 
    self.model.reparentTo(render) 
    self.accept("mouse1",self.set)
    taskMgr.add(self.__getMousePos, "_YourClass__getMousePos") 
  
  def __getMousePos(self, task): 
    if base.mouseWatcherNode.hasMouse(): 
      mpos = base.mouseWatcherNode.getMouse() 
      self.pos3d = Point3() 
      self.nearPoint = Point3() 
      self.farPoint = Point3() 
      base.camLens.extrude(mpos, self.nearPoint, self.farPoint) 
      if self.plane.intersectsLine(self.pos3d, 
          render.getRelativePoint(camera, self.nearPoint), 
          render.getRelativePoint(camera, self.farPoint)): 
        print "Mouse ray intersects ground plane at ", self.pos3d 
       # self.model.setPos(render, pos3d) 
    return task.again 
  def set(self):
      self.model.setPos(render, self.pos3d) 
コード例 #4
0
    def load(self):
        CogdoGameMovie.load(self)
        self.toonDNA = ToonDNA.ToonDNA()
        self.toonDNA.newToonFromProperties('dss', 'ss', 'm', 'm', 2, 0, 2, 2,
                                           1, 8, 1, 8, 1, 14)
        self.toonHead = Toon.Toon()
        self.toonHead.setDNA(self.toonDNA)
        self.makeSuit('sc')
        self.toonHead.getGeomNode().setDepthWrite(1)
        self.toonHead.getGeomNode().setDepthTest(1)
        self.toonHead.loop('neutral')
        self.toonHead.setPosHprScale(-0.73, 0, -1.27, 180, 0, 0, 0.18, 0.18,
                                     0.18)
        self.toonHead.reparentTo(hidden)
        self.toonHead.startBlink()
        self.cogHead = Suit.Suit()
        self.cogDNA = SuitDNA.SuitDNA()
        self.cogDNA.newSuit('le')
        self.cogHead.setDNA(self.cogDNA)
        self.cogHead.getGeomNode().setDepthWrite(1)
        self.cogHead.getGeomNode().setDepthTest(1)
        self.cogHead.loop('neutral')
        self.cogHead.setPosHprScale(-0.74, 0, -1.79, 180, 0, 0, 0.12, 0.14,
                                    0.14)
        self.cogHead.reparentTo(hidden)
        self.clipPlane = self.toonHead.attachNewNode(PlaneNode('clip'))
        self.clipPlane.node().setPlane(Plane(0, 0, 1, 0))
        self.clipPlane.setPos(0, 0, 2.45)
        audioMgr = base.cogdoGameAudioMgr
        self._cogDialogueSfx = audioMgr.createSfx('cogDialogue')
        self._toonDialogueSfx = audioMgr.createSfx('toonDialogue')

        def start():
            camera.wrtReparentTo(render)
            self._startUpdateTask()

        def end():
            self._stopUpdateTask()

        introDuration = Globals.Gameplay.IntroDurationSeconds
        dialogue = TTLocalizer.CogdoFlyingIntroMovieDialogue
        waitDur = introDuration / len(dialogue)
        flyDur = introDuration - waitDur * 0.5
        flyThroughIval = Parallel(
            camera.posInterval(flyDur,
                               self._exit.getPos(render) + Point3(0, -22, 1),
                               blendType='easeInOut'),
            camera.hprInterval(flyDur, Point3(0, 5, 0), blendType='easeInOut'))
        self._ival = Sequence(
            Func(start),
            Parallel(
                flyThroughIval,
                Sequence(
                    Func(self.displayLine, 'cog',
                         self._getRandomLine(dialogue[0])), Wait(waitDur),
                    Func(self.displayLine, 'toon',
                         self._getRandomLine(dialogue[1])), Wait(waitDur),
                    Func(self.displayLine, 'cog',
                         self._getRandomLine(dialogue[2])), Wait(waitDur))),
            Func(end))
コード例 #5
0
    def load(self):
        self.notify.debug('load()')
        CogdoGameMovie.load(self)
        backgroundGui = loader.loadModel('phase_5/models/cogdominium/tt_m_gui_csa_flyThru') # Dialogue Box
        self.bg = backgroundGui.find('**/background')
        self.chatBubble = backgroundGui.find('**/chatBubble')
        self.chatBubble.setScale(6.5, 6.5, 7.2999999999999998)
        self.chatBubble.setPos(0.32000000000000001, 0, -0.78000000000000003)
        self.bg.setScale(5.2000000000000002)
        self.bg.setPos(0.14000000000000001, 0, -0.66669999999999996)
        self.bg.reparentTo(aspect2d)
        self.chatBubble.reparentTo(aspect2d)
        self.frame = DirectFrame(geom = self.bg, relief = None, pos = (0.20000000000000001, 0, -0.66669999999999996))
        self.bg.wrtReparentTo(self.frame)
        self.gameTitleText = DirectLabel(parent = self.frame, text = TTLocalizer.CogdoExecutiveSuiteTitle, scale = TTLocalizer.MRPgameTitleText * 0.80000000000000004, text_align = TextNode.ACenter, text_font = getSignFont(), text_fg = (1.0, 0.33000000000000002, 0.33000000000000002, 1.0), pos = TTLocalizer.MRgameTitleTextPos, relief = None)
        self.chatBubble.wrtReparentTo(self.frame)
        self.frame.hide()
        backgroundGui.removeNode()
        self.toonDNA = ToonDNA.ToonDNA()
        self.toonDNA.newToonFromProperties('dss', 'ss', 'm', 'm', 2, 0, 2, 2, 1, 8, 1, 8, 1, 14) # Lowdens DNA
        self.toonHead = Toon.Toon()
        self.toonHead.setDNA(self.toonDNA)
        self.makeSuit('sc')
        self.toonHead.getGeomNode().setDepthWrite(1)
        self.toonHead.getGeomNode().setDepthTest(1)
        self.toonHead.loop('neutral')
        self.toonHead.setPosHprScale(-0.72999999999999998, 0, -1.27, 180, 0, 0, 0.17999999999999999, 0.17999999999999999, 0.17999999999999999)
        self.toonHead.reparentTo(hidden)
        self.toonHead.startBlink()
        self.clipPlane = self.toonHead.attachNewNode(PlaneNode('clip'))
        self.clipPlane.node().setPlane(Plane(0, 0, 1, 0))
        self.clipPlane.setPos(0, 0, 2.4500000000000002)
        self._toonDialogueSfx = loader.loadSfx('phase_3.5/audio/dial/AV_dog_long.mp3') # Dog speech
        self._camHelperNode = NodePath('CamHelperNode')
        self._camHelperNode.reparentTo(render)
        dialogue = TTLocalizer.CogdoExecutiveSuiteIntroMessage
        
        def start():
            self.frame.show()
            base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 0)

        
        def showShopOwner():
            self._setCamTarget(self._shopOwner, -10, offset = Point3(0, 0, 5))

        
        def end():
            self._dialogueLabel.reparentTo(hidden)
            self.toonHead.reparentTo(hidden)
            self.frame.hide()
            base.setCellsAvailable(base.bottomCells + base.leftCells + base.rightCells, 1)
            self._stopUpdateTask()

        self._ival = Sequence(Func(start), Func(self.displayLine, dialogue), Func(showShopOwner), ParallelEndTogether(camera.posInterval(self.cameraMoveDuration, Point3(8, 0, 13), blendType = 'easeInOut'), camera.hprInterval(0.5, self._camHelperNode.getHpr(), blendType = 'easeInOut')), Wait(self.introDuration), Func(end))
        self._startUpdateTask()
コード例 #6
0
    def __init__(self):
        self.line_dir = NodePath()

        base.cTrav = CollisionTraverser()
        self.col_handler = CollisionHandlerEvent()

        picker_node = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(picker_node)
        self.pickerRay = CollisionRay()
        picker_node.addSolid(self.pickerRay)

        plane_node = CollisionNode("base_plane")
        plane = base.render.attachNewNode(plane_node)
        self.plane_col = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        picker_node.addSolid(self.pickerRay)


        picker_node.setTag("rays","mray")
        base.cTrav.addCollider(pickerNPos, self.col_handler)

        self.col_handler.addInPattern("%(rays)ft-into-%(type)it")
        self.col_handler.addOutPattern("%(rays)ft-out-%(type)it")
        self.col_handler.addAgainPattern("ray_again_all%(""rays"")fh%(""type"")ih")

        self.model = loader.loadModel("../models/chest.egg")
        self.model_node = NodePath("sdfafd")
        self.model.reparentTo(self.model_node)
        self.model_node.reparentTo(render)
#
#        self.text_node = TextNode("battle_text")
#        self.text_node.setText("TEXTYTEXTYTEXTTEXT")
#        self.text_node_path = render.attachNewNode(self.text_node)
#        self.text_node_path.reparentTo(render)
#        self.text_node_path.setPos(0,0,4)
#        self.text_node_path.setHpr(0,0,0)
#        self.text_node_path.setScale(1)
#        #self.text_node_path.setTransparency(TransparencyAttrib.MAlpha)
#        self.text_node.setTextColor((1,1,1,1))
#        self.text_node.setAlign(TextNode.ALeft)

        self.placement_ghost = EditorObjects.PlacementGhost(0,"tower",base.object_scale)

        z=0
        self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))

        taskMgr.add(self.ray_update, "updatePicker")
        taskMgr.add(self.get_mouse_plane_pos, "MousePositionOnPlane")
        taskMgr.add(self.task_mouse_press_check, "checkMousePress")

        self.input_init()

        self.pickable=None
コード例 #7
0
    def load(self):
        self.notify.debug('load()')
        CogdoGameMovie.load(self)
        backgroundGui = loader.loadModel('phase_5/models/cogdominium/tt_m_gui_csa_flyThru')
        self.bg = backgroundGui.find('**/background')
        self.chatBubble = backgroundGui.find('**/chatBubble')
        self.chatBubble.setScale(6.5, 6.5, 7.3)
        self.chatBubble.setPos(0.32, 0, -0.78)
        self.bg.setScale(5.2)
        self.bg.setPos(0.14, 0, -0.6667)
        self.bg.reparentTo(aspect2d)
        self.chatBubble.reparentTo(aspect2d)
        self.frame = DirectFrame(geom=self.bg, relief=None, pos=(0.2, 0, -0.6667))
        self.bg.wrtReparentTo(self.frame)
        self.gameTitleText = DirectLabel(parent=self.frame, text=TTLocalizer.CogdoBarrelRoomTitle, scale=TTLocalizer.MRPgameTitleText * 0.8, text_align=TextNode.ACenter, text_font=getSignFont(), text_fg=(1.0, 0.33, 0.33, 1.0), pos=TTLocalizer.MRgameTitleTextPos, relief=None)
        self.chatBubble.wrtReparentTo(self.frame)
        self.frame.hide()
        backgroundGui.removeNode()
        self.toonDNA = ToonDNA.ToonDNA()
        self.toonDNA.newToonFromProperties('dss', 'ss', 'm', 'm', 2, 0, 2, 2, 1, 8, 1, 8, 1, 14)
        self.toonHead = Toon.Toon()
        self.toonHead.setDNA(self.toonDNA)
        self.makeSuit('sc')
        self.toonHead.getGeomNode().setDepthWrite(1)
        self.toonHead.getGeomNode().setDepthTest(1)
        self.toonHead.loop('neutral')
        self.toonHead.setPosHprScale(-0.73, 0, -1.27, 180, 0, 0, 0.18, 0.18, 0.18)
        self.toonHead.reparentTo(hidden)
        self.toonHead.startBlink()
        self.clipPlane = self.toonHead.attachNewNode(PlaneNode('clip'))
        self.clipPlane.node().setPlane(Plane(0, 0, 1, 0))
        self.clipPlane.setPos(0, 0, 2.45)
        self._toonDialogueSfx = loader.loadSfx('phase_3.5/audio/dial/AV_dog_long.ogg')
        self._camHelperNode = NodePath('CamHelperNode')
        self._camHelperNode.reparentTo(render)
        dialogue = TTLocalizer.CogdoBarrelRoomIntroDialog

        def start():
            self.frame.show()
            base.setCellsActive(base.bottomCells + base.leftCells + base.rightCells, 0)

        def end():
            self._dialogueLabel.reparentTo(hidden)
            self.toonHead.reparentTo(hidden)
            self.frame.hide()
            base.setCellsActive(base.bottomCells + base.leftCells + base.rightCells, 1)
            self._stopUpdateTask()

        self._ival = Sequence(Func(start), Func(self.displayLine, dialogue), Wait(CogdoBarrelRoomConsts.BarrelRoomIntroTimeout), Func(end))
        self._startUpdateTask()
        return
コード例 #8
0
ファイル: mos.py プロジェクト: UIKit0/Dota2War
 def __init__(self): 
   ShowBase.__init__(self) 
   self.disableMouse()
   self.pos3d=None
   self.nearPoint=None
   self.farPoint=None 
   self.camera.setPos(0, 60, 25) 
   self.camera.lookAt(0, 0, 0) 
   z = 0 
   self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z)) 
   self.model = loader.loadModel("ralph") 
   self.model.reparentTo(render) 
   self.accept("mouse1",self.set)
   taskMgr.add(self.__getMousePos, "_YourClass__getMousePos") 
コード例 #9
0
class CollisionManager:
    def __init__(self):
        self.line_dir = NodePath()

        base.cTrav = CollisionTraverser()
        self.col_handler = CollisionHandlerEvent()

        picker_node = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(picker_node)
        self.pickerRay = CollisionRay()
        picker_node.addSolid(self.pickerRay)

        plane_node = CollisionNode("base_plane")
        plane = base.render.attachNewNode(plane_node)
        self.plane_col = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        picker_node.addSolid(self.pickerRay)

        picker_node.setTag("rays", "mray")
        base.cTrav.addCollider(pickerNPos, self.col_handler)

        self.col_handler.addInPattern("%(rays)ft-into-%(type)it")
        self.col_handler.addOutPattern("%(rays)ft-out-%(type)it")
        self.col_handler.addAgainPattern("ray_again_all%("
                                         "rays"
                                         ")fh%("
                                         "type"
                                         ")ih")

        self.model = loader.loadModel("../models/chest.egg")
        self.model_node = NodePath("sdfafd")
        self.model.reparentTo(self.model_node)
        self.model_node.reparentTo(render)
        #
        #        self.text_node = TextNode("battle_text")
        #        self.text_node.setText("TEXTYTEXTYTEXTTEXT")
        #        self.text_node_path = render.attachNewNode(self.text_node)
        #        self.text_node_path.reparentTo(render)
        #        self.text_node_path.setPos(0,0,4)
        #        self.text_node_path.setHpr(0,0,0)
        #        self.text_node_path.setScale(1)
        #        #self.text_node_path.setTransparency(TransparencyAttrib.MAlpha)
        #        self.text_node.setTextColor((1,1,1,1))
        #        self.text_node.setAlign(TextNode.ALeft)

        self.placement_ghost = EditorObjects.PlacementGhost(
            0, "tower", base.object_scale)

        z = 0
        self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))

        taskMgr.add(self.ray_update, "updatePicker")
        taskMgr.add(self.get_mouse_plane_pos, "MousePositionOnPlane")
        taskMgr.add(self.task_mouse_press_check, "checkMousePress")

        self.input_init()

        self.pickable = None

    def input_init(self):
        self.DO = DirectObject()

        self.DO.accept('mouse1', self.mouse_click, ["1-down"])
        self.DO.accept('mouse1-up', self.mouse_click, ["1-up"])
        self.DO.accept('mouse3', self.mouse_click, ["3-down"])

        self.DO.accept('0', self.placement_ghost.change_player, [0])
        self.DO.accept('1', self.placement_ghost.change_player, [1])
        self.DO.accept('2', self.placement_ghost.change_player, [2])

        self.DO.accept('a', self.placement_ghost.change_type, ["army"])
        self.DO.accept('t', self.placement_ghost.change_type, ["tower"])

        self.DO.accept('control-s', base.xml_manager.save)

        self.DO.accept('mray-into-army', self.col_in_object)
        self.DO.accept('mray-out-army', self.col_out_object)
        self.DO.accept('mray-into-tower', self.col_in_object)
        self.DO.accept('mray-out-tower', self.col_out_object)

        self.DO.accept('ray_again_all', self.col_against_object)

    def col_against_object(self, entry):
        if entry.getIntoNodePath().getParent() != self.pickable:

            np_from = entry.getFromNodePath()
            np_into = entry.getIntoNodePath()
            self.selected_type = np_into.getTag("type")

            self.pickable = np_into.getParent()

    def col_in_object(self, entry):
        if base.state == "selecting":
            np_into = entry.getIntoNodePath()
            np_into.getParent().setColor(0.5, 0.5, 0.5, 1)

    def col_out_object(self, entry):
        np_into = entry.getIntoNodePath()
        try:
            np_into.getParent().clearColor()
        except:
            print "ERROR CLEARING COLOUR"

    def get_mouse_plane_pos(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()
            self.pos3d = Point3()
            nearPoint = Point3()
            farPoint = Point3()
            base.camLens.extrude(mpos, nearPoint, farPoint)
            if self.plane.intersectsLine(
                    self.pos3d, render.getRelativePoint(camera, nearPoint),
                    render.getRelativePoint(camera, farPoint)):
                #print "Mouse ray intersects ground plane at ", self.pos3d
                self.model_node.setPos(render, self.pos3d)
                self.placement_ghost.set_position(self.pos3d[0], self.pos3d[1])
        return task.again

    def ray_update(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()

            self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
        return task.cont

    def task_mouse_place(self, task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            self.placing_object = True
            self.place_pos = (self.anchor_x, self.anchor_y)
            self.line_dir.remove()
            ls = LineSegs()
            ls.move_to(self.anchor_x, self.anchor_y, 1)
            ls.draw_to(self.model.getX(), self.model.getY(), 1)
            node = ls.create()
            angle1 = math.atan2(self.anchor_y - self.anchor_y,
                                self.anchor_x - self.anchor_x + 50)
            angle2 = math.atan2(self.anchor_y - self.model.getY(),
                                self.anchor_x - self.model.getY())
            final_angle = angle1 - angle2
            self.model.setHpr(final_angle, 0, 0)
            self.line_dir = NodePath(node)
            self.line_dir.reparentTo(render)
            return task.again
        else:
            self.line_dir.hide()
            taskMgr.add(self.task_mouse_press_check, "checkMousePress")
            return task.done

    def task_mouse_press_check(self, task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            #if self.multi_select == True:
            self.anchor_x, self.anchor_y = self.model.getX(), self.model.getY()
            taskMgr.add(self.task_mouse_place, "multibox")
            return task.done
        return task.again

    def mouse_click(self, status):
        print base.state
        if status == "1-down":
            if base.state == "placement":
                if self.placement_ghost.get_type() == "tower":
                    obj = self.placement_ghost.place("tower",
                                                     self.model.getX(),
                                                     self.model.getY())
                elif self.placement_ghost.get_type() == "army":
                    obj = self.placement_ghost.place("army", self.model.getX(),
                                                     self.model.getY())
                base.details_box.set_object(obj)
                base.change_state("modifying")
            elif base.state == "moving":
                obj = base.details_box.get_object()
                obj.set_position(self.pos3d[0], self.pos3d[1])
                base.change_state("modifying")
            elif base.state == "selecting" and self.pickable != None:
                obj = base.get_obj_from_node(self.pickable)
                base.details_box.set_object(obj, "selecting")
                base.change_state("modifying")
        elif status == "1-up":
            print "Mouse", status
        elif status == "3-down":
            if base.state == "placement":
                base.change_state("selecting")
            elif base.state == "selecting":
                base.change_state("placement")
コード例 #10
0
 def initMouseRayCollision(self):
   z = 0
   self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))
コード例 #11
0
class Utils():
    LAST_ASSIGNED_ID = 0

    STARTJSON = None

    # Node
    NODE_SCALE = LVecBase3f(7, 9, 1)

    VERT_DEPTH_DIST = 20
    VERT_BREADTH_DIST = 30
    HORT_DEPTH_DIST = 25
    HORT_BREADTH_DIST = 10
    VERTICAL_DEPTH = False

    CURRENT_NODE_DATA_LIST = None

    TEXT_INPUT = None

    @staticmethod
    def convertToNodes(
            jsonData):  # Needed to be able to assign parentId(Proof?)
        # Utils.test(jsonData)
        nodeList = {}

        allNodeJsons = [copy.deepcopy(jsonData)]

        depth = 0
        while len(allNodeJsons) > 0:
            nodeJsonsInCurrentDepth = allNodeJsons
            allNodeJsons = []

            while len(nodeJsonsInCurrentDepth) > 0:
                currentJson = nodeJsonsInCurrentDepth[0]
                nodeJsonsInCurrentDepth.remove(currentJson)

                id = Utils.getIdOrAssignUnique(currentJson)
                node = Utils.getNode(currentJson, depth)
                nodeList[id] = node

                Utils.placeToParentsChildrenList(node, nodeList)

                nodeChildren = node.get('children')
                if nodeChildren is not None:
                    allNodeJsons.extend(nodeChildren)
                    for child in nodeChildren:
                        child['parentId'] = id

            depth += 1
        return nodeList

    @staticmethod
    def placeToParentsChildrenList(node, nodeList):
        parentId = node.get("parentId")
        if parentId is not None:
            nodeJsonSiblings = nodeList[parentId].get("children")
            for index, sibling in enumerate(nodeJsonSiblings):
                if sibling.get("x") is None:
                    nodeJsonSiblings.remove(sibling)
                    nodeJsonSiblings.insert(index, node)
                    nodeList[parentId]["children"] = nodeJsonSiblings
                    break

    @staticmethod
    def getNode(nodeJson, y):
        name = nodeJson.get('name')
        nodeId = nodeJson.get('id')
        parentId = nodeJson.get('parentId')
        children = nodeJson.get('children')
        node = {
            "name": name,
            "id": nodeId,
            "parentId": parentId,
            "children": children,
            "x": -1.0,
            "y": y,
            "mod": 0
        }
        return node

    @staticmethod
    def showNodes(nodeList):
        for key in nodeList:
            node = nodeList[key]
            print(
                node.get('name') + " id " + str(node.get('id')) +
                " parentId " + str(node.get('parentId')) + " x " +
                str(node.get("x")) + " y " + str(node.get("y")))

    @staticmethod
    def getIdOrAssignUnique(nodeJson):
        id = nodeJson.get('id')
        if id is None:
            Utils.LAST_ASSIGNED_ID += 1
            id = Utils.LAST_ASSIGNED_ID
            nodeJson['id'] = id
        return id

    @staticmethod
    def getUniqueId(nodeDataList, recheckLastId=False):
        Utils.LAST_ASSIGNED_ID = Utils.getLastAssignedId(
            nodeDataList, recheckLastId)
        Utils.LAST_ASSIGNED_ID += 1
        return Utils.LAST_ASSIGNED_ID

    @staticmethod
    def getLastAssignedId(nodeDataList, recheckLastId):
        highestIdAssigned = Utils.LAST_ASSIGNED_ID
        if Utils.CURRENT_NODE_DATA_LIST != nodeDataList or recheckLastId:
            Utils.CURRENT_NODE_DATA_LIST = nodeDataList
            for key in nodeDataList:
                if key >= highestIdAssigned:
                    highestIdAssigned = key

        return highestIdAssigned

    @staticmethod
    def showNode(node):
        print("name " + str(node.get("name")) + " x " + str(node.get("x")) +
              " y " + str(node.get("y")))

    @staticmethod
    def showDict(argDict):
        for key in argDict:
            print(str(key) + " " + str(argDict[key]))

    @staticmethod
    def dictLen(argDict):
        if argDict is None:
            return 0
        return len(argDict)

    @staticmethod
    def getJson(name):  # Deprecated
        jsonPath = path.abspath(path.join(__file__, "../../../assets/" + name))
        return json.load(open(jsonPath))

    @staticmethod
    def getAssetPath(fileName):
        return path.abspath(path.join(__file__, "../../../assets/" + fileName))

    @staticmethod
    def getChildren(node, nodeList):
        childrenIds = node.get("childrenIds")
        if childrenIds is None:
            return None

        children = []
        for id in childrenIds:
            children.append(nodeList[id])
        return children

    @staticmethod
    def getChildrenDict(node, nodeList):
        childrenIds = node.get("childrenIds")
        if childrenIds is None:
            return None

        children = {}
        for id in childrenIds:
            children[id] = nodeList[id]
        return children

    @staticmethod
    def createTextInput(pos, onEnterTextCb):
        Utils.TEXT_INPUT = TextInput(pos, onEnterTextCb)

    @staticmethod
    def closeTextInput():
        if Utils.TEXT_INPUT is not None:
            Utils.TEXT_INPUT.entry.destroy()
            Utils.TEXT_INPUT = None

    @staticmethod
    def getNodePosition(depth, breadth):
        if Utils.VERTICAL_DEPTH:
            x = breadth * Utils.VERT_BREADTH_DIST
            y = float(depth) * Utils.VERT_DEPTH_DIST
        else:
            y = breadth * Utils.HORT_BREADTH_DIST
            x = float(depth) * Utils.HORT_DEPTH_DIST
        z = 0  # Should be addressed later on

        return LVecBase3f(x, y, z)

    @staticmethod
    def getNodeDataPointt(nodeData):
        depth = nodeData.get("depth")
        breadth = nodeData.get("x")
        return Utils.getNodePosition(depth, breadth)

    # Have to find another way to organize functions
    @staticmethod
    def removeSelectedField(nodeId, nodeDataSettings):
        nodeSettings = nodeDataSettings.get(nodeId)
        if nodeSettings is not None:
            nodeDataSettings.pop(nodeId, None)
        return nodeDataSettings

    # Mouse helpers
    PLANE = Plane(Vec3(0, 0, 1), Point3(0, 0, 0))
    CT = CollisionTraverser()
    CHQ = CollisionHandlerQueue()
    CN = CollisionNode('mouseRay')

    NEW_CN = None
    CR = CollisionRay()

    @staticmethod
    def getMousePosition(showBase):
        Utils.initMouseFields(showBase)
        return Utils.getMouseCollisionToPlane(showBase, Utils.PLANE)

    @staticmethod
    def initMouseFields(showBase):
        if Utils.NEW_CN is None:
            Utils.NEW_CN = showBase.camera.attachNewNode(Utils.CN)
            Utils.CN.setFromCollideMask(BitMask32.bit(1))

            Utils.CN.addSolid(Utils.CR)
            Utils.CT.addCollider(Utils.NEW_CN, Utils.CHQ)

    @staticmethod
    def getMouseCollisionToPlane(showBase, plane):
        mouseWatcherNode = showBase.mouseWatcherNode
        if mouseWatcherNode.hasMouse():
            mpos = mouseWatcherNode.getMouse()

            pos3d = LPoint3()
            nearPoint = LPoint3()
            farPoint = LPoint3()
            showBase.camLens.extrude(mpos, nearPoint, farPoint)

            render = showBase.render
            camera = showBase.camera
            if plane.intersectsLine(pos3d,
                                    render.getRelativePoint(camera, nearPoint),
                                    render.getRelativePoint(camera, farPoint)):
                return pos3d
        return None

    @staticmethod
    def getDistSqr2D(point3d1, point3d2):
        dx = point3d2.x - point3d1.x
        dy = point3d2.y - point3d1.y
        return (dx * dx) + (dy * dy)

    @staticmethod
    def isInRange(sqrDist, rangeDist):
        if sqrDist < (rangeDist * rangeDist):
            return True
        return False

    @staticmethod
    def collidesRect(p1, p2, width, height):
        r1 = Rect(p1.x, p1.y, width, height)
        r2 = Rect(p2.x, p2.y, width, height)

        result = r1.collidesWith(r2)
        # print(str(result))
        return result
コード例 #12
0
class CollisionManager:
    def __init__(self):
        self.line_dir = NodePath()

        base.cTrav = CollisionTraverser()
        self.col_handler = CollisionHandlerEvent()

        picker_node = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(picker_node)
        self.pickerRay = CollisionRay()
        picker_node.addSolid(self.pickerRay)

        plane_node = CollisionNode("base_plane")
        plane = base.render.attachNewNode(plane_node)
        self.plane_col = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        picker_node.addSolid(self.pickerRay)


        picker_node.setTag("rays","mray")
        base.cTrav.addCollider(pickerNPos, self.col_handler)

        self.col_handler.addInPattern("%(rays)ft-into-%(type)it")
        self.col_handler.addOutPattern("%(rays)ft-out-%(type)it")
        self.col_handler.addAgainPattern("ray_again_all%(""rays"")fh%(""type"")ih")

        self.model = loader.loadModel("../models/chest.egg")
        self.model_node = NodePath("sdfafd")
        self.model.reparentTo(self.model_node)
        self.model_node.reparentTo(render)
#
#        self.text_node = TextNode("battle_text")
#        self.text_node.setText("TEXTYTEXTYTEXTTEXT")
#        self.text_node_path = render.attachNewNode(self.text_node)
#        self.text_node_path.reparentTo(render)
#        self.text_node_path.setPos(0,0,4)
#        self.text_node_path.setHpr(0,0,0)
#        self.text_node_path.setScale(1)
#        #self.text_node_path.setTransparency(TransparencyAttrib.MAlpha)
#        self.text_node.setTextColor((1,1,1,1))
#        self.text_node.setAlign(TextNode.ALeft)

        self.placement_ghost = EditorObjects.PlacementGhost(0,"tower",base.object_scale)

        z=0
        self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))

        taskMgr.add(self.ray_update, "updatePicker")
        taskMgr.add(self.get_mouse_plane_pos, "MousePositionOnPlane")
        taskMgr.add(self.task_mouse_press_check, "checkMousePress")

        self.input_init()

        self.pickable=None

    def input_init(self):
        self.DO=DirectObject()

        self.DO.accept('mouse1', self.mouse_click, ["1-down"])
        self.DO.accept('mouse1-up', self.mouse_click, ["1-up"])
        self.DO.accept('mouse3', self.mouse_click, ["3-down"])

        self.DO.accept('0', self.placement_ghost.change_player, [0])
        self.DO.accept('1', self.placement_ghost.change_player, [1])
        self.DO.accept('2', self.placement_ghost.change_player, [2])

        self.DO.accept('a', self.placement_ghost.change_type, ["army"])
        self.DO.accept('t', self.placement_ghost.change_type, ["tower"])

        self.DO.accept('control-s', base.xml_manager.save)

        self.DO.accept('mray-into-army', self.col_in_object)
        self.DO.accept('mray-out-army', self.col_out_object)
        self.DO.accept('mray-into-tower', self.col_in_object)
        self.DO.accept('mray-out-tower', self.col_out_object)

        self.DO.accept('ray_again_all', self.col_against_object)

    def col_against_object(self,entry):
        if entry.getIntoNodePath().getParent() != self.pickable:

            np_from=entry.getFromNodePath()
            np_into=entry.getIntoNodePath()
            self.selected_type = np_into.getTag("type")

            self.pickable = np_into.getParent()

    def col_in_object(self,entry):
        if base.state == "selecting":
            np_into=entry.getIntoNodePath()
            np_into.getParent().setColor(0.5,0.5,0.5,1)

    def col_out_object(self,entry):
        np_into=entry.getIntoNodePath()
        try:
            np_into.getParent().clearColor()
        except:
            print "ERROR CLEARING COLOUR"

    def get_mouse_plane_pos(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()
            self.pos3d = Point3()
            nearPoint = Point3()
            farPoint = Point3()
            base.camLens.extrude(mpos, nearPoint, farPoint)
            if self.plane.intersectsLine(self.pos3d,
                render.getRelativePoint(camera, nearPoint),
                render.getRelativePoint(camera, farPoint)):
                #print "Mouse ray intersects ground plane at ", self.pos3d
                self.model_node.setPos(render, self.pos3d)
                self.placement_ghost.set_position(self.pos3d[0],self.pos3d[1])
        return task.again

    def ray_update(self,task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()

            self.pickerRay.setFromLens(base.camNode, mpos.getX(),mpos.getY())
        return task.cont

    def task_mouse_place(self,task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            self.placing_object = True
            self.place_pos = (self.anchor_x,self.anchor_y)
            self.line_dir.remove()
            ls = LineSegs()
            ls.move_to(self.anchor_x,self.anchor_y,1)
            ls.draw_to(self.model.getX(),self.model.getY(),1)
            node = ls.create()
            angle1 = math.atan2(self.anchor_y - self.anchor_y,self.anchor_x - self.anchor_x+50)
            angle2 = math.atan2(self.anchor_y - self.model.getY(),self.anchor_x - self.model.getY());
            final_angle = angle1-angle2;
            self.model.setHpr(final_angle,0,0)
            self.line_dir = NodePath(node)
            self.line_dir.reparentTo(render)
            return task.again
        else:
            self.line_dir.hide()
            taskMgr.add(self.task_mouse_press_check, "checkMousePress")
            return task.done

    def task_mouse_press_check(self,task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            #if self.multi_select == True:
                self.anchor_x,self.anchor_y = self.model.getX(),self.model.getY()
                taskMgr.add(self.task_mouse_place, "multibox")
                return task.done
        return task.again

    def mouse_click(self,status):
        print base.state
        if status == "1-down":
            if base.state == "placement":
                if self.placement_ghost.get_type() == "tower":
                    obj = self.placement_ghost.place("tower",self.model.getX(),self.model.getY())
                elif self.placement_ghost.get_type() == "army":
                    obj = self.placement_ghost.place("army",self.model.getX(),self.model.getY())
                base.details_box.set_object(obj)
                base.change_state("modifying")
            elif base.state == "moving":
                obj = base.details_box.get_object()
                obj.set_position(self.pos3d[0],self.pos3d[1])
                base.change_state("modifying")
            elif base.state == "selecting" and self.pickable != None:
                obj = base.get_obj_from_node(self.pickable)
                base.details_box.set_object(obj,"selecting")
                base.change_state("modifying")
        elif status == "1-up":
            print "Mouse",status
        elif status == "3-down":
            if base.state == "placement":
                base.change_state("selecting")
            elif base.state == "selecting":
                base.change_state("placement")
コード例 #13
0
    def __init__(self, framework, *args, **kwargs):
        self.bullets = []
        self.environment = {}
        self.colliders = {}
        self.task_manager = []
        self.bullet_colliders = []
        self.remove_bullet_indices = []

        super().__init__(*args, **kwargs)
        self.f = framework
        self.controller = Controller(self.f.accept, self)
        self.f.set_background_color(0.2, 0.2, 0.2, 0.6)

        if settings.ALLOW_FILTERS:
            self.filter = CommonFilters(self.f.win, self.f.cam)
            self.filter.set_bloom(mintrigger=0.99, size="small")
            # self.filter.set_blur_sharpen(amount=0.99)

        self.base_node = NodePath("base")
        self.base_node.reparent_to(self.f.render)

        # floor
        self.plane = self.create_model(settings.egg / "plane",
                                       self.base_node,
                                       "ground-zero",
                                       color=(1, 1, 1, 1))
        self.create_model(settings.egg / "house_01",
                          self.base_node,
                          "house-01",
                          position=(20, 50, 0),
                          scale=1.5)
        self.create_model(settings.egg / "house_02",
                          self.base_node,
                          "house-02",
                          position=(-50, 10, 0),
                          scale=1.5)

        self.sun_light_model = self.create_model("models/misc/sphere",
                                                 self.base_node,
                                                 "sun",
                                                 position=(0, -150, 250),
                                                 scale=5.0,
                                                 color=(1, 1, 1, 1),
                                                 _store=False)

        tank = self.create_model(settings.egg / "tank",
                                 self.base_node,
                                 "player",
                                 scale=3.0,
                                 position=(0.0, 0.0, 1e-3))
        gun = self.create_model("models/misc/sphere",
                                tank,
                                "player-gun",
                                position=(0.0, 4.5, 1.755),
                                scale=0.1,
                                _store=False)
        self.tank = Tank(tank, gun, framework=self.f)
        self._tank = self.tank.tank

        enemy = self.create_model(settings.egg / "enemy",
                                  self.base_node,
                                  "enemy",
                                  scale=0.8,
                                  position=(-80.0, 80.0, 1e-3))
        self.enemy = EnemyTank(enemy, None, framework=self.f)

        # point light for shadows
        sun_light = PointLight("sun-light")
        sun_light.set_color((0.4, 0.4, 0.4, 1))
        self.sun_light_node = self.base_node.attach_new_node(sun_light)
        self.sun_light_node.reparent_to(self.sun_light_model)
        self.redistribute_light(self.sun_light_node)
        self.plane.set_light(self.sun_light_node)

        # daylight
        if settings.ALLOW_DAYLIGHT:
            day_light = DirectionalLight("day-light")
            day_light.set_color((1, 1, 1, 1))
            self.daylight_node = self.f.render.attach_new_node(day_light)
            self.daylight_node.set_p(-20)
            self.daylight_node.set_h(10)
            self.daylight_node.reparent_to(self.sun_light_model)
            self.redistribute_light(self.daylight_node)

        # shadows
        if settings.ALLOW_SHADOWS:
            sun_light.set_shadow_caster(True, 2048, 2048)
            self.f.render.set_shader_auto()

        # 3rd person camera lock
        if settings.TRD_PERSON_CAM:
            self.f.camera.reparent_to(self.tank.tank)
            self.f.cam.set_pos(0, -25, 10)
            self.f.cam.lookAt(self.tank.tank)
            self.f.cam.setP(self.f.camera.getP() - 20)

        if settings.ALLOW_AMBIENT:
            amblight = AmbientLight("ambient-light")
            amblight.set_color((0.2, 0.2, 0.2, 1))
            self.amblight_node = self.f.render.attach_new_node(amblight)
            self.redistribute_light(self.amblight_node)

        # colliders
        tank_collider = self.environment["player"].attachNewNode(
            CollisionNode('player-collider'))
        tank_collider.node().addSolid(
            CollisionBox(Point3(-1.5, -3, 0), Point3(1.5, 3, 2.25)))
        self.colliders['player-collider'] = tank_collider

        enemy_collider = self.environment["enemy"].attachNewNode(
            CollisionNode('enemy-collider'))
        enemy_collider.node().addSolid(
            CollisionBox(Point3(-6.5, -13.5, 0), Point3(6.5, 13, 10)))
        self.colliders['enemy-collider'] = enemy_collider

        house_01_collider = self.environment["house-01"].attachNewNode(
            CollisionNode('house-01-collider'))
        house_01_collider.node().addSolid(
            CollisionBox(Point3(0, 2, 0), Point3(14.5, 16, 17)))
        self.colliders['house-01'] = house_01_collider

        house_02_collider = self.environment["house-02"].attachNewNode(
            CollisionNode('house-02-collider'))
        house_02_collider.node().addSolid(
            CollisionBox(Point3(0, 0, 0), Point3(21, 27, 37)))
        self.colliders['house-02'] = house_02_collider

        floor_collider = self.environment["ground-zero"].attachNewNode(
            CollisionNode('ground-zero-collider'))
        floor_collider.node().addSolid(
            CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0))))
        self.colliders['ground-zero-collider'] = floor_collider

        self.f.pusher.addCollider(tank_collider, self.environment["player"])
        self.f.cTrav.addCollider(tank_collider, self.f.pusher)

        # show.hide all colliders
        if settings.SHOW_COLLIDERS:
            for key, value in self.colliders.items():
                logger.info(f"collider for {key} is visible")
                value.show()
                self.f.cTrav.showCollisions(self.f.render)

        # uppdate
        self.f.cHandler.addInPattern('%fn')
        self.f.accept('bullet-collider', self.handle_collision)

        self.task_manager.append(self.f.task_mgr.add(self.update))
        self.task_manager.append(self.f.task_mgr.add(self.update_bullets))
コード例 #14
0
	def __init__(self):
		ShowBase.__init__(self)
		self.disableMouse()
		self.camera.setPos(40, -100, 160)
		self.camera.lookAt(40,-44.5,0)
		self.rows, self.cols = 9, 8
		#Start tile & end tile
		self.start, self.end = (0, 0), (8, 7)
		self.cellSize = 10
		#Plane used for intersection of mouseLine
		#To get coords of mouse
		self.mousePlane = Plane(Vec3(0, 0, 1), Point3(0, 0, 0))
		#No click has been made
		self.mousePressed = False
		self.displayTextObject = None
		#Holds the model for all tiles
		self.tiles = []
		for row in xrange(self.rows):
			self.tiles += [[0]*self.cols]
		#Holds the texture for the grass tiles
		self.grass = loader.loadTexture("models/textures/sponge.jpg")
		#Holds the models for all the towers
		self.towerModels = []
		for row in xrange(self.rows):
			self.towerModels += [[0]*self.cols]
		#Holds the G value of each tile for pathing
		self.tileNodes = []
		for row in xrange(self.rows):
			self.tileNodes += [[0]*self.cols]
		for row in xrange(self.rows):
			for col in xrange(self.cols):
				self.tileNodes[row][col] = Tile(self)
		#Holds the towers in a 2d array
		self.towers = []
		for row in xrange(self.rows):
			self.towers += [[0]*self.cols]
		self.board = [
						['s', 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0,'e']
					 ]
		self.drawBoard()
		self.drawBoardLines()
		self.drawBackground()
		
		#Stores all center points of each tile
		self.midPoints= []
		startX = 5 #X Coordinate of first Square's center
		startY = -5 #Y Coordinate of first Square's center
		for row in xrange(self.rows):
			self.midPoints += [[Point3(0,0,0)]*self.cols]
		for row in xrange(self.rows):
			for col in xrange(self.cols):
				self.midPoints[row][col] = Point3(
											startX+col*self.cellSize,
											startY-row*self.cellSize,
											0)
		self.createPath(self.start, self.end)
		
#Board Information
		#Towers
		self.arrowTowerModel = loader.loadModel(
			"models/towers/arrowTowerFolder/arrowTower")
		self.fireTowerModel = loader.loadModel(
			"models/towers/fireTowerFolder/fireTower")
		self.iceTowerModel = loader.loadModel(
			"models/towers/iceTowerFolder/iceTower")

#Main Menu
		self.mainFrame = DirectFrame(frameColor=(0, 0, 0, 1),
		                      frameSize=(-2, 2, -2, 2),
		                      pos=(0, 0, 0))
		instructionsText = "   Stefan Dasbach's Tower Defense\n\n\n"+\
							"Monsters move accross the screen\n" +\
							"from the green square to the red\nsquare."+\
							" Choose and build from among a \nrange" +\
							" of towers including Arrow, Fire,\nand" +\
							" Ice. Waves of monsters come in \n10 and" +\
							" will spawn every 15 seconds. You\ncan" +\
							" only build towers when creeps are\nnot" +\
							" alive.\n\nPress 'P' to play!"
		self.instructionsNode = OnscreenText(
									text=instructionsText,
									pos = (-0.9, 0.55),
									scale = (0.1),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
									frame = (1, 0, 0, 1),
									align = TextNode.ALeft
												)
		# self.fireProjectileModel = loader.loadModel(
		# 	"models/projectiles/fireProjectileFolder/fireProjectile")
		# self.iceProjectileModel = loader.loadModel(
		# "models/projectiles/iceProjectileFolder/iceProjectile")
		# 
		# self.iceProjectileModel.setScale(0.03,0.03,0.03)
		# self.iceProjectileModel.setPos(12,-5,0)
		# # self.iceProjectileModel.lookAt(15, -5, 0)
		# self.iceProjectileModel.reparentTo(self.render)
		
#Level information
		self.level = 1
		self.gold = 20
		self.lives = 20
		self.totalHp = 0
		self.arrowTowerCost = 10
		self.fireTowerCost = 25
		self.iceTowerCost = 30
		#Building period, True at beginning of game
		self.buildTime = True
		#Spawning/killing of creeps period, False at beginning
		self.fireTime = False
		self.displayGameInfoNode = None
		self.displayGameInfoNode1 = None
		
#Spawn Creeps
		self.numberOfCreeps = 10
		#Time for building
		self.waveTime = 15
		self.creeps = []
		self.hasSpawnedWave = False
		#Delay between spawning of each creep
		self.delayTime = 0
		self.interval = 0
		self.buildTimeDuration = 0
		self.alreadyInitedGame = False
		self.accept("p", self.initGame)
コード例 #15
0
class TowerDefense(ShowBase):
	def __init__(self):
		ShowBase.__init__(self)
		self.disableMouse()
		self.camera.setPos(40, -100, 160)
		self.camera.lookAt(40,-44.5,0)
		self.rows, self.cols = 9, 8
		#Start tile & end tile
		self.start, self.end = (0, 0), (8, 7)
		self.cellSize = 10
		#Plane used for intersection of mouseLine
		#To get coords of mouse
		self.mousePlane = Plane(Vec3(0, 0, 1), Point3(0, 0, 0))
		#No click has been made
		self.mousePressed = False
		self.displayTextObject = None
		#Holds the model for all tiles
		self.tiles = []
		for row in xrange(self.rows):
			self.tiles += [[0]*self.cols]
		#Holds the texture for the grass tiles
		self.grass = loader.loadTexture("models/textures/sponge.jpg")
		#Holds the models for all the towers
		self.towerModels = []
		for row in xrange(self.rows):
			self.towerModels += [[0]*self.cols]
		#Holds the G value of each tile for pathing
		self.tileNodes = []
		for row in xrange(self.rows):
			self.tileNodes += [[0]*self.cols]
		for row in xrange(self.rows):
			for col in xrange(self.cols):
				self.tileNodes[row][col] = Tile(self)
		#Holds the towers in a 2d array
		self.towers = []
		for row in xrange(self.rows):
			self.towers += [[0]*self.cols]
		self.board = [
						['s', 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0, 0],
						 [ 0, 0, 0, 0, 0, 0, 0,'e']
					 ]
		self.drawBoard()
		self.drawBoardLines()
		self.drawBackground()
		
		#Stores all center points of each tile
		self.midPoints= []
		startX = 5 #X Coordinate of first Square's center
		startY = -5 #Y Coordinate of first Square's center
		for row in xrange(self.rows):
			self.midPoints += [[Point3(0,0,0)]*self.cols]
		for row in xrange(self.rows):
			for col in xrange(self.cols):
				self.midPoints[row][col] = Point3(
											startX+col*self.cellSize,
											startY-row*self.cellSize,
											0)
		self.createPath(self.start, self.end)
		
#Board Information
		#Towers
		self.arrowTowerModel = loader.loadModel(
			"models/towers/arrowTowerFolder/arrowTower")
		self.fireTowerModel = loader.loadModel(
			"models/towers/fireTowerFolder/fireTower")
		self.iceTowerModel = loader.loadModel(
			"models/towers/iceTowerFolder/iceTower")

#Main Menu
		self.mainFrame = DirectFrame(frameColor=(0, 0, 0, 1),
		                      frameSize=(-2, 2, -2, 2),
		                      pos=(0, 0, 0))
		instructionsText = "   Stefan Dasbach's Tower Defense\n\n\n"+\
							"Monsters move accross the screen\n" +\
							"from the green square to the red\nsquare."+\
							" Choose and build from among a \nrange" +\
							" of towers including Arrow, Fire,\nand" +\
							" Ice. Waves of monsters come in \n10 and" +\
							" will spawn every 15 seconds. You\ncan" +\
							" only build towers when creeps are\nnot" +\
							" alive.\n\nPress 'P' to play!"
		self.instructionsNode = OnscreenText(
									text=instructionsText,
									pos = (-0.9, 0.55),
									scale = (0.1),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
									frame = (1, 0, 0, 1),
									align = TextNode.ALeft
												)
		# self.fireProjectileModel = loader.loadModel(
		# 	"models/projectiles/fireProjectileFolder/fireProjectile")
		# self.iceProjectileModel = loader.loadModel(
		# "models/projectiles/iceProjectileFolder/iceProjectile")
		# 
		# self.iceProjectileModel.setScale(0.03,0.03,0.03)
		# self.iceProjectileModel.setPos(12,-5,0)
		# # self.iceProjectileModel.lookAt(15, -5, 0)
		# self.iceProjectileModel.reparentTo(self.render)
		
#Level information
		self.level = 1
		self.gold = 20
		self.lives = 20
		self.totalHp = 0
		self.arrowTowerCost = 10
		self.fireTowerCost = 25
		self.iceTowerCost = 30
		#Building period, True at beginning of game
		self.buildTime = True
		#Spawning/killing of creeps period, False at beginning
		self.fireTime = False
		self.displayGameInfoNode = None
		self.displayGameInfoNode1 = None
		
#Spawn Creeps
		self.numberOfCreeps = 10
		#Time for building
		self.waveTime = 15
		self.creeps = []
		self.hasSpawnedWave = False
		#Delay between spawning of each creep
		self.delayTime = 0
		self.interval = 0
		self.buildTimeDuration = 0
		self.alreadyInitedGame = False
		self.accept("p", self.initGame)
		
	def initGame(self):
		if self.alreadyInitedGame == False:
			self.instructionsNode.destroy()
			self.mainFrame.destroy()
			#Handle taskManager
			self.timerTask = self.taskMgr.add(self.timerTask, 'timerTask')
			self.mouseTask = self.taskMgr.add(self.mouseTask, 'mouseTask')
			self.fireTask = self.taskMgr.add(self.fireTask, 'fireTask')
			self.hpBarTask = self.taskMgr.add(self.hpBarTask, 'hpBarTask')
			self.displayGameInfo()
			self.displayTowerInfo()
			self.displayControls()
			#Selects tile
			self.accept("mouse1", self.selectTile)
			#Builds arrow Tower
			self.accept("a", self.buildTowerArrow)
			#Builds Fire Tower
			self.accept("f", self.buildTowerFire)
			#Builds Ice tower
			self.accept("i", self.buildTowerIce)
			#Quits the game
			self.accept("q", self.quit)
			self.alreadyInitedGame = True

#***********************   Board Display   ***********************
	#Displays a walkable tile or tower
	def drawTile(self, row, col):
		#Towers
		if self.board[row][col] < 0:
			if self.board[row][col] == -1: #Arrow Tower
				# tileMaker.setColor(0, 0, 0, 1)
				self.towerModels[row][col] = BuildArrowTowerModel(
											self, self.midPoints[row][col])
			elif self.board[row][col] == -2: #Fire tower
				# tileMaker.setColor(1, 136.0/255, 0, 1)
				self.towerModels[row][col] = BuildFireTowerModel(
											self, self.midPoints[row][col])
			elif self.board[row][col] == -3: #Ice tower
				self.towerModels[row][col] = BuildIceTowerModel(
											self, self.midPoints[row][col])
				# tileMaker.setColor(0, 0, 1, 1)
		#Board Tiles
		else: 
			tileMaker = CardMaker("board")
			cellSize = self.cellSize
			if self.board[row][col] == 0: #Normal/non-towered tile
				tileMaker.setColor(1, 1, 1, 1)
			elif self.board[row][col] == "s": #Start
				tileMaker.setColor(0, 1, 0, 1)
			elif self.board[row][col] == "e": #End
				tileMaker.setColor(173.0/255, 0, 0, 1)
			tileMaker.setFrame(
				col*cellSize, col*cellSize+cellSize,
				-row*cellSize-cellSize, -row*cellSize)
			self.tiles[row][col] = self.render.attachNewNode(\
									tileMaker.generate())
			self.tiles[row][col].setTexture(self.grass)
			self.tiles[row][col].lookAt(0,0,-1)
	
	#Draws all tiles from self.board
	def drawBoard(self):
		tileMaker = CardMaker("board")
		board = self.board
		cellSize = self.cellSize
		for row in xrange(len(board)):
			for col in xrange(len(board[0])):
				self.drawTile(row, col)
	
	#Draws grid line from start and end point
	#Basically adds visual separation of tiles
	def drawLine(self, start, end, thickness=1.5):
		segment = LineSegs()
		# segment.setColor(209/255.0, 168/255.0, 132/255.0, 1)
		segment.setColor(1, 1, 1, 1)
		segment.setThickness(thickness)
		segment.moveTo(start)
		segment.drawTo(end)
		line = self.render.attachNewNode(segment.create())
		
	#Draws all grid lines of the board
	def drawBoardLines(self):
		#Horizontal grid lines
		for row in xrange(self.rows):
			self.drawLine(Point3(0, -row*self.cellSize, 0.01), 
				Point3(self.cellSize*self.cols, -row*self.cellSize, 0.01))
		#Vertical grid lines
		for col in xrange(self.cols):
			self.drawLine(Point3(col*self.cellSize, 0, 0.01), 
				Point3(col*self.cellSize, -self.cellSize*self.rows, 0.01))
				
	def drawBackground(self):
		self.background = loader.loadModel("models/skySphere/skySphere")
		self.background.lookAt(0,0,-1)
		self.background.reparentTo(self.render)
	#**************************   A Star   **************************
	#Determines whether or not tile can be walked on
	def isPath(self, coord):
		row, col = coord[0], coord[1]
		if self.board[row][col] < 0: #Tower
			return False
		return True #Can walk on path

	#Determines if row and col on board or not
	def inBounds(self, coord):
		row, col = coord[0], coord[1]
		if row < len(self.board) and col < len(self.board[0]):
			if row >= 0 and col >=0:
				return True
		return False

	#A* Pathfinding Algorithm
	def createPath(self, start, end):
		#This array of array of objects keeps 
		#track of the G value of each tile

		openList = set()
		closedList = set()
		parentDict = dict()
		openList.add(start)
		newTile = start

		#If end in closedList, we've found our pathway to end
		#Or if we've exhausted all search tiles available (openList is empty)
		try:
			while (end not in closedList) or len(openList) != 0:
				#Lowest f-value among openList
				#newTile holds the coordinates of which tile to check
				newTile = self.getLowestFInOpen(start, end, openList)
				#Make self.tileNodes[newTile[0]][newTile[1]] and currentNode
				#Aliases to use currentNode instead to improve clarity
				currentNode = self.tileNodes[newTile[0]][newTile[1]]
				#Switch newTile to closedList
				openList.remove(newTile)
				closedList.add(newTile)
				#Adjacent tiles
				left = (newTile[0], newTile[1]-1)
			
				right = (newTile[0], newTile[1]+1)
			
				up = (newTile[0]-1, newTile[1])
			
				down = (newTile[0]+1, newTile[1])
			
				#Check if adjacent tiles in closedList/openList
				#If in closedList, already checked
				#If not in closedList, check if already in openList
				#If not in openList, add it, and record its parent tile
				#Down tile
				if self.inBounds(down) and self.isPath(down):
					downNode = self.tileNodes[newTile[0]+1][newTile[1]]
					#If not already checked
					if down not in closedList:
						#If should be added to openList	
						if down not in openList:
							downNode.setG(currentNode.getG() + 1)
							openList.add(down)
							#Assign newTile as down's parent tile
							parentDict[down] = (newTile)
						else:
							newG = currentNode.getG() + 1 #down so plus 1
							if downNode.getG() > newG:
								downNode.setG(newG)
								parentDict[down] = (newTile)
				#Right tile
				if self.inBounds(right) and self.isPath(right):
					rightNode = self.tileNodes[newTile[0]][newTile[1]+1]
					if right not in closedList:
						if right not in openList:
							rightNode.setG(currentNode.getG() + 1)
							openList.add(right)
							parentDict[right] = (newTile)
						else:
							newG = currentNode.getG() + 1 #right so plus 1
							if rightNode.getG() > newG:
								rightNode.setG(newG)
								parentDict[right] = (newTile)
				#Up tile
				if self.inBounds(up) and self.isPath(up):
					upNode = self.tileNodes[newTile[0]-1][newTile[1]]
					if up not in closedList:
						if up not in openList:
							upNode.setG(currentNode.getG() + 1)
							openList.add(up)
							parentDict[up] = (newTile)
						else:
							newG = currentNode.getG() + 1 #up so plus 1
							if upNode.getG() > newG:
								upNode.setG(newG)
								parentDict[up] = (newTile)
				#Left Tile
				if self.inBounds(left) and self.isPath(left):
					leftNode = self.tileNodes[newTile[0]][newTile[1]-1]
					if left not in closedList:
						if left not in openList:
							leftNode.setG(currentNode.getG() + 1)
							openList.add(left)
							parentDict[left] = (newTile)
						else:
							newG = currentNode.getG() + 1 #left so plus 1
							if leftNode.getG() > newG:
								leftNode.setG(newG)
								parentDict[left] = (newTile)
		except:
			return False

		self.tileSequence = self.getSequenceFromDict(parentDict)
		self.pathSequence = []
		for i in xrange(len(self.tileSequence)):
			self.pathSequence += [self.midPoints
										[self.tileSequence[i][0]]
										[self.tileSequence[i][1]]]
						
		return True
	#Finds lowest f value in openList
	def getLowestFInOpen(self, start, end, openList):
		lowestF = 10000000
		newTile = None
		for tile in openList:
			temp = self.getF(start, end, self.tileNodes[\
					tile[0]][tile[1]], tile[0], tile[1])
			if temp < lowestF:
				lowestF = temp
				newTile = tile
		return newTile

	#Distance from start to current tile
	def getG(self, current):
		return current.getG()
		# return abs(start[0]-current[0]) + abs(start[1]-current[1])

	#Distance from current tile to end
	def getH(self, start, end, current):
		return abs(end[1]-current[1]) + abs(end[0]-current[0])

	#Sum of g and h (total presumed distance from start to finish)
	def getF(self, start, end, current, row, col):
		g = self.getG(current)
		h = self.getH(start, end, (row,col))
		return g+h
	#Get sequence of steps from dictionary of points
	#and their parent points
	def getSequenceFromDict(self, parentDict):
		currentTile = self.end
		pathSequence = [currentTile]
		while currentTile != self.start:
			currentTile = parentDict[currentTile]
			pathSequence += [currentTile]
		return pathSequence[::-1]
	
#********************Task Manager***********************
	#Handles the switching between 
	#The building period and
	#The creep killing period
	def timerTask(self, task):
		if self.buildTime == True:
			#buildTimeDuration hasn't been set yet
			if self.buildTimeDuration == 0:
				for row in self.towers:
					for tower in row:
						#If this has been set to a tower
						if tower:
							if tower.shootProj != None and\
								not tower.shootProj.isGone():
								tower.shootProj.remove()
				self.buildTimeDuration = task.time + self.waveTime
				self.displayBuildTime(self.buildTimeDuration-task.time)
			#If a second has passed since updating the time
			elif self.buildTimeDuration-task.time < self.currentBuildTimeInt:
				self.displayNextWave.destroy()
				self.displayNextWaveTime.destroy()
				self.displayBuildTime(self.buildTimeDuration-task.time)
			#If buildTime has expired
			#Initiate fireTime, end buildTime
			if task.time > self.buildTimeDuration:
				self.displayNextWave.destroy()
				self.displayNextWaveTime.destroy()
				self.buildTime = False
				self.fireTime = True
				self.hasSpawnedWave = False
				self.buildTimeDuration = 0
				self.displayCreepHp = True
			return Task.cont
		#Start next level
		if self.fireTime == True:
			#Spawn wave
			if self.hasSpawnedWave == False:
				self.spawnWave(task)
				#Used to display CreepHP as soon as wave spawns
				if self.displayCreepHp == True:
					if self.displayGameInfoNode1 != None:
						self.displayGameInfoNode1.destroy()
					self.displayGameInfoNode.destroy()
					self.displayGameInfo()
				self.displayCreepHp = False
				return Task.cont
			#If all creeps killed/reached end
			#Initiate buildTime, end fireTime
			if self.isCreeps() == False:
				self.buildTime = True
				self.fireTime = False
				#Next level
				self.levelUp()
			return Task.cont
	#Manages the tracking of the mouse & its position
	def mouseTask(self, task):
		if base.mouseWatcherNode.hasMouse():
			tempMousePos = base.mouseWatcherNode.getMouse()
			pos3d = Point3()
			nearPoint = Point3()
			farPoint = Point3()
			base.camLens.extrude(tempMousePos, nearPoint, farPoint)
			if self.mousePlane.intersectsLine(pos3d,
				self.render.getRelativePoint(camera, nearPoint),
				self.render.getRelativePoint(camera, farPoint)):
				self.mousePos = (pos3d[0], pos3d[1])
		return Task.cont
	#Manages the firing of towers
	def fireTask(self, task):
		#Are creeps and are towers
		if len(self.creeps) > 0 and len(self.towers) > 0:
			for row in self.towers:
				for tower in row:
					#If this has been set to a tower
					if tower:
						#Tower fire isn't on cooldown
						# if not tower.isFiring():
						tower.fire(task)
							
		return Task.cont
	#Shows and positions hpBar
	def hpBarTask(self, task):
		for creep in self.creeps:
			#Is actually a creep
			if creep:
				creep.showHpBar(task)
		return Task.cont
	
#*************************Building Objects*************************
	#onClick of mouse selects a tile
	def selectTile(self):
		row, col = self.mousePos[1], self.mousePos[0]
		#Check if click is on the grid or not
		if (row < 0 and row > -self.rows*self.cellSize) and (
			col > 0 and col <  self.cols*self.cellSize):
			self.mousePressed = True
			self.currentRow = abs(int(row/10))
			self.currentCol = abs(int(col/10))
			#If displayText already exists, destroy and rewrite it
			if self.displayTextObject != None:
				self.displayTextObject.destroy()
			self.displayText()
	def buildTowerArrow(self):
		#Row and col of tile selected
		#A tile is selected
		if self.mousePressed == True:
			#Makes sure not building while attacking creeps
			if self.buildTime == False:
				self.displayTextObject.destroy()
				self.displayError("You cannot build while attacking")
			else:
				row = self.currentRow
				col = self.currentCol
				originalVal = self.board[row][col]
				self.board[row][col] = -1
				#Checks if the tower is blocking
				#Or if tower already built there
				#Create path return false if no path
				if (not self.createPath(self.start, self.end) or 
									  (row == 0 and col == 0) or 
									  (originalVal < 0) #Already a tower
									  ):
					self.board[row][col] = originalVal
					self.displayTextObject.destroy()
					self.displayError("You can't build there")
				elif self.gold < self.arrowTowerCost:
					self.board[row][col] = originalVal
					self.displayTextObject.destroy()
					self.displayError("Not enough gold")
				else:
					self.towers[row][col] = ArrowTower(
									self, self.midPoints[row][col])
					#Delete current square
					# self.tiles[row][col].removeNode()
					#Redraw it as tower
					self.drawTile(row, col)
					#Built a tower, so no longer highlighting tile
					self.mousePressed = False
					#No need for text; no tile selected
					self.displayTextObject.destroy()
					self.createPath(self.start, self.end)
					self.gold -= self.arrowTowerCost
					if self.displayGameInfoNode1 != None:
						self.displayGameInfoNode1.destroy()
					self.displayGameInfoNode.destroy()
					self.displayGameInfo()
	def buildTowerFire(self):
		#Row and col of tile selected
		#A tile is selected
		if self.mousePressed == True:
			#Makes sure not building while attacking creeps
			if self.buildTime == False:
				self.displayTextObject.destroy()
				self.displayError("You cannot build while attacking")
			else:
				row = self.currentRow
				col = self.currentCol
				originalVal = self.board[row][col]
				self.board[row][col] = -2
				#Checks if the tower is blocking
				#Or if tower already built there
				#Create path return false if no path
				if (not self.createPath(self.start, self.end) or 
									  (row == 0 and col == 0) or 
									  (originalVal < 0) #Already a tower
									  ):
					self.board[row][col] = originalVal
					self.displayTextObject.destroy()
					self.displayError("You can't build there")
				elif self.gold < self.fireTowerCost:
					self.board[row][col] = originalVal
					self.displayTextObject.destroy()
					self.displayError("Not enough gold")
				else:
					self.towers[row][col] = FireTower(
									self, self.midPoints[row][col])
					#Delete current square
					# self.tiles[row][col].removeNode()
					#Redraw it as tower
					self.drawTile(row, col)
					#Built a tower, so no longer highlighting tile
					self.mousePressed = False
					#No need for text; no tile selected
					self.displayTextObject.destroy()
					self.createPath(self.start, self.end)
					self.gold -= self.fireTowerCost
					if self.displayGameInfoNode1 != None:
						self.displayGameInfoNode1.destroy()
					self.displayGameInfoNode.destroy()
					self.displayGameInfo()
	def buildTowerIce(self):
		#Row and col of tile selected
		#A tile is selected
		if self.mousePressed == True:
			#Makes sure not building while attacking creeps
			if self.buildTime == False:
				self.displayTextObject.destroy()
				self.displayError("You cannot build while attacking")
			else:
				row = self.currentRow
				col = self.currentCol
				originalVal = self.board[row][col]
				self.board[row][col] = -3
				#Checks if the tower is blocking
				#Or if tower already built there
				#Create path return false if no path
				if (not self.createPath(self.start, self.end) or 
									  (row == 0 and col == 0) or 
									  (originalVal < 0) #Already a tower
									  ):
					self.board[row][col] = originalVal
					self.displayTextObject.destroy()
					self.displayError("You can't build there")
				elif self.gold < self.iceTowerCost:
					self.board[row][col] = originalVal
					self.displayTextObject.destroy()
					self.displayError("Not enough gold")
				else:
					self.towers[row][col] = IceTower(
							self, self.midPoints[row][col])
					#Delete current square
					# self.tiles[row][col].removeNode()
					#Redraw it as tower
					self.drawTile(row, col)
					#Built a tower, so no longer highlighting tile
					self.mousePressed = False
					#No need for text; no tile selected
					self.displayTextObject.destroy()
					self.createPath(self.start, self.end)
					self.gold -= self.iceTowerCost
					if self.displayGameInfoNode1 != None:
						self.displayGameInfoNode1.destroy()
					self.displayGameInfoNode.destroy()
					self.displayGameInfo()
		
#*************************UI Display*************************
	def displayText(self):
		text = "Row: " + str(self.currentRow)+\
			" Col: " + str(self.currentCol) +\
			"\nPress to build       ' a '  Arrow Tower" +\
			"       ' f '  Fire Tower"+\
			"       ' i '  Ice Tower"
		self.displayTextObject = OnscreenText(
								text=text, 
								pos = (0.005, 0.95), 
								scale = (0.05),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
								frame = (1, 0, 0, 1)
											  )
	def displayError(self, text):
		text = text
		self.displayTextObject = OnscreenText(
								text=text, 
								pos = (0.005, 0.91), 
								scale = (0.1),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
								frame = (1, 0, 0, 1)
											  )
	def displayBuildTime(self, time):
		text = "Next wave"
		self.displayNextWave = OnscreenText(
								text=text, 
								pos = (1.05, 0.91), 
								scale = (0.06),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
								frame = (1, 0, 0, 1)
											  )
		self.currentBuildTimeInt = int(time)
		text = str(self.currentBuildTimeInt)
		self.displayNextWaveTime = OnscreenText(
								text=text, 
								pos = (1.0485, 0.69), 
								scale = (0.2253),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
								frame = (1, 0, 0, 1)
											  )
	def displayGameInfo(self):
		text = "Level: " + str(self.level) + "\n" +\
			   "Gold:  " + str(self.gold) + "\n" +\
			   "Lives: " + str(self.lives)
		self.displayGameInfoNode = OnscreenText(
									text=text,
									pos = (-1.3, 0.88),
									scale = (0.09),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
									frame = (1, 0, 0, 1),
									align = TextNode.ALeft
												)
		#Has a value other than 0
		if self.fireTime == True:
			text = "Creep HP:   " + str(self.totalHp)
			self.displayGameInfoNode1 = OnscreenText(
										text=text,
										pos = (-1.12, 0.55),
										scale = (0.06),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
										frame = (1, 0, 0, 1)
													)
	def displayTowerInfo(self):
		text = "Arrow\nDmg: 10\nRate: 0.5s\nRange: 30\nCost: 10\n\n" +\
			   "Fire \nDmg: 7\nRate: 0.2s\nRange: 20\nCost: 25\n\n" +\
			   "Ice  \nDmg: 5\nRate: 0.5s\nRange: 25\nSlow: 60%\nCost: 30"
		self.displayTowerInfoNode = OnscreenText(
									text=text,
									pos = (-1.32, 0.0),
									scale = (0.05),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
									frame = (1, 0, 0, 1),
									align = TextNode.ALeft
												)
	def displayControls(self):
		text = "Select A Tile\n" +\
				"a - Arrow Tower\n" +\
				"f - Fire Tower\n" +\
				"i - Ice Tower\n" +\
				"q - quit"
		self.displayControlsNode = OnscreenText(
									text=text,
									pos = (.95, 0),
									scale = (0.05),
								bg = (209/255.0, 168/255.0, 132/255.0, 1),
									frame = (1, 0, 0, 1),
									align = TextNode.ALeft
												)
		
	def displayGameOver(self):
		text = "GAME OVER"
		self.displayGameOverNode = OnscreenText(
									text=text,
									pos = (0, 0),
									scale = (0.3),
									bg = (0, 0, 1, 1),
									frame = (1, 0, 0, 1)
												)
		sleep(1)
		sleep(5)
	def quit(self):
		sys.exit()
#********************* Spawn Creeps ************************
	def spawnWave(self, task):
		if self.interval < task.time:
			if len(self.creeps) < self.numberOfCreeps:
				self.spawnCreep()
				self.interval = task.time+1
			else:
				self.hasSpawnedWave = True
	def spawnCreep(self):
		if len(self.creeps) < self.numberOfCreeps:
			currentCreep = len(self.creeps)
			self.creeps.append(Creep(self, self.midPoints, currentCreep))
			self.creeps[currentCreep].spawn() #Most recently added creep
			self.creeps[currentCreep].move(self.pathSequence)
	#Checks to see if any creeps left
	def isCreeps(self):
		for creep in self.creeps:
			#Creep exists
			if creep:
				return True
		self.creeps = []
		return False

#********************* Level Handler ********************* 
	def levelUp(self):
		self.level += 1
		if self.displayGameInfoNode1 != None:
			self.displayGameInfoNode1.destroy()
		self.displayGameInfoNode.destroy()
		self.displayGameInfo()
コード例 #16
0
ファイル: TimCol.py プロジェクト: HepcatNZ/EmpiresOfSuburbia
    def __init__(self):
        base.cTrav = CollisionTraverser()
        self.col_handler = CollisionHandlerEvent()

        self.selected = -1
        self.selected_node = None
        self.selecteds = []
        self.multi_select = False
        self.multi_selecting = False
        self.select_box = NodePath()

        picker_node = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(picker_node)
        self.pickerRay = CollisionRay()
        picker_node.addSolid(self.pickerRay)

        plane_node = CollisionNode("base_plane")
        plane = base.render.attachNewNode(plane_node)
        self.plane_col = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        picker_node.addSolid(self.pickerRay)

        picker_node.setTag("rays", "mray")
        base.cTrav.addCollider(pickerNPos, self.col_handler)

        self.col_handler.addInPattern("%(rays)ft-into-%(type)it")
        self.col_handler.addOutPattern("%(rays)ft-out-%(type)it")

        self.col_handler.addAgainPattern("ray_again_all%("
                                         "rays"
                                         ")fh%("
                                         "type"
                                         ")ih")

        self.DO = DirectObject()

        self.DO.accept('mray-into-army', self.col_in_object)
        self.DO.accept('mray-out-army', self.col_out_object)
        self.DO.accept('mray-into-battle', self.col_in_object)
        self.DO.accept('mray-out-battle', self.col_out_object)
        self.DO.accept('mray-into-tower', self.col_in_object)
        self.DO.accept('mray-out-tower', self.col_out_object)

        self.DO.accept('ray_again_all', self.col_against_object)

        if base.client == False:
            self.col_handler.addInPattern("%(player)ft-into-%(player)it")
            self.col_handler.addInPattern("%(type)ft-into-%(type)it")
            self.DO.accept('army-into-battle', self.col_army_against_battle)
            self.DO.accept('army-into-tower', self.col_army_against_tower)
            self.DO.accept('1-into-2', self.col_p1_into_p2)

        self.pickable = None

        self.DO.accept('mouse1', self.mouse_click, ["down"])
        self.DO.accept('mouse1-up', self.mouse_click, ["up"])
        self.DO.accept('mouse3-up', self.mouse_order)

        taskMgr.add(self.ray_update, "updatePicker")
        taskMgr.add(self.task_select_check, "updatePicker")
        taskMgr.add(self.get_mouse_plane_pos, "MousePositionOnPlane")

        z = 0
        self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))

        self.model = loader.loadModel("models/chest.egg")
        self.model.reparentTo(render)
        self.model.hide()
        cm = CardMaker("blah")
        cm.setFrame(-100, 100, -100, 100)
        pnode = render.attachNewNode(cm.generate())  #.lookAt(0, 0, -1)
        pnode.hide()
コード例 #17
0
ファイル: TimCol.py プロジェクト: HepcatNZ/EmpiresOfSuburbia
class CollisionManager:
    def __init__(self):
        base.cTrav = CollisionTraverser()
        self.col_handler = CollisionHandlerEvent()

        self.selected = -1
        self.selected_node = None
        self.selecteds = []
        self.multi_select = False
        self.multi_selecting = False
        self.select_box = NodePath()

        picker_node = CollisionNode("mouseRayNode")
        pickerNPos = base.camera.attachNewNode(picker_node)
        self.pickerRay = CollisionRay()
        picker_node.addSolid(self.pickerRay)

        plane_node = CollisionNode("base_plane")
        plane = base.render.attachNewNode(plane_node)
        self.plane_col = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, 0)))
        picker_node.addSolid(self.pickerRay)

        picker_node.setTag("rays", "mray")
        base.cTrav.addCollider(pickerNPos, self.col_handler)

        self.col_handler.addInPattern("%(rays)ft-into-%(type)it")
        self.col_handler.addOutPattern("%(rays)ft-out-%(type)it")

        self.col_handler.addAgainPattern("ray_again_all%("
                                         "rays"
                                         ")fh%("
                                         "type"
                                         ")ih")

        self.DO = DirectObject()

        self.DO.accept('mray-into-army', self.col_in_object)
        self.DO.accept('mray-out-army', self.col_out_object)
        self.DO.accept('mray-into-battle', self.col_in_object)
        self.DO.accept('mray-out-battle', self.col_out_object)
        self.DO.accept('mray-into-tower', self.col_in_object)
        self.DO.accept('mray-out-tower', self.col_out_object)

        self.DO.accept('ray_again_all', self.col_against_object)

        if base.client == False:
            self.col_handler.addInPattern("%(player)ft-into-%(player)it")
            self.col_handler.addInPattern("%(type)ft-into-%(type)it")
            self.DO.accept('army-into-battle', self.col_army_against_battle)
            self.DO.accept('army-into-tower', self.col_army_against_tower)
            self.DO.accept('1-into-2', self.col_p1_into_p2)

        self.pickable = None

        self.DO.accept('mouse1', self.mouse_click, ["down"])
        self.DO.accept('mouse1-up', self.mouse_click, ["up"])
        self.DO.accept('mouse3-up', self.mouse_order)

        taskMgr.add(self.ray_update, "updatePicker")
        taskMgr.add(self.task_select_check, "updatePicker")
        taskMgr.add(self.get_mouse_plane_pos, "MousePositionOnPlane")

        z = 0
        self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))

        self.model = loader.loadModel("models/chest.egg")
        self.model.reparentTo(render)
        self.model.hide()
        cm = CardMaker("blah")
        cm.setFrame(-100, 100, -100, 100)
        pnode = render.attachNewNode(cm.generate())  #.lookAt(0, 0, -1)
        pnode.hide()

    def col_army_against_battle(self, entry):
        print "Army Joins!"
        #base.net_manager.battle_join(bat,army)
        army = entry.getFromNodePath()
        a_id = int(army.getParent().getTag("id"))
        a = base.armies[a_id]
        if a.state == "normal":
            battle = entry.getIntoNodePath()
            b_id = int(battle.getParent().getTag("id"))
            if base.single_player == False:
                base.net_manager.server_messager(
                    "battle_armyadd",
                    [b_id, a_id,
                     a.node_path.getX(),
                     a.node_path.getY()])

            a = base.armies[a_id]
            b = base.battles[b_id]
            b.add_army(a)

    def col_p1_into_p2(self, entry):
        if entry.getFromNodePath().getTag(
                "state") == "normal" and entry.getIntoNodePath().getTag(
                    "state") == "normal" and entry.getIntoNodePath().getTag(
                        "type") == "army" and entry.getFromNodePath().getTag(
                            "type") == "army":
            #base.net_manager.battle_start(a1,a2)
            army1 = entry.getFromNodePath()
            army2 = entry.getIntoNodePath()
            a1_id = int(army1.getParent().getTag("id"))
            a2_id = int(army2.getParent().getTag("id"))
            a1 = base.armies[a1_id]
            a2 = base.armies[a2_id]
            a1.stop()
            a2.stop()
            base.battles.append(TimObjects.Battle([a1, a2]))

    def col_army_against_tower(self, entry):
        print "TOWER COLLIDE", entry.getIntoNodePath().getParent().getTag("id")
        print entry.getIntoNodePath().getParent().getTag(
            "player"), "vs", entry.getFromNodePath().getParent().getTag(
                "player")
        if entry.getIntoNodePath().getParent().getTag(
                "player") != entry.getFromNodePath().getParent().getTag(
                    "player"):
            tower = entry.getIntoNodePath()
            tower_id = int(tower.getParent().getTag("id"))
            invader = int(entry.getFromNodePath().getParent().getTag("player"))
            if base.client == False and base.towers[tower_id].capture_check():
                base.towers[tower_id].change_owner(invader)
                if base.single_player == False:
                    base.net_manager.server_messager("tower_capture",
                                                     [tower_id, invader])

    def col_in_object(self, entry):
        np_into = entry.getIntoNodePath()
        np_into.getParent().setColor(0.5, 0.5, 0.5, 0.1)
        #self.global_text.setText(np_into.getName())
        if np_into.getTag("type") == "battle":
            print "You're in a battle"

        #print "in"

    def col_out_object(self, entry):
        np_into = entry.getIntoNodePath()
        #print "out"
        try:
            np_into.getParent().setColor(1, 1, 1, 1)
        except:
            print "ERROR CLEARING COLOUR"
        #self.global_text.setText("")

        self.pickable = None
        self.selected_type = "none"

    def col_against_object(self, entry):
        if entry.getIntoNodePath().getParent() != self.pickable:

            np_from = entry.getFromNodePath()
            np_into = entry.getIntoNodePath()
            self.selected_type = np_into.getTag("type")

            self.pickable = np_into.getParent()

    def mouse_click(self, status):
        print "click"
        in_statbar = base.vis_manager.statbar.mouse_in_bar()
        if self.pickable and in_statbar == False:
            if status == "down":
                if self.selected_type == "army":
                    if base.armies[int(self.pickable.getTag(
                            "id"))].state == "normal" or base.armies[int(
                                self.pickable.getTag("id"))].state == "new":
                        for obj in self.selecteds:
                            obj.deselect()
                            print obj.my_id, "deselected"
                        self.selecteds = []
                        self.pickable.setScale(0.95 * 10)
                        self.selected = int(self.pickable.getTag("id"))
                        self.selected_node = self.pickable
                        self.selecteds.append(base.armies[self.selected])
                        base.armies[self.selected].select()
                        print "You clicked on Army" + str(self.selected)
                        base.vis_manager.statbar.show_army(self.selected)
                elif self.selected_type == "tower":
                    for obj in self.selecteds:
                        obj.deselect()
                        print obj.my_id, "deselected"
                    self.selecteds = []
                    self.selected = int(self.pickable.getTag("id"))
                    self.selected_node = self.pickable
                    self.selecteds.append(base.towers[self.selected])
                    base.towers[self.selected].select()
                    print "You clicked on a tower"
                    base.vis_manager.statbar.show_tower(self.selected)
                elif self.selected_type == "battle":
                    self.selected = int(self.pickable.getTag("id"))
                    self.selected_node = self.pickable
                    print "You clicked on a battle"
                    base.vis_manager.statbar.show_battle(self.selected)

            if status == "up":
                if self.selected_type == "army":
                    self.pickable.setScale(1.0 * 10)
        elif status == "up" and self.multi_select == True:
            self.multi_select = False
            self.select_all_in_box()
        elif in_statbar == True:
            print "in box"
        elif self.pickable == None:
            for obj in self.selecteds:
                obj.deselect()
                print obj.my_id, "deselected"
            self.selecteds = []
            self.selected = -1
            self.selected_node = None
            base.vis_manager.statbar.reset_statbar()

    def select_all_in_box(self):
        for obj in self.selecteds:
            obj.deselect()
            print obj.my_id, "deselected"
        self.selecteds = []
        print "select units in box"
        for a in base.armies:
            if a.node_col.getTag("type") == "army" and (
                    a.state == "normal"
                    or a.state == "new") and a.player == base.player:
                x = a.get_x()
                y = a.get_y()
                if self.box_x < self.model.getX(
                ) and self.box_y > self.model.getY():
                    if x < self.model.getX(
                    ) and x > self.box_x and y > self.model.getY(
                    ) and y < self.box_y:
                        self.selecteds.append(a)
                        a.select()
                elif self.box_x < self.model.getX(
                ) and self.box_y < self.model.getY():
                    if x < self.model.getX(
                    ) and x > self.box_x and y < self.model.getY(
                    ) and y > self.box_y:
                        self.selecteds.append(a)
                        a.select()
                elif self.box_x > self.model.getX(
                ) and self.box_y < self.model.getY():
                    if x > self.model.getX(
                    ) and x < self.box_x and y < self.model.getY(
                    ) and y > self.box_y:
                        self.selecteds.append(a)
                        a.select()
                elif self.box_x > self.model.getX(
                ) and self.box_y > self.model.getY():
                    if x > self.model.getX(
                    ) and x < self.box_x and y > self.model.getY(
                    ) and y < self.box_y:
                        self.selecteds.append(a)
                        a.select()

    def task_select_check(self, task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            #if self.multi_select == True:
            self.box_x, self.box_y = self.model.getX(), self.model.getY()
            taskMgr.add(self.draw_multiselect_box, "multibox")
            return task.done
        return task.cont

    def draw_multiselect_box(self, task):
        if base.mouseWatcherNode.isButtonDown(MouseButton.one()):
            self.multi_select = True
            self.select_box.remove()
            ls = LineSegs()
            ls.move_to(self.box_x, self.box_y, 1)
            ls.draw_to(self.model.getX(), self.box_y, 1)
            ls.draw_to(self.model.getX(), self.model.getY(), 1)
            ls.draw_to(self.box_x, self.model.getY(), 1)
            ls.draw_to(self.box_x, self.box_y, 1)
            node = ls.create()
            #text = TextNode('text')
            #text.setText(str(self.box_x)+","+str(self.box_y)+"\n"+str(self.model.getX())+","+str(self.model.getY()))
            #textnp = NodePath(text)
            #textnp.setPos(self.box_x,self.box_y,1)
            #textnp.setHpr(0,-90,0)
            #textnp.setScale(20.0)
            self.select_box = NodePath(node)
            #textnp.reparentTo(self.select_box)
            self.select_box.reparentTo(render)
            return task.cont
        else:
            self.select_box.hide()
            taskMgr.add(self.task_select_check, "updatePicker")
            return task.done

    def mouse_order(self):
        print "mouse_order"
        #        if self.selected != -1 and base.armies[self.selected].state == "normal":
        #            print "orders sent"
        for a in self.selecteds:
            if a.node_col.getTag("type") == "army":
                if len(self.selecteds) > 1:
                    randomness = (len(self.selecteds) - 1) * 10
                    a.set_target(
                        True,
                        self.pos3d.getX() + random.randint(0, randomness) -
                        randomness / 2,
                        self.pos3d.getY() + random.randint(0, randomness) -
                        randomness / 2)
                else:
                    a.set_target(True, self.pos3d.getX(), self.pos3d.getY())

    def get_mouse_plane_pos(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()
            self.pos3d = Point3()
            nearPoint = Point3()
            farPoint = Point3()
            base.camLens.extrude(mpos, nearPoint, farPoint)
            if self.plane.intersectsLine(
                    self.pos3d, render.getRelativePoint(camera, nearPoint),
                    render.getRelativePoint(camera, farPoint)):
                #print "Mouse ray intersects ground plane at ", self.pos3d
                self.model.setPos(render, self.pos3d)
        return task.again

    def ray_update(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()

            self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
        return task.cont
コード例 #18
0
    def load(self):
        CogdoGameMovie.load(self)
        self.toonDNA = ToonDNA.ToonDNA()
        self.toonDNA.newToonFromProperties('dss', 'ss', 'm', 'm', 2, 0, 2, 2,
                                           1, 8, 1, 8, 1, 14)
        self.toonHead = Toon.Toon()
        self.toonHead.setDNA(self.toonDNA)
        self.makeSuit('sc')
        self.toonHead.getGeomNode().setDepthWrite(1)
        self.toonHead.getGeomNode().setDepthTest(1)
        self.toonHead.loop('neutral')
        self.toonHead.setPosHprScale(-0.73, 0, -1.27, 180, 0, 0, 0.18, 0.18,
                                     0.18)
        self.toonHead.reparentTo(hidden)
        self.toonHead.startBlink()
        self.cogHead = Suit.Suit()
        self.cogDNA = SuitDNA.SuitDNA()
        self.cogDNA.newSuit('ms')
        self.cogHead.setDNA(self.cogDNA)
        self.cogHead.getGeomNode().setDepthWrite(1)
        self.cogHead.getGeomNode().setDepthTest(1)
        self.cogHead.loop('neutral')
        self.cogHead.setPosHprScale(-0.73, 0, -1.46, 180, 0, 0, 0.14, 0.14,
                                    0.14)
        self.cogHead.reparentTo(hidden)
        self.clipPlane = self.toonHead.attachNewNode(PlaneNode('clip'))
        self.clipPlane.node().setPlane(Plane(0, 0, 1, 0))
        self.clipPlane.setPos(0, 0, 2.45)
        audioMgr = base.cogdoGameAudioMgr
        self._cogDialogueSfx = audioMgr.createSfx('cogDialogue')
        self._toonDialogueSfx = audioMgr.createSfx('toonDialogue')
        suitData = Globals.SuitData[Globals.SuitTypes.Boss]
        bossSuit = Suit.Suit()
        d = SuitDNA.SuitDNA()
        d.newSuit(suitData['dnaName'])
        bossSuit.setDNA(d)
        bossSuit.setScale(suitData['scale'])
        bossSuit.loop('neutral')
        bossSuit.reparentTo(render)
        bossSuit.setPos(self._exit, -5, -5, 0)
        bossSuit.lookAt(self._exit)
        self._suits.append(bossSuit)
        self._camHelperNode = NodePath('CamHelperNode')
        self._camHelperNode.reparentTo(render)
        dialogue = TTLocalizer.CogdoMazeIntroMovieDialogue
        introDuration = Globals.IntroDurationSeconds
        waitDuration = introDuration / len(dialogue)

        def start():
            camera.wrtReparentTo(render)
            self._exit.open(animate=False)

        def showBoss():
            self._setCamTarget(bossSuit,
                               20,
                               offset=Point3(0, 0, 7),
                               angle=Point3(0, 15, 0))
            bossSuit.loop('victory')
            self._state = 1

        def showExit():
            self._setCamTarget(self._exit,
                               10,
                               offset=Point3(0, 0, 0),
                               angle=Point3(0, 60, 0))
            self._exit.close()
            self._state = 2

        showExitIval = Parallel(
            camera.posInterval(waitDuration * 0.5, (10, -25, 20),
                               other=self._exit,
                               blendType='easeInOut'),
            Sequence(
                Wait(waitDuration * 0.25), Func(bossSuit.play, 'effort'),
                camera.hprInterval(waitDuration * 0.25, (30, -30, 0),
                                   blendType='easeInOut'),
                Func(self._exit.close), Wait(waitDuration * 0.5)))

        def showWaterCooler():
            wc = self._maze.getWaterCoolers()[0]
            self._setCamTarget(wc, 25, angle=Point3(-30, 60, 0))
            camera.wrtReparentTo(self._camHelperNode)
            self._state = 3

        def end():
            self._stopUpdateTask()

        self._ival = Sequence(
            Func(start),
            Func(self.displayLine, 'toon', self._getRandomLine(dialogue[0])),
            showExitIval, Func(showWaterCooler),
            Func(self.displayLine, 'toon', self._getRandomLine(dialogue[1])),
            Wait(waitDuration), Func(showBoss),
            bossSuit.hprInterval(1.0,
                                 bossSuit.getHpr() + Point3(180, 0, 0),
                                 blendType='easeInOut'),
            Func(self.displayLine, 'toon', self._getRandomLine(dialogue[2])),
            Wait(waitDuration - 1.0), Func(end))
        self._startUpdateTask()
コード例 #19
0
class PointerSystem():
    """
        Handles user pointer (mouse) input. Contains information and
         functionality related to selecting and highlighting tiles.
    """
    def __init__(self, tileMap):
        self._tileMap = tileMap
        self._groundPlane = Plane(Point3(0, 0, 1), Point3(0, 0, 1))
        self._hoveredCoord = None  # The coordinates we are hovering over.
        self._highlightMode = None  # Targeter reference
        self._highlightModeParams = None  # Targeter params dict
        self._highlightedTiles = list()  # List of tile highlighted by pointer.
        self._previewTiles = list()  # List of tiles highlighted by preview.

        # Perform mouse raycasting every frame:
        taskMgr.add(self._updateHovered, "mouseScanning")

    def _updateHovered(self, task):
        """
            Updates the position of the Highlighter selector based on mouse
             position.
            Only updates if the value should change. Should not call every frame
             unless the user can shake his/her mouse really fast between tiles.
        """
        if base.mouseWatcherNode.hasMouse():  # If mouse is in the window:
            # Draw a line from the point on screen through the camera to the
            #  imaginary plane and check for intersections:
            mPos = base.mouseWatcherNode.getMouse()
            pos3D = Point3()  # Output stored here.
            nearPoint = Point3()
            farPoint = Point3()
            base.camLens.extrude(mPos, nearPoint, farPoint)  # Create a line
            # Check for intersection:
            if self._groundPlane.intersectsLine(
                    pos3D, render.getRelativePoint(base.cam, nearPoint),
                    render.getRelativePoint(base.cam, farPoint)):
                highlCoords = Point2D(int(pos3D.x), int(pos3D.y))
                # Ensure the calculated position is a valid tile:
                if self._hoveredCoord != highlCoords and\
                        self._tileMap.isFloor(highlCoords):
                    self._hoveredCoord = highlCoords
                    self._highlightTiles()
                elif self._hoveredCoord != None and\
                                         not self._tileMap.isFloor(highlCoords):
                    self._hoveredCoord = None
                    self._highlightTiles()
        return task.cont

    def setHighightMode(self, mode, params=None):
        """
            Sets the current method of highlighting nodes given a mode.
            Params allow for customizations specific to each mode, such as range
             or AOE size.
        """
        self._highlightMode = mode
        self._highlightModeParams = params
        # For special cases, show a preview highlight:
        if self._highlightMode == Targeter.SelfReachPosition:
            origin = self._highlightModeParams['origin']
            reach = self._highlightModeParams['reach']
            tiles = getAreaTiles(origin, self._tileMap, reach)
            self._highlightPreviewTiles(tiles)

    def resetHighlightMode(self):
        """
            Resets highlight mode to None and removes all highlighted tiles.
        """
        self._highlightMode = None
        self._highlightModeParams = dict()
        # Remove all previous highlights:
        while len(self._highlightedTiles) > 0:
            selector = self._highlightedTiles.pop(0)
            selector.destroy()
        while len(self._previewTiles) > 0:
            selector = self._previewTiles.pop(0)
            selector.destroy()

    def _highlightPreviewTiles(self, coordsList):
        """
            Preview highlights the given positions. Assumes valid positions.
        """
        # Remove all previous highlights:
        while len(self._previewTiles) > 0:
            selector = self._previewTiles.pop(0)
            selector.destroy()
        # Create new previewers for each position:
        count = 0
        for coord in coordsList:
            newHighlight = Selector("PreviewH %d" % count, PREVIEWER_TINT,
                                    True)
            newHighlight.showAt(coord)
            self._previewTiles.append(newHighlight)
            count += 1

    def _highlightTiles(self):
        """
            Highlights the tiles given by list of tile positions as highlighted
             by the player's pointer.
            Highlights in different ways depending on the highlightMode
        """
        # Remove all previous highlights:
        while len(self._highlightedTiles) > 0:
            selector = self._highlightedTiles.pop(0)
            selector.destroy()
        # Depending on the highlight mode, fill a list of highlighted positions:
        coordsList = list()  # List of Point2D()

        if self._highlightMode == Targeter.SelfPath and\
                                  self._hoveredCoord != None:
            # coordsList is the path to the tile from the current position.
            fromPos = self._highlightModeParams['origin']
            if self._hoveredCoord != fromPos:
                coordsList = findTilesFromTo(fromPos, self._hoveredCoord,
                                             self._tileMap)
        elif self._highlightMode == Targeter.SelfReachPosition and\
                                  self._hoveredCoord != None:
            if tileWithinRange(self._highlightModeParams['origin'],
                               self._highlightModeParams['reach'],
                               self._hoveredCoord):
                # Note, user is allowed to hit themselves!
                coordsList.append(self._hoveredCoord)

        if coordsList != None:
            count = 0
            for coord in coordsList:
                newHighlight = Selector("HighL %d" % count, HIGHLIGHTER_TINT)
                newHighlight.showAt(coord)
                self._highlightedTiles.append(newHighlight)
                count += 1

    def getHovered(self):
        return self._hoveredCoord