Module pacai.ui.view

Classes

class AbstractView (spritesPath='/home/runner/work/pacman/pacman/pacai/ui/pacman-sprites.png', gifPath=None, gifFPS=10, skipFrames=4)

A abstarct view that represents all the necessary functionality a specific view should implement. The ability to produce a gif is inherent to all views, even if they do not produce graphics at runtime.

Expand source code
class AbstractView(abc.ABC):
    """
    A abstarct view that represents all the necessary functionality a specific
    view should implement.
    The ability to produce a gif is inherent to all views,
    even if they do not produce graphics at runtime.
    """

    def __init__(self, spritesPath = DEFAULT_SPRITES,
            gifPath = None, gifFPS = DEFAULT_GIF_FPS, skipFrames = DEFAULT_SKIP_FRAMES):
        self._spritesPath = spritesPath

        self._gifPath = gifPath
        self._gifFPS = max(MIN_GIF_FPS, int(gifFPS))

        self._saveFrames = (self._gifPath is not None)
        self._skipFrames = max(1, int(skipFrames))
        self._keyFrames = []

        # The number of frames this view has produced.
        self._frameCount = 0
        # The number of turns this view has produced.
        # (Tracked by the number of times agent 0 has been animated.)
        self._turnCount = 0

        self._sprites = spritesheet.loadSpriteSheet(spritesPath)
        self._font = ImageFont.truetype(FONT_PATH, spritesheet.SQUARE_SIZE - 14)

    def finish(self):
        """
        Signal that the game is over and the UI should cleanup.
        """

        # Save the gif.
        if (self._saveFrames and len(self._keyFrames) > 0):
            gifTimePerFrameMS = int(1.0 / self._gifFPS * 1000.0)

            images = [frame.toImage(self._sprites, self._font) for frame in self._keyFrames]
            images[0].save(self._gifPath, save_all = True, append_images = images,
                    duration = gifTimePerFrameMS, loop = 0, optimize = False)

    def getKeyboard(self):
        """
        For views that support keyboards, get an instance of a pacai.ui.keyboard.Keyboard.
        """

        raise NotImplementedError("This view does not support keyboards.")

    def initialize(self, state):
        """
        Perform an initial drawing of the view.
        """

        pass

    def update(self, state, forceDraw = False):
        """
        Materialize the view, given a state.
        """

        if (state.isOver()):
            forceDraw = True

        frame = self._createFrame(state)
        if (frame is not None and self._saveFrames
                and (state.isOver() or (self._frameCount % self._skipFrames == 0))):
            self._keyFrames.append(frame)

        self._drawFrame(state, frame, forceDraw = forceDraw)

        self._frameCount += 1
        if (state.getLastAgentMoved() == 0):
            self._turnCount += 1

    @abc.abstractmethod
    def _createFrame(self, state):
        """
        Create the frame using the given state.
        Children can decide on the correct concrete representation of a frame.
        """

        pass

    @abc.abstractmethod
    def _drawFrame(self, state, frame, forceDraw = False):
        """
        The real work for each view implementation.
        From a frame, output to whatever medium this view utilizes.
        """

        pass

Ancestors

  • abc.ABC

Subclasses

Methods

def finish(self)

Signal that the game is over and the UI should cleanup.

def getKeyboard(self)

For views that support keyboards, get an instance of a pacai.ui.keyboard.Keyboard.

def initialize(self, state)

Perform an initial drawing of the view.

def update(self, state, forceDraw=False)

Materialize the view, given a state.