def load_menu_bg(self, filename): '''Load an image file from the data directory and store it in dest''' bg1 = image_manager.get_image(filename) bg2 = image_manager.get_image("menu_back2.png") bg1 = pygame.transform.scale(bg1, (self.bg_w, self.bg_h)) bg2 = pygame.transform.scale(bg2, (int(self.bg_w/1.1), int(self.bg_h/1.1))) self.menu_back_img = bg1 tx = (bg1.get_width()-bg2.get_width())/2 ty = (bg1.get_height()-bg2.get_height())/2 self.menu_back_img.blit(bg2, bg2.get_rect().move(tx, ty))
def load_menu_bg(self, filename): '''Load an image file from the data directory and store it in dest''' bg1 = image_manager.get_image(filename) bg2 = image_manager.get_image("menu_back2.png") bg1 = pygame.transform.scale(bg1, (self.bg_w, self.bg_h)) bg2 = pygame.transform.scale( bg2, (int(self.bg_w / 1.1), int(self.bg_h / 1.1))) self.menu_back_img = bg1 tx = (bg1.get_width() - bg2.get_width()) / 2 ty = (bg1.get_height() - bg2.get_height()) / 2 self.menu_back_img.blit(bg2, bg2.get_rect().move(tx, ty))
def render(self, surface): if not self.visible: return if self.font is None: #self.font = pygame.font.Font(None, 25) self.font = pygame.font.Font(None, 30) #Render bg: bg_x = (self.scr_w - self.bg_w) / 2 bg_y = (self.scr_h - self.bg_h) / 2 #pygame.draw.rect(surface, (210, 128, 0), \ # pygame.Rect(bg_x, bg_y, self.bg_w, self.bg_h)) #pygame.draw.rect(surface, (0, 0, 120), \ # pygame.Rect(bg_x, bg_y, self.bg_w, self.bg_h), 4) if not self.menu_back_img: self.load_menu_bg("menu_back.png") surface.blit(self.menu_back_img, pygame.Rect(bg_x, bg_y, self.bg_w, self.bg_h)) #Render menu options: entry_w = 2 * self.bg_w / 3 entry_x = bg_x + (self.bg_w - entry_w) / 2 entry_y = bg_y + ( self.bg_h - (self.font.get_height() + 40 + 20) * len(self.options)) / 2 #print "bg_h:", self.bg_h, "entries_height:", (self.font.get_height()+20)*len(self.options) for i in range(0, len(self.options)): option = self.options[i] #text_sface = self.font.render(option, 1, (255, 255, 255)) text_sface = self.font.render(option, 1, (170, 88, 0)) entry_h = text_sface.get_height() + 20 #Button background: if not self.btn_back_img: self.btn_back_img = image_manager.get_image("btn_back.png") entry_x = bg_x + (self.bg_w - self.btn_back_img.get_width()) / 2 surface.blit(self.btn_back_img, pygame.Rect(entry_x, entry_y, entry_w, entry_h)) #Button text: x = entry_x + (self.btn_back_img.get_width() - text_sface.get_width()) / 2 surface.blit( text_sface, (x, entry_y + (self.btn_back_img.get_height() - text_sface.get_height()) / 2)) #self.option_coords[i] = (entry_x, entry_y, entry_x+entry_w, entry_y+entry_h) self.option_coords[i] = (entry_x, entry_y, entry_x+self.btn_back_img.get_width(), \ entry_y+self.btn_back_img.get_height()) entry_y += entry_h + 40
def render(self, pos, size, piece, surface): ''' Render the piece. x,y are the top left corner of the container cell; cell_size is its size ''' img = image_manager.get_image('%s%s.png' % (piece.type, piece.owner.name)) w,h = img.get_width(), img.get_height() tx = pos[0]*size + (size - w) / 2 ty = pos[1]*size + (size - h) / 2 surface.blit(img, pygame.Rect(tx, ty, w, h))
def render(self, surface, x, y, cell_size): ''' Render this piece. x,y are the top left corner of the container cell; cell_size is its size ''' img = image_manager.get_image(self.type + self.owner + ".png") w, h = img.get_width(), img.get_height() tx = x + (cell_size - w) / 2 ty = y + (cell_size - h) / 2 surface.blit(img, pygame.Rect(tx, ty, w, h))
def initialize(self): '''Initialize Fonts, Images, etc.''' self.bg = pygame.transform.scale( \ image_manager.get_image("menu_back.png"), (self.w, self.h)) pawn_white = image_manager.get_image("pawnwhite.png") pawn_black = image_manager.get_image("pawnblack.png") king_white = image_manager.get_image("kingwhite.png") king_black = image_manager.get_image("kingblack.png") self.turn_imgs = { "move_white" : pawn_white, \ "move_black" : pawn_black, \ "check_white" : king_white, \ "check_black" : king_black, \ "checkmate_white" : king_white, \ "checkmate_black" : king_black } font = pygame.font.Font(None, 25) self.turn_text = font.render(_("Current Turn:"), 1, (255, 255, 255)) self.check_text = font.render(_("Check:"), 1, (255, 255, 0)) self.mate_text = font.render(_("Checkmate:"), 1, (255, 20, 20)) self.loaded = True
def render_background(self, board, surface): '''Render the checkboard background''' if self.background is None: #Create alternating background self.background = pygame.Surface((self.w, self.h)) for i in range(0, 8): for j in range(0, 8): self.cell_renderer.render_background(board[i, j], self.background) #Load texture and blit it texture = image_manager.get_image("wood.png") texture = pygame.transform.scale(texture, (self.w, self.h)) self.background.blit(texture, texture.get_rect()) surface.blit(self.background, self.background.get_rect())
def render(self, surface): if not self.visible: return if self.font is None: self.font = pygame.font.Font(None, 30) #Render bg: bg_x = (self.scr_w - self.bg_w) / 2 bg_y = (self.scr_h - self.bg_h) / 2 if not self.menu_back_img: self.load_menu_bg("menu_back.png") surface.blit(self.menu_back_img, pygame.Rect(bg_x, bg_y, self.bg_w, self.bg_h)) #Render menu options: entry_w = 2 * self.bg_w / 3 entry_x = bg_x + (self.bg_w - entry_w) / 2 entry_y = bg_y + (self.bg_h - (self.font.get_height()+ 40 + 20)*len(self.options)) / 2 #print "bg_h:", self.bg_h, "entries_height:", (self.font.get_height()+20)*len(self.options) for i in range(0, len(self.options)): option = self.options[i] #text_sface = self.font.render(option, 1, (255, 255, 255)) text_sface = self.font.render(option, 1, (170, 88, 0)) entry_h = text_sface.get_height() + 20 #Button background: if not self.btn_back_img: self.btn_back_img = image_manager.get_image("btn_back.png") entry_x = bg_x + (self.bg_w - self.btn_back_img.get_width()) / 2 surface.blit(self.btn_back_img, pygame.Rect(entry_x, entry_y, entry_w, entry_h)) #Button text: x = entry_x + (self.btn_back_img.get_width() - text_sface.get_width())/2 surface.blit(text_sface, (x, entry_y+(self.btn_back_img.get_height()-text_sface.get_height())/2)) #self.option_coords[i] = (entry_x, entry_y, entry_x+entry_w, entry_y+entry_h) self.option_coords[i] = (entry_x, entry_y, entry_x+self.btn_back_img.get_width(), \ entry_y+self.btn_back_img.get_height()) entry_y += entry_h + 40
def _run(self, scr_w, scr_h): pygame.init() #Messages game_messages = {} game_messages["checkmate"] = Message(_("Checkmate!"), 10, 40, (255, 0, 0)) game_messages["check"] = Message(_("Check"), 10, 40, (128, 0, 0)) game_messages["none"] = Message("", 10, 40) #XO: 1200x900 if len(sys.argv) == 3: scr_w = int(sys.argv[1]) scr_h = int(sys.argv[2]) size = width, height = scr_h - 70, scr_h - 70 #Screen config if not self.gtk_embedded: self.screen = pygame.display.set_mode((scr_w, scr_h)) else: self.screen = pygame.display.get_surface() pygame.display.set_caption("Ceibal-Chess") surface = pygame.Surface(size) bg_img = image_manager.get_image("bg.png") bg_img = pygame.transform.scale(bg_img, (scr_w, scr_h)) log.info("Starting width=%s height=%s", scr_w, scr_h) accum_surface = pygame.Surface((scr_w, scr_h), pygame.SRCALPHA) #Center chessboard in screen screen_rect = self.screen.get_rect() sface_rect = surface.get_rect() delta_x = (screen_rect.w - sface_rect.w) / 2 delta_y = (screen_rect.h - sface_rect.h) / 2 clock = pygame.time.Clock() board = Board(width, height) menu_opts = [_("New CPU Game"), _("Player vs. Player"), \ _("Credits"), _("Quit Ceibal-Chess")] menu = Menu(scr_h, scr_h, menu_opts) menu.visible = True #LOG related: #Unique identifier for this game (used for logs) #Controller self.controller = BoardController(board, MODE_P_VS_P) self.controller.init_board() #FPS #messenger.messages["FPS"] = Message("FPS: (calculating)", 10, 10) fps = 0 last_time = time.time() #Create UI Elements: turn_display = StatePanel(scr_w - scr_w / 6.5, scr_h / 40, 120, 120) board_renderer = BoardRenderer(width, height) clock = pygame.time.Clock() #Post an ACTIVEEVENT to render the first time pygame.event.set_blocked(pygame.MOUSEMOTION) pygame.event.post(pygame.event.Event(pygame.ACTIVEEVENT)) while not self.done: fps += 1 new_time = time.time() if new_time - last_time > 1: #messenger.messages["FPS"] = Message("FPS: " + str(fps/5.0), 10, 10) last_time = new_time fps = 0 # no more than 30 FPS clock.tick(20) #Event handling if self.gtk_embedded: while gtk.events_pending(): gtk.main_iteration() #event = pygame.event.wait() for event in pygame.event.get(): #discard mousemotion event (too expensive) #while event.type == pygame.MOUSEMOTION: # event = pygame.event.wait() if event.type == pygame.QUIT: self.controller.close() self.done = True break if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: menu.toggle_visible() if event.key == pygame.K_u and not menu.visible: self.controller.undo_move() #else: # controller.close() # sys.exit(0) if event.type == pygame.MOUSEBUTTONDOWN: x, y = pygame.mouse.get_pos() if not menu.visible: clicked_cell = board.pick(x - delta_x, y - delta_y) if clicked_cell: self.controller.on_cell_clicked(clicked_cell) else: option = menu.on_click(x - delta_x, y - delta_y) if option: if option == menu_opts[3]: self.controller.close() self.done = True break elif option in menu_opts[0:2]: game_mode = MODE_P_VS_CPU if option == menu_opts[1]: game_mode = MODE_P_VS_P board = Board(width, height) self.controller.close("Started new game") self.controller = BoardController( board, game_mode, self.debug) self.controller.init_board() menu.visible = False turn_display.set_state("move_white") # This dirty piece of code makes the refresh and checkmate check only happen when needed # Need to fix this and how the _update function works. #if (board.current_turn.name == "black") or \ # ((board.current_turn.name == "white") and \ # (event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.MOUSEBUTTONUP)) or \ # (turn_display.loaded == False): self._update(board_renderer, board, surface, accum_surface, menu, sface_rect, delta_x, delta_y, bg_img, turn_display) # Update IA if on "player vs cpu" mode and menu is not visible: if not menu.visible: self.controller.update() log.debug("Exiting...") if not self.gtk_embedded: pygame.quit() if self.close_callback: self.close_callback()
def _run(self, scr_w, scr_h): pygame.init() #Messages game_messages = {} game_messages["checkmate"] = Message(_("Checkmate!"), 10, 40, (255, 0, 0)) game_messages["check"] = Message(_("Check"), 10, 40, (128, 0, 0)) game_messages["none"] = Message("", 10, 40) #XO: 1200x900 if len(sys.argv) == 3: scr_w = int(sys.argv[1]) scr_h = int(sys.argv[2]) size = width, height = scr_h - 70, scr_h - 70 #Screen config if not self.gtk_embedded: self.screen = pygame.display.set_mode((scr_w, scr_h)) else: self.screen = pygame.display.get_surface() pygame.display.set_caption("Ceibal-Chess") surface = pygame.Surface(size) bg_img = image_manager.get_image("bg.png") bg_img = pygame.transform.scale(bg_img, (scr_w, scr_h)) log.info("Starting width=%s height=%s", scr_w, scr_h) accum_surface = pygame.Surface((scr_w, scr_h), pygame.SRCALPHA) #Center chessboard in screen screen_rect = self.screen.get_rect() sface_rect = surface.get_rect() delta_x = (screen_rect.w - sface_rect.w) / 2 delta_y = (screen_rect.h - sface_rect.h) / 2 clock = pygame.time.Clock() board = Board(width, height) menu_opts = [_("New CPU Game"), _("Player vs. Player"), \ _("Credits"), _("Quit Ceibal-Chess")] menu = Menu(scr_h, scr_h, menu_opts) menu.visible = True #LOG related: #Unique identifier for this game (used for logs) #Controller self.controller = BoardController(board, MODE_P_VS_P) self.controller.init_board() #FPS #messenger.messages["FPS"] = Message("FPS: (calculating)", 10, 10) fps = 0 last_time = time.time() #Create UI Elements: turn_display = StatePanel(scr_w - scr_w/6.5, scr_h/40, 120, 120) board_renderer = BoardRenderer(width, height) clock = pygame.time.Clock() #Post an ACTIVEEVENT to render the first time pygame.event.set_blocked(pygame.MOUSEMOTION) pygame.event.post(pygame.event.Event(pygame.ACTIVEEVENT)) while not self.done: fps += 1 new_time = time.time() if new_time - last_time > 1: #messenger.messages["FPS"] = Message("FPS: " + str(fps/5.0), 10, 10) last_time = new_time fps = 0 # no more than 30 FPS clock.tick(20) #Event handling if self.gtk_embedded: while gtk.events_pending(): gtk.main_iteration() #event = pygame.event.wait() for event in pygame.event.get(): #discard mousemotion event (too expensive) #while event.type == pygame.MOUSEMOTION: # event = pygame.event.wait() if event.type == pygame.QUIT: self.controller.close() self.done = True break if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: menu.toggle_visible() if event.key == pygame.K_u and not menu.visible: self.controller.undo_move() #else: # controller.close() # sys.exit(0) if event.type == pygame.MOUSEBUTTONDOWN: x, y = pygame.mouse.get_pos() if not menu.visible: clicked_cell = board.pick(x-delta_x, y-delta_y) if clicked_cell: self.controller.on_cell_clicked(clicked_cell) else: option = menu.on_click(x-delta_x, y-delta_y) if option: if option == menu_opts[3]: self.controller.close() self.done = True break elif option in menu_opts[0:2]: game_mode = MODE_P_VS_CPU if option == menu_opts[1]: game_mode = MODE_P_VS_P board = Board(width, height) self.controller.close("Started new game") self.controller = BoardController(board, game_mode, self.debug) self.controller.init_board() menu.visible = False turn_display.set_state("move_white") # This dirty piece of code makes the refresh and checkmate check only happen when needed # Need to fix this and how the _update function works. #if (board.current_turn.name == "black") or \ # ((board.current_turn.name == "white") and \ # (event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.MOUSEBUTTONUP)) or \ # (turn_display.loaded == False): self._update(board_renderer, board, surface, accum_surface, menu, sface_rect, delta_x, delta_y, bg_img, turn_display) # Update IA if on "player vs cpu" mode and menu is not visible: if not menu.visible: self.controller.update() log.debug("Exiting...") if not self.gtk_embedded: pygame.quit() if self.close_callback: self.close_callback()
def main(requested_w, requested_h): pygame.init() #Messages game_messages = {} game_messages["checkmate"] = Message("Checkmate!", 10, 40, (255, 0, 0)) game_messages["check"] = Message("Check", 10, 40, (128, 0, 0)) game_messages["none"] = Message("", 10, 40) #XO: 1200x900 scr_w = requested_w scr_h = requested_h if len(sys.argv) == 3: scr_w = int(sys.argv[1]) scr_h = int(sys.argv[2]) size = width, height = scr_h - 70, scr_h - 70 #Screen config screen = pygame.display.set_mode((scr_w, scr_h)) pygame.display.set_caption("Ceibal-Chess") surface = pygame.Surface(size) bg_img = image_manager.get_image("bg.png") bg_img = pygame.transform.scale(bg_img, (scr_w, scr_h)) print scr_w, scr_h #Center chessboard in screen screen_rect = screen.get_rect() sface_rect = surface.get_rect() delta_x = (screen_rect.w - sface_rect.w) / 2 delta_y = (screen_rect.h - sface_rect.h) / 2 clock = pygame.time.Clock() board = Board(width, height) menu_opts = ["New CPU Game", "Player vs. Player", \ "Practice Mode", "Credits", "Quit Ceibal-Chess"] menu = Menu(scr_h, scr_h, menu_opts) menu.visible = True #LOG related: #Unique identifier for this game (used for logs) game_code = str(int(time.time())) try: logpath = os.path.join(os.environ["HOME"], ".cchess") except: logpath = ".cchess" if not os.path.isdir(logpath): os.mkdir(logpath) #Controller controller = BoardController(board, MODE_P_VS_P, game_code, logpath) controller.init_board() #FPS #messenger.messages["FPS"] = Message("FPS: (calculating)", 10, 10) fps = 0 last_time = time.time() #Create UI Elements: turn_display = StatePanel(scr_w - scr_w / 6, scr_h / 40, 120, 120) #Post an ACTIVEEVENT to render the first time pygame.event.post(pygame.event.Event(pygame.ACTIVEEVENT)) while 1: fps += 1 new_time = time.time() if new_time - last_time > 5: #print "FPS:", fps/5.0 #messenger.messages["FPS"] = Message("FPS: " + str(fps/5.0), 10, 10) last_time = new_time fps = 0 #clock.tick(30) try: if not menu.visible: controller.update(0) #Event handling event = pygame.event.wait() #discard mousemotion event (too expensive) while event.type == pygame.MOUSEMOTION: event = pygame.event.wait() if event.type == pygame.QUIT: controller.shutdown() sys.exit(0) if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: menu.toggle_visible() #else: # controller.shutdown() # sys.exit(0) if event.type == pygame.MOUSEBUTTONDOWN: x, y = pygame.mouse.get_pos() if not menu.visible: clicked_cell = board.pick(x - delta_x, y - delta_y) controller.on_cell_clicked(clicked_cell) else: option = menu.on_click(x - delta_x, y - delta_y) if option: if option == menu_opts[4]: controller.shutdown() sys.exit(0) elif option in menu_opts[0:2]: game_mode = MODE_P_VS_CPU if option == menu_opts[1]: game_mode = MODE_P_VS_P board = Board(width, height) controller.shutdown("Started new game") controller = BoardController( board, game_mode, game_code, logpath) controller.init_board() menu.visible = False turn_display.set_state("move_white") if not menu.visible: print "Checking if king is checkmated:" t_ini = time.time() checkmated = board.king_is_checkmated(board.current_turn) print "Check if checkmate for %s took %.5f secs" % \ (board.current_turn, time.time() - t_ini) if checkmated: #print "Checkmate for", board.current_turn #messenger.messages["check"] = game_messages["checkmate"] controller.game_state = "checkmate" turn_display.set_state("checkmate_" + board.current_turn) elif board.king_is_checked(board.current_turn): #messenger.messages["check"] = game_messages["check"] turn_display.set_state("check_" + board.current_turn) else: #messenger.messages["check"] = game_messages["none"] turn_display.set_state("move_" + board.current_turn) except Exception, ex: print "Caught exception, dumping and cleaning up..." #Dump to stdout print ex.message traceback.print_exc(file=sys.stdout) #Dump move log and close IA controller.shutdown(ex.message) #Dump trace to file trace_file = open(os.path.join(logpath, game_code + ".trace"), "w") traceback.print_exc(file=trace_file) trace_file.close() #Dump screen to image file pygame.image.save(screen, os.path.join(logpath, game_code + ".png")) print "Ceibal-Chess is done crashing... Game code was: " + game_code print "Have a nice day :)" sys.exit(-1) #time visual update: t_ini = time.time() clear(screen) clear(surface) screen.blit(bg_img, bg_img.get_rect()) board.render_background(surface) if controller.selected_cell is not None: board.render_moves_for_piece_in_cell(surface, controller.selected_cell) controller.selected_cell.render_foreground(surface) board.render_foreground(surface) menu.render(surface) screen.blit(surface, sface_rect.move(delta_x, delta_y)) if not menu.visible: turn_display.render(screen) messenger.render_messages(screen) update() print "Visual refresh took %.5f secs" % (time.time() - t_ini)