view gamelib/gameboard.py @ 35:8f6c6a54a099

Fixed gameboard display.
author Jeremy Thurgood <firxen@gmail.com>
date Mon, 31 Aug 2009 12:40:05 +0000
parents 2e88c680672c
children 5569430fd82e
line wrap: on
line source

import pygame
from pygame.locals import MOUSEBUTTONDOWN
from pgu import gui

import data
import tiles

SELL_CHICKEN = None
SELL_EGG = None
BUY_FENCE = 2
BUY_HENHOUSE = 3


class ToolBar(gui.Table):
    def __init__(self, gameboard, **params):
        gui.Table.__init__(self, **params)
        self.gameboard = gameboard
        self.add_tool_button("Sell chicken", SELL_CHICKEN)
        self.add_tool_button("Sell egg", SELL_EGG)
        self.add_tool_button("Buy fence", BUY_FENCE)
        self.add_tool_button("Buy henhouse", BUY_HENHOUSE)

    def add_tool_button(self, text, tool):
        style = {
            "padding_bottom": 15,
        }
        td_kwargs = {
            "style": style,
            "width": self.gameboard.TOOLBAR_WIDTH,
        }
        button = gui.Button(text)
        button.connect(gui.CLICK, lambda: self.gameboard.set_selected_tool(tool))
        self.tr()
        self.td(button, **td_kwargs)


class VidWidget(gui.Widget):
    def __init__(self, gameboard, vid, **params):
        gui.Widget.__init__(self, **params)
        self.gameboard = gameboard
        self.vid = vid
        self.width = params.get('width', 0)
        self.height = params.get('height', 0)

    def paint(self, surface):
        self.vid.paint(surface)

    def update(self, surface):
        offset = surface.get_offset()
        return [r.move(offset) for r in self.vid.update(surface)]

    def resize(self, width=0, height=0):
        if width is not None:
            self.width = width
        if height is not None:
            self.height = height
        return self.width, self.height

    def event(self, e):
        if e.type == MOUSEBUTTONDOWN:
            self.gameboard.use_tool(e)


class DispTable(gui.Table):
    def __init__(self, gameboard, **params):
        gui.Table.__init__(self, **params)
        self.gameboard = gameboard
        self.tr()
        self.td(self.gameboard.tools, width=self.gameboard.TOOLBAR_WIDTH)
        self.td(self.gameboard.vidwidget)


class GameBoard(object):
    TILE_DIMENSIONS = (20, 20)
    TOOLBAR_WIDTH = 140

    def __init__(self):
        self.tv = tiles.FarmVid()
        self.tv.tga_load_tiles(data.filepath('tiles.tga'), self.TILE_DIMENSIONS)
        self.tv.png_folder_load_tiles(data.filepath('tiles'))
        self.tv.tga_load_level(data.filepath('level1.tga'))
        self.selected_tool = None
        self.chickens = []
        self.foxes = []
        self.create_disp()

    def create_disp(self):
        width, height = pygame.display.get_surface().get_size()
        self.tools = ToolBar(self)
        self.vidwidget = VidWidget(self, self.tv, width=width-self.TOOLBAR_WIDTH, height=height)
        self.disp = gui.App()
        c = gui.Container(align=0, valign=0)
        tbl = DispTable(self)
        c.add(tbl, 0, 0)
        self.disp.init(c)

    def split_screen(self, screen):
        leftbar_rect = screen.get_rect()
        leftbar_rect.width = self.TOOLBAR_WIDTH
        main_rect = screen.get_rect()
        main_rect.width -= leftbar_rect.width
        main_rect.left += leftbar_rect.width
        return screen.subsurface(leftbar_rect), screen.subsurface(main_rect)

    def paint(self, screen):
        self.disp.paint(screen)

    def update_subscreen(self, vid, subsurface):
        offset = subsurface.get_offset()
        return [r.move(offset) for r in vid.update(subsurface)]

    def update(self, screen):
        return self.disp.update(screen)

    def loop(self):
        self.tv.loop()

    def set_selected_tool(self, tool):
        self.selected_tool = tool

    def use_tool(self, e):
        if self.selected_tool is None:
            return
#         pos = self.tv.screen_to_tile((e.pos[0] - self.TOOLBAR_WIDTH, e.pos[1]))
        pos = self.tv.screen_to_tile(e.pos)
        self.tv.set(pos, self.selected_tool)

    def event(self, e):
        self.disp.event(e)

    def clear_foxes(self):
        for fox in self.foxes:
            self.tv.sprites.remove(fox)
        self.foxes = [] # Remove all the foxes

    def move_foxes(self):
        for fox in self.foxes:
            fox.move(self)

    def add_chicken(self, chicken):
        self.chickens.append(chicken)
        self.tv.sprites.append(chicken)

    def add_fox(self, fox):
        self.foxes.append(fox)
        self.tv.sprites.append(fox)

    def remove_fox(self, fox):
        if fox in self.foxes:
            self.foxes.remove(fox)
            self.tv.sprites.remove(fox)

    def remove_chicken(self, chick):
        if chick in self.chickens:
            self.chickens.remove(chick)
            self.tv.sprites.remove(chick)