comparison 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
comparison
equal deleted inserted replaced
34:9ac2a0a9e42e 35:8f6c6a54a099
1 import random 1 import pygame
2
3 from pygame.locals import MOUSEBUTTONDOWN 2 from pygame.locals import MOUSEBUTTONDOWN
3 from pgu import gui
4 4
5 import data 5 import data
6 import tiles 6 import tiles
7 7
8 SELL_CHICKEN = None
9 SELL_EGG = None
10 BUY_FENCE = 2
11 BUY_HENHOUSE = 3
12
13
14 class ToolBar(gui.Table):
15 def __init__(self, gameboard, **params):
16 gui.Table.__init__(self, **params)
17 self.gameboard = gameboard
18 self.add_tool_button("Sell chicken", SELL_CHICKEN)
19 self.add_tool_button("Sell egg", SELL_EGG)
20 self.add_tool_button("Buy fence", BUY_FENCE)
21 self.add_tool_button("Buy henhouse", BUY_HENHOUSE)
22
23 def add_tool_button(self, text, tool):
24 style = {
25 "padding_bottom": 15,
26 }
27 td_kwargs = {
28 "style": style,
29 "width": self.gameboard.TOOLBAR_WIDTH,
30 }
31 button = gui.Button(text)
32 button.connect(gui.CLICK, lambda: self.gameboard.set_selected_tool(tool))
33 self.tr()
34 self.td(button, **td_kwargs)
35
36
37 class VidWidget(gui.Widget):
38 def __init__(self, gameboard, vid, **params):
39 gui.Widget.__init__(self, **params)
40 self.gameboard = gameboard
41 self.vid = vid
42 self.width = params.get('width', 0)
43 self.height = params.get('height', 0)
44
45 def paint(self, surface):
46 self.vid.paint(surface)
47
48 def update(self, surface):
49 offset = surface.get_offset()
50 return [r.move(offset) for r in self.vid.update(surface)]
51
52 def resize(self, width=0, height=0):
53 if width is not None:
54 self.width = width
55 if height is not None:
56 self.height = height
57 return self.width, self.height
58
59 def event(self, e):
60 if e.type == MOUSEBUTTONDOWN:
61 self.gameboard.use_tool(e)
62
63
64 class DispTable(gui.Table):
65 def __init__(self, gameboard, **params):
66 gui.Table.__init__(self, **params)
67 self.gameboard = gameboard
68 self.tr()
69 self.td(self.gameboard.tools, width=self.gameboard.TOOLBAR_WIDTH)
70 self.td(self.gameboard.vidwidget)
71
8 72
9 class GameBoard(object): 73 class GameBoard(object):
10 TILE_DIMENSIONS = (20, 20) 74 TILE_DIMENSIONS = (20, 20)
11 TOOLBAR_WIDTH = 22 75 TOOLBAR_WIDTH = 140
12 76
13 def __init__(self): 77 def __init__(self):
14 self.tv = tiles.FarmVid() 78 self.tv = tiles.FarmVid()
15 self.tv.tga_load_tiles(data.filepath('tiles.tga'), self.TILE_DIMENSIONS) 79 self.tv.tga_load_tiles(data.filepath('tiles.tga'), self.TILE_DIMENSIONS)
16 self.tv.png_folder_load_tiles(data.filepath('tiles')) 80 self.tv.png_folder_load_tiles(data.filepath('tiles'))
17 self.tv.tga_load_level(data.filepath('level1.tga')) 81 self.tv.tga_load_level(data.filepath('level1.tga'))
18 82 self.selected_tool = None
19 self.tools = tiles.FarmVid()
20 self.tools.tga_load_tiles(data.filepath('tiles.tga'), self.TILE_DIMENSIONS)
21 self.tools.png_folder_load_tiles(data.filepath('tiles'))
22 self.populate_toolbar()
23 self.chickens = [] 83 self.chickens = []
24 self.foxes = [] 84 self.foxes = []
85 self.create_disp()
25 86
26 self.selected_tool = None 87 def create_disp(self):
27 88 width, height = pygame.display.get_surface().get_size()
28 def populate_toolbar(self): 89 self.tools = ToolBar(self)
29 self.tools.resize((1, 2)) 90 self.vidwidget = VidWidget(self, self.tv, width=width-self.TOOLBAR_WIDTH, height=height)
30 self.tools.set((0,0), 2) 91 self.disp = gui.App()
31 self.tools.set((0,1), 3) 92 c = gui.Container(align=0, valign=0)
93 tbl = DispTable(self)
94 c.add(tbl, 0, 0)
95 self.disp.init(c)
32 96
33 def split_screen(self, screen): 97 def split_screen(self, screen):
34 leftbar_rect = screen.get_rect() 98 leftbar_rect = screen.get_rect()
35 leftbar_rect.width = self.TOOLBAR_WIDTH 99 leftbar_rect.width = self.TOOLBAR_WIDTH
36 main_rect = screen.get_rect() 100 main_rect = screen.get_rect()
37 main_rect.width -= leftbar_rect.width 101 main_rect.width -= leftbar_rect.width
38 main_rect.left += leftbar_rect.width 102 main_rect.left += leftbar_rect.width
39 return screen.subsurface(leftbar_rect), screen.subsurface(main_rect) 103 return screen.subsurface(leftbar_rect), screen.subsurface(main_rect)
40 104
41 def paint(self, screen): 105 def paint(self, screen):
42 leftbar, main = self.split_screen(screen) 106 self.disp.paint(screen)
43 self.tools.paint(leftbar)
44 self.tv.paint(main)
45 107
46 def update_vid(self, vid, subsurface): 108 def update_subscreen(self, vid, subsurface):
47 offset = subsurface.get_offset() 109 offset = subsurface.get_offset()
48 return [r.move(offset) for r in vid.update(subsurface)] 110 return [r.move(offset) for r in vid.update(subsurface)]
49 111
50 def update(self, screen): 112 def update(self, screen):
51 leftbar, main = self.split_screen(screen) 113 return self.disp.update(screen)
52 updates = []
53 updates.extend(self.update_vid(self.tools, leftbar))
54 updates.extend(self.update_vid(self.tv, main))
55 return updates
56 114
57 def loop(self): 115 def loop(self):
58 self.tv.loop() 116 self.tv.loop()
59 117
60 def select_tool(self, e): 118 def set_selected_tool(self, tool):
61 tool_pos = self.tools.screen_to_tile(e.pos) 119 self.selected_tool = tool
62 if tool_pos[1] < 2:
63 self.selected_tool = self.tools.get(tool_pos)
64 else:
65 self.selected_tool = None
66 120
67 def use_tool(self, e): 121 def use_tool(self, e):
68 if self.selected_tool is None: 122 if self.selected_tool is None:
69 return 123 return
70 pos = self.tv.screen_to_tile((e.pos[0] - self.TOOLBAR_WIDTH, e.pos[1])) 124 # pos = self.tv.screen_to_tile((e.pos[0] - self.TOOLBAR_WIDTH, e.pos[1]))
125 pos = self.tv.screen_to_tile(e.pos)
71 self.tv.set(pos, self.selected_tool) 126 self.tv.set(pos, self.selected_tool)
72 127
73 def event(self, e): 128 def event(self, e):
74 if e.type == MOUSEBUTTONDOWN: 129 self.disp.event(e)
75 if e.pos[0] < self.TOOLBAR_WIDTH:
76 self.select_tool(e)
77 else:
78 self.use_tool(e)
79 130
80 def clear_foxes(self): 131 def clear_foxes(self):
81 for fox in self.foxes: 132 for fox in self.foxes:
82 self.tv.sprites.remove(fox) 133 self.tv.sprites.remove(fox)
83 self.foxes = [] # Remove all the foxes 134 self.foxes = [] # Remove all the foxes