Exemple #1
0
class RepairGridPiece(DirectButton, FSM.FSM):
    def __init__(self, name, parent, allWoodSquaresGeom, selectedOutlineGeom,
                 command, location, **kw):
        optiondefs = ()
        self.defineoptions(kw, optiondefs)
        DirectButton.__init__(self, parent, **None)
        self.initialiseoptions(RepairGridPiece)
        FSM.FSM.__init__(self, 'RepairGridPiece_%sFSM' % name)
        self.name = name
        self.allWoodSquaresGeom = allWoodSquaresGeom
        self.selectedOutlineGeom = selectedOutlineGeom
        self.command = command
        self.location = location
        self._initVars()
        self._initGUI()
        self._initIntervals()
        self.accept(self.guiItem.getEnterEvent(), self.onMouseEnter)
        self.accept(self.guiItem.getExitEvent(), self.onMouseExit)
        self.bind(DGG.B1PRESS, self.onMouseDown)
        self.bind(DGG.B1RELEASE, self.onMouseUp)
        self.bind(DGG.B2PRESS, self.onMouseUp)
        self.bind(DGG.B2RELEASE, self.onMouseUp)
        self.bind(DGG.B3PRESS, self.onMouseUp)
        self.bind(DGG.B3RELEASE, self.onMouseUp)
        self.idleGeom = NodePath('idleGeom')
        self.highlightedGeom = NodePath('highlightedGeom')
        self.haveMoved = False
        self.grabPoint = None
        self.setType(GOAL_NONE)

    def _initVars(self):
        self.pieceType = GOAL_NONE
        self.enabled = True
        self.isMouseDown = False
        self.isMouseInButton = False

    def _initGUI(self):
        self.selectedOutlineGeom.reparentTo(self)
        self.selectedOutlineGeom.hide()
        self.selectedOutlineGeom.setBin('fixed', 38)

    def _initIntervals(self):
        self.moveInterval = LerpPosInterval(
            self,
            duration=RepairGlobals.Bracing.moveTime,
            pos=self.getPos(),
            name='RepairGridPiece_%s.moveInterval' % self.name)

    def destroy(self):
        taskMgr.remove(self.uniqueName('RepairGridPiece.updateTask'))
        taskMgr.remove(DGG.B1PRESS)
        taskMgr.remove(DGG.B1RELEASE)
        taskMgr.remove(DGG.B2PRESS)
        taskMgr.remove(DGG.B2RELEASE)
        taskMgr.remove(DGG.B3PRESS)
        taskMgr.remove(DGG.B3RELEASE)
        self.idleGeom.detachNode()
        self.idleGeom = None
        self.highlightedGeom.detachNode()
        self.highlightedGeom = None
        self.ignore(self.guiItem.getEnterEvent())
        self.ignore(self.guiItem.getExitEvent())
        self.moveInterval.clearToInitial()
        del self.moveInterval
        DirectFrame.destroy(self)
        self.clearPiece()
        self.allWoodSquaresGeom.removeNode()
        del self.allWoodSquaresGeom

    def setGeomState(self, state):
        if state == 'idle':
            self.idleGeom.show()
            self.highlightedGeom.hide()
        elif state == 'highlighted':
            self.highlightedGeom.show()
            self.idleGeom.hide()

    def onMouseEnter(self, event):
        self.isMouseInButton = True
        if self.isMouseDown:
            self.setGeomState('idle')
        else:
            self.setGeomState('highlighted')

    def onMouseExit(self, event):
        self.isMouseInButton = False
        self.setGeomState('idle')

    def onMouseDown(self, event):
        if self.isMouseInButton:
            self.selectedOutlineGeom.show()
            self.setGeomState('idle')
            self.isMouseDown = True
            self.haveMoved = False
            screenx = base.mouseWatcherNode.getMouseX()
            screeny = base.mouseWatcherNode.getMouseY()
            self.grabPoint = aspect2d.getRelativePoint(render2d,
                                                       (screenx, 0, screeny))
            taskMgr.add(self.updateTask,
                        self.uniqueName('RepairGridPiece.updateTask'),
                        extraArgs=[])

    def onMouseUp(self, event):
        if self.isMouseDown:
            self.isMouseDown = False
            if not self.haveMoved:
                self.checkMovePiece(True)

            self.grabPoint = None
            if self.isMouseInButton:
                self.setGeomState('highlighted')
            else:
                self.setGeomState('idle')
            self.selectedOutlineGeom.hide()
            taskMgr.remove(self.uniqueName('RepairGridPiece.updateTask'))

    def onMoveButtonPressed(self, dir1, dir2):
        if not self.moveInterval.isPlaying():
            self.haveMoved = True
            args = self.location[:]
            args.append((dir1, dir2))
            return self.command(*args)

    def updateTask(self):
        if not (self.isMouseInButton) and not self.moveInterval.isPlaying():
            self.checkMovePiece()

        return Task.cont

    def checkMovePiece(self, isPush=False):
        directions = [(0, 1), (0, -1), (-1, 0), (1, 0)]
        if self.grabPoint is None:
            self.grabPoint = self.getPos(aspect2d)

        screenx = base.mouseWatcherNode.getMouseX()
        screeny = base.mouseWatcherNode.getMouseY()
        cursorPos = aspect2d.getRelativePoint(render2d, (screenx, 0, screeny))
        diff = self.grabPoint - cursorPos
        absX = math.fabs(diff.getX())
        absZ = math.fabs(diff.getZ())
        moveDirection = None
        if isPush:
            threshold = RepairGlobals.Bracing.pushPieceThreshold
        else:
            threshold = RepairGlobals.Bracing.movePieceThreshold
        if absZ > absX and diff.getZ() > 0.0 and absZ > threshold:
            moveDirection = directions[1]
        elif absZ > absX and diff.getZ() < 0.0 and absZ > threshold:
            moveDirection = directions[0]
        elif absX > absZ and diff.getX() > 0.0 and absX > threshold:
            moveDirection = directions[2]
        elif absX > absZ and diff.getX() < 0.0 and absX > threshold:
            moveDirection = directions[3]

        if moveDirection:
            if self.onMoveButtonPressed(
                    *moveDirection) and self.grabPoint is not None:
                self.grabPoint += VBase3(SPACING * moveDirection[0], 0.0,
                                         SPACING * moveDirection[1])

    def setType(self, type):
        self.pieceType = type
        activeWoodSquareGeom = self.allWoodSquaresGeom.find(
            '**/%s' % GOAL_TO_TEXTURE[type])
        self.idleGeom.detachNode()
        self.idleGeom = None
        self.highlightedGeom.detachNode()
        self.highlightedGeom = None
        self.idleGeom = NodePath('idleGeom')
        self.highlightedGeom = NodePath('highlightedGeom')
        self.idleGeom.reparentTo(self)
        self.highlightedGeom.reparentTo(self)
        if activeWoodSquareGeom.isEmpty():
            self.stash()
        else:
            activeWoodSquareGeom.find('**/idle').copyTo(self.idleGeom)
            activeWoodSquareGeom.find('**/over').copyTo(self.highlightedGeom)
            self.setGeomState('idle')
            self.unstash()

    def setEnabled(self, enabled):
        self.onMouseUp(None)
        self.enabled = enabled
        if not enabled:
            self['state'] = DGG.DISABLED
        else:
            self['state'] = DGG.NORMAL

    def isGoalPiece(self):
        if self.pieceType != GOAL_NONE:
            pass
        return self.pieceType != GOAL_EMPTY

    def isEmptyPiece(self):
        return self.pieceType == GOAL_EMPTY

    def setGridLocation(self, location, pos):
        self.location = location
        self.setPos(pos)

    def enterIdle(self):
        self.stash()
        self.setEnabled(False)

    def exitIdle(self):
        self.unstash()

    def enterBlank(self):
        self.setType(GOAL_NONE)

    def exitBlank(self):
        self.unstash()

    def enterGoal(self, pieceType):
        self.setType(pieceType)

    def exitGoal(self):
        self.unstash()

    def enterEmpty(self):
        self.setEnabled(False)
        self.setType(GOAL_EMPTY)

    def exitEmpty(self):
        self.unstash()
class RepairGridPiece(DirectButton, FSM.FSM):

    def __init__(self, name, parent, allWoodSquaresGeom, selectedOutlineGeom, command, location, **kw):
        optiondefs = ()
        self.defineoptions(kw, optiondefs)
        DirectButton.__init__(self, parent)
        self.initialiseoptions(RepairGridPiece)
        FSM.FSM.__init__(self, 'RepairGridPiece_%sFSM' % name)
        self.name = name
        self.allWoodSquaresGeom = allWoodSquaresGeom
        self.selectedOutlineGeom = selectedOutlineGeom
        self.command = command
        self.location = location
        self._initVars()
        self._initGUI()
        self._initIntervals()
        self.accept(self.guiItem.getEnterEvent(), self.onMouseEnter)
        self.accept(self.guiItem.getExitEvent(), self.onMouseExit)
        self.bind(DGG.B1PRESS, self.onMouseDown)
        self.bind(DGG.B1RELEASE, self.onMouseUp)
        self.bind(DGG.B2PRESS, self.onMouseUp)
        self.bind(DGG.B2RELEASE, self.onMouseUp)
        self.bind(DGG.B3PRESS, self.onMouseUp)
        self.bind(DGG.B3RELEASE, self.onMouseUp)
        self.idleGeom = NodePath('idleGeom')
        self.highlightedGeom = NodePath('highlightedGeom')
        self.haveMoved = False
        self.grabPoint = None
        self.setType(GOAL_NONE)


    def _initVars(self):
        self.pieceType = GOAL_NONE
        self.enabled = True
        self.isMouseDown = False
        self.isMouseInButton = False


    def _initGUI(self):
        self.selectedOutlineGeom.reparentTo(self)
        self.selectedOutlineGeom.hide()
        self.selectedOutlineGeom.setBin('fixed', 38)


    def _initIntervals(self):
        self.moveInterval = LerpPosInterval(self, duration = RepairGlobals.Bracing.moveTime, pos = self.getPos(), name = 'RepairGridPiece_%s.moveInterval' % self.name)


    def destroy(self):
        taskMgr.remove(self.uniqueName('RepairGridPiece.updateTask'))
        taskMgr.remove(DGG.B1PRESS)
        taskMgr.remove(DGG.B1RELEASE)
        taskMgr.remove(DGG.B2PRESS)
        taskMgr.remove(DGG.B2RELEASE)
        taskMgr.remove(DGG.B3PRESS)
        taskMgr.remove(DGG.B3RELEASE)
        self.idleGeom.detachNode()
        self.idleGeom = None
        self.highlightedGeom.detachNode()
        self.highlightedGeom = None
        self.ignore(self.guiItem.getEnterEvent())
        self.ignore(self.guiItem.getExitEvent())
        self.moveInterval.clearToInitial()
        del self.moveInterval
        DirectFrame.destroy(self)
        self.clearPiece()
        self.allWoodSquaresGeom.removeNode()
        del self.allWoodSquaresGeom


    def setGeomState(self, state):
        if state == 'idle':
            self.idleGeom.show()
            self.highlightedGeom.hide()
        elif state == 'highlighted':
            self.highlightedGeom.show()
            self.idleGeom.hide()



    def onMouseEnter(self, event):
        self.isMouseInButton = True
        if self.isMouseDown:
            self.setGeomState('idle')
        else:
            self.setGeomState('highlighted')


    def onMouseExit(self, event):
        self.isMouseInButton = False
        self.setGeomState('idle')


    def onMouseDown(self, event):
        if self.isMouseInButton:
            self.selectedOutlineGeom.show()
            self.setGeomState('idle')
            self.isMouseDown = True
            self.haveMoved = False
            screenx = base.mouseWatcherNode.getMouseX()
            screeny = base.mouseWatcherNode.getMouseY()
            self.grabPoint = aspect2d.getRelativePoint(render2d, (screenx, 0, screeny))
            taskMgr.add(self.updateTask, self.uniqueName('RepairGridPiece.updateTask'), extraArgs = [])



    def onMouseUp(self, event):
        if self.isMouseDown:
            self.isMouseDown = False
            if not self.haveMoved:
                self.checkMovePiece(True)

            self.grabPoint = None
            if self.isMouseInButton:
                self.setGeomState('highlighted')
            else:
                self.setGeomState('idle')
            self.selectedOutlineGeom.hide()
            taskMgr.remove(self.uniqueName('RepairGridPiece.updateTask'))



    def onMoveButtonPressed(self, dir1, dir2):
        if not self.moveInterval.isPlaying():
            self.haveMoved = True
            args = self.location[:]
            args.append((dir1, dir2))
            return self.command(*args)



    def updateTask(self):
        if not (self.isMouseInButton) and not self.moveInterval.isPlaying():
            self.checkMovePiece()

        return Task.cont


    def checkMovePiece(self, isPush = False):
        directions = [
            (0, 1),
            (0, -1),
            (-1, 0),
            (1, 0)]
        if self.grabPoint is None:
            self.grabPoint = self.getPos(aspect2d)

        screenx = base.mouseWatcherNode.getMouseX()
        screeny = base.mouseWatcherNode.getMouseY()
        cursorPos = aspect2d.getRelativePoint(render2d, (screenx, 0, screeny))
        diff = self.grabPoint - cursorPos
        absX = math.fabs(diff.getX())
        absZ = math.fabs(diff.getZ())
        moveDirection = None
        if isPush:
            threshold = RepairGlobals.Bracing.pushPieceThreshold
        else:
            threshold = RepairGlobals.Bracing.movePieceThreshold
        if absZ > absX and diff.getZ() > 0.0 and absZ > threshold:
            moveDirection = directions[1]
        elif absZ > absX and diff.getZ() < 0.0 and absZ > threshold:
            moveDirection = directions[0]
        elif absX > absZ and diff.getX() > 0.0 and absX > threshold:
            moveDirection = directions[2]
        elif absX > absZ and diff.getX() < 0.0 and absX > threshold:
            moveDirection = directions[3]

        if moveDirection:
            if self.onMoveButtonPressed(*moveDirection) and self.grabPoint is not None:
                self.grabPoint += VBase3(SPACING * moveDirection[0], 0.0, SPACING * moveDirection[1])




    def setType(self, type):
        self.pieceType = type
        activeWoodSquareGeom = self.allWoodSquaresGeom.find('**/%s' % GOAL_TO_TEXTURE[type])
        self.idleGeom.detachNode()
        self.idleGeom = None
        self.highlightedGeom.detachNode()
        self.highlightedGeom = None
        self.idleGeom = NodePath('idleGeom')
        self.highlightedGeom = NodePath('highlightedGeom')
        self.idleGeom.reparentTo(self)
        self.highlightedGeom.reparentTo(self)
        if activeWoodSquareGeom.isEmpty():
            self.stash()
        else:
            activeWoodSquareGeom.find('**/idle').copyTo(self.idleGeom)
            activeWoodSquareGeom.find('**/over').copyTo(self.highlightedGeom)
            self.setGeomState('idle')
            self.unstash()


    def setEnabled(self, enabled):
        self.onMouseUp(None)
        self.enabled = enabled
        if not enabled:
            self['state'] = DGG.DISABLED
        else:
            self['state'] = DGG.NORMAL


    def isGoalPiece(self):
        if self.pieceType != GOAL_NONE:
            pass
        return self.pieceType != GOAL_EMPTY


    def isEmptyPiece(self):
        return self.pieceType == GOAL_EMPTY


    def setGridLocation(self, location, pos):
        self.location = location
        self.setPos(pos)


    def enterIdle(self):
        self.stash()
        self.setEnabled(False)


    def exitIdle(self):
        self.unstash()


    def enterBlank(self):
        self.setType(GOAL_NONE)


    def exitBlank(self):
        self.unstash()


    def enterGoal(self, pieceType):
        self.setType(pieceType)


    def exitGoal(self):
        self.unstash()


    def enterEmpty(self):
        self.setEnabled(False)
        self.setType(GOAL_EMPTY)


    def exitEmpty(self):
        self.unstash()