#!/usr/bin/python # -*- coding: utf-8 -*- # # A GTK Python GO client 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) 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() board_size = 800 board_inc = board_size / 19 gb = goban.Goban() 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) while True: event = pygame.event.wait() sgc.widgets.event(event) if event.type == QUIT: return # 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() if __name__ == '__main__': main()