From 16061abf0a4021c556fa653de402f8b90060a942 Mon Sep 17 00:00:00 2001 From: Anna Wiggins Date: Sun, 15 Apr 2012 00:20:39 -0400 Subject: [PATCH] Refactored gui code into a class to make it more managable --- lib/pygogui.py | 156 ++++++++++++++++++++++++++++++++++++++++++++++++ pygo.py | 158 ++----------------------------------------------- 2 files changed, 161 insertions(+), 153 deletions(-) create mode 100644 lib/pygogui.py diff --git a/lib/pygogui.py b/lib/pygogui.py new file mode 100644 index 0000000..57ffda1 --- /dev/null +++ b/lib/pygogui.py @@ -0,0 +1,156 @@ +import os +import sys +import math + +import pygame +from pygame.locals import * +import sgc +from sgc.locals import * + + + +class GUI: + def __init__(self, goban): + # Basic screen init + pygame.init() + # screen = pygame.display.set_mode((1000, 800)) + self.screen = sgc.surface.Screen((1000,800)) + pygame.display.set_caption('pyGo') + + # SGC font color + sgc.Font.col = (10,10,10) + + # Create the background object, make it blank + # background = pygame.Surface(screen.get_size()) + # background = background.convert() + # background.fill((250, 250, 250)) + + # Build the dict of image objects + self.img_res = _build_img_res() + + self.board_size = 800 + self.board_inc = self.board_size / 19 + + self.screen.fill((250, 250, 250)) + + self.pass_btn = sgc.widgets.Button(label="Pass", pos=(850,500)) + self.pass_btn.activate = goban.pass_move + self.pass_btn.add() + + self.resign_btn = sgc.widgets.Button(label="Resign", pos=(850,600)) + self.resign_btn.activate = goban.resign + self.resign_btn.add() + + self.quit_btn = sgc.widgets.Button(label="Quit", pos=(850,700)) + self.quit_btn.activate = sys.exit + self.quit_btn.add() + + # pygame.time.set_timer(USEREVENT, 1000) + + + + def do_event(self, goban, network_mode, our_color): + event = pygame.event.wait() + sgc.widgets.event(event) + + if event.type == QUIT: + return + + # This set of events should only be called if we can currently play + if network_mode == False or goban.to_move == our_color: + # Hover a transparent stone over our + # cursor position, assuming play is legal + if event.type == MOUSEMOTION: + x, y = event.pos + row = y / self.board_inc + col = x / self.board_inc + + if _magnitude(event.rel) < 3: + if x <= self.board_size: + goban.set_hover((row,col)) + else: + goban.clear_hover() + elif goban.hover != goban._real_pos((row,col)): + goban.clear_hover() + + # Place a stone on left-click + if event.type == MOUSEBUTTONDOWN: + x, y = event.pos + row = y / self.board_inc + col = x / self.board_inc + + if x <= self.board_size: + if event.button == 1: + goban.play_move((row, col)) + + # if event.type == USEREVENT: + # goban.elapsed_time += 1 + + # Cleanup removed windows + # for widget in dialogs: + # if not widget.active(): + # dialogs.remove(widget) + + + + def update(self, goban): + board = goban.draw_board(self.board_size, self.img_res) + self.screen.blit(board, (0,0)) + + text = goban.draw_info() + self.screen.blit(text, (815, 25)) + + sgc.widgets.update(0) + pygame.display.flip() + + + +def _magnitude(vector): + x,y = vector + return math.sqrt(x*x + y*y) + + +def _load_png(name, alpha=None): + """ Load image and return image object""" + fullname = os.path.join('res', name) + + try: + image = pygame.image.load(fullname) + if image.get_alpha() is None: + image = image.convert() + else: + image = image.convert_alpha() + + if alpha is not None: + image.set_alpha(alpha) + + except pygame.error, message: + print 'Cannot load image:', fullname + raise SystemExit, message + + return image + + +def _build_img_res(): + ret = {} + + triangle = _load_png('go_t.png') + + ret['w'] = _load_png('go_w.png') + ret['wT'] = _load_png('go_w.png') + ret['wT'].blit(triangle, (0,0)) + ret['wH'] = _load_png('go_w.png', 128) + + ret['b'] = _load_png('go_b.png') + ret['bT'] = _load_png('go_b.png') + ret['bT'].blit(triangle, (0,0)) + ret['bH'] = _load_png('go_b.png', 128) + + circle = _load_png('go_c.png') + + for d in ('u', 'd', 'l', 'r', 'm', 'dl', 'dr', 'ul', 'ur', 'h'): + ret[d] = _load_png('go_' + d + '.png') + ret[d + 'C'] = _load_png('go_' + d + '.png') + ret[d + 'C'].blit(circle, (0,0)) + + return ret diff --git a/pygo.py b/pygo.py index 28c7ff0..d351636 100755 --- a/pygo.py +++ b/pygo.py @@ -6,170 +6,22 @@ import sys sys.path.append('lib/') -import os -import math - -import pygame -from pygame.locals import * -import sgc -from sgc.locals import * - import goban - - -def load_png(name, alpha=None): - """ Load image and return image object""" - fullname = os.path.join('res', name) - - try: - image = pygame.image.load(fullname) - if image.get_alpha() is None: - image = image.convert() - else: - image = image.convert_alpha() - - if alpha is not None: - image.set_alpha(alpha) - - except pygame.error, message: - print 'Cannot load image:', fullname - raise SystemExit, message - - return image - - -def build_img_res(): - ret = {} - - triangle = load_png('go_t.png') - - ret['w'] = load_png('go_w.png') - ret['wT'] = load_png('go_w.png') - ret['wT'].blit(triangle, (0,0)) - ret['wH'] = load_png('go_w.png', 128) - - ret['b'] = load_png('go_b.png') - ret['bT'] = load_png('go_b.png') - ret['bT'].blit(triangle, (0,0)) - ret['bH'] = load_png('go_b.png', 128) - - circle = load_png('go_c.png') - - for d in ('u', 'd', 'l', 'r', 'm', 'dl', 'dr', 'ul', 'ur', 'h'): - ret[d] = load_png('go_' + d + '.png') - ret[d + 'C'] = load_png('go_' + d + '.png') - ret[d + 'C'].blit(circle, (0,0)) - - return ret - - -def magnitude(vector): - x,y = vector - return math.sqrt(x*x + y*y) +import pygogui def main(): - # Basic screen init - pygame.init() -# screen = pygame.display.set_mode((1000, 800)) - screen = sgc.surface.Screen((1000,800)) - pygame.display.set_caption('pyGo') - - # SGC font color - sgc.Font.col = (10,10,10) - - # Create the background object, make it blank - # background = pygame.Surface(screen.get_size()) - # background = background.convert() - # background.fill((250, 250, 250)) - - # Build the dict of image objects - img_res = build_img_res() - # Data gb = goban.Goban() network_mode = False our_color = None + gui = pygogui.GUI(gb) - board_size = 800 - board_inc = board_size / 19 - - screen.fill((250, 250, 250)) - board = gb.draw_board(board_size, img_res) - screen.blit(board, (0,0)) - text = gb.draw_info() - screen.blit(text, (815, 25)) - - pass_btn = sgc.widgets.Button(label="Pass", pos=(850,500)) - pass_btn.activate = gb.pass_move - pass_btn.add() - - resign_btn = sgc.widgets.Button(label="Resign", pos=(850,600)) - resign_btn.activate = gb.resign - resign_btn.add() - - quit_btn = sgc.widgets.Button(label="Quit", pos=(850,700)) - quit_btn.activate = sys.exit - quit_btn.add() - - pygame.display.flip() - - # pygame.time.set_timer(USEREVENT, 1000) + gui.update(gb) while True: - event = pygame.event.wait() - sgc.widgets.event(event) - - if event.type == QUIT: - return - - - # This set of events should only be called if we can currently play - if network_mode == False or gb.to_move == our_color: - # Hover a transparent stone over our - # cursor position, assuming play is legal - if event.type == MOUSEMOTION: - x, y = event.pos - row = y / board_inc - col = x / board_inc - - if magnitude(event.rel) < 3: - if x <= board_size: - gb.set_hover((row,col)) - else: - gb.clear_hover() - elif gb.hover != gb._real_pos((row,col)): - gb.clear_hover() - - # Place a stone on left-click - if event.type == MOUSEBUTTONDOWN: - x, y = event.pos - row = y / board_inc - col = x / board_inc - - if x <= board_size: - if event.button == 1: - gb.play_move((row, col)) - - - # if event.type == USEREVENT: - # gb.elapsed_time += 1 - - - # Cleanup removed windows - # for widget in dialogs: - # if not widget.active(): - # dialogs.remove(widget) - - board = gb.draw_board(board_size, img_res) - screen.blit(board, (0,0)) - - text = gb.draw_info() - screen.blit(text, (815, 25)) - - sgc.widgets.update(0) - pygame.display.flip() - + event = gui.do_event(gb, network_mode, our_color) + gui.update(gb) if __name__ == '__main__': main()