def draw_tooltip(self, screen, name, description = []): font = Game.get_font(False) big_font = Game.get_font(True) mouse_pos = pygame.mouse.get_pos() name_image = GUI.render_string_array([name], big_font, 0, Game.WHITE) desc_image = GUI.render_string_array(description, font, 0, Game.WHITE) name_width = name_image.get_width() name_height = name_image.get_height() desc_width = desc_image.get_width() desc_height = desc_image.get_height() width = max(name_width, desc_width) height = name_height if desc_height > 0: height += TOOLTIP_GAP + desc_height corner = 4 * Game.SCALE edge = 2 * corner pos = (mouse_pos[0] + corner, mouse_pos[1]) #if too long, flip it to the other side of the mouse if pos[0] + width + 2 * corner > Game.SCREEN_WIDTH: pos = (max(pos[0] - width - 4 * corner, 0), pos[1]) #gap for mouse if pos[1] + height + 2 * corner > Game.SCREEN_HEIGHT: pos = (pos[0], pos[1] - height - 2 * corner) #top border screen.blit(Images.tooltip_pieces[0][0], pos) for x in range(0, width, edge): screen.blit(Images.tooltip_pieces[0][1], (pos[0] + corner + x, pos[1])) screen.blit(Images.tooltip_pieces[0][2], (pos[0] + 3 * corner + x, pos[1])) #middle slices = math.ceil(height / edge) for s in range(slices): y = height * s // slices screen.blit(Images.tooltip_pieces[1][0], (pos[0], pos[1] + corner + y)) for x in range(0, width, edge): screen.blit(Images.tooltip_centers[((x + y) // edge) % 4], (pos[0] + corner + x, pos[1] + corner + y)) screen.blit(Images.tooltip_pieces[1][2], (pos[0] + 3 * corner + x, pos[1] + corner + y)) #bottom border y = corner + height screen.blit(Images.tooltip_pieces[2][0], (pos[0], pos[1] + y)) for x in range(0, width, edge): screen.blit(Images.tooltip_pieces[2][1], (pos[0] + corner + x, pos[1] + y)) screen.blit(Images.tooltip_pieces[2][2], (pos[0] + 3 * corner + x, pos[1] + y)) #text screen.blit(name_image, (pos[0] + corner, pos[1] + corner)) screen.blit(desc_image, (pos[0] + corner, pos[1] + corner + name_height + TOOLTIP_GAP))
def render(): if gamemode == MAINMENU or gamemode == PAUSEMENU: menu.render_background(screen) menu.render(screen) elif gamemode in (PLAYING, OPENGUI): player = world.player shift = pygame.key.get_pressed()[pygame.K_LSHIFT] or pygame.key.get_pressed()[pygame.K_RSHIFT] screen.fill(SKY) #background world.render(screen, viewport, True) if shift: player.draw_block_highlight(world, pygame.mouse.get_pos(), viewport, screen, shift) world.render_breaks(screen, viewport, True) #foreground world.render(screen, viewport, False) if not shift: player.draw_block_highlight(world, pygame.mouse.get_pos(), viewport, screen, shift) world.render_breaks(screen, viewport, False) player.render(screen, Convert.world_to_viewport(player.pos, viewport)) #add blue overlay- not completely sure this is good overlay = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT)) overlay.set_alpha(64) overlay.fill(BLUE) screen.blit(overlay, (0, 0)) if gamemode == PLAYING: hotbarGui.render(screen) else: gui.render(screen) if DEBUG: #render debug text chunk = world.loaded_chunks.get(Convert.world_to_chunk(player.pos[0])[1]) debugtext = ["fps: {0:.2f}".format(clock.get_fps()), "pos: [{0:.2f}".format(player.pos[0]) + ", {0:.2f}]".format(player.pos[1]), "chunk: " + str(chunk.x), "biome: " + str(chunk.biome["name"])] debugimg = GUI.render_string_array(debugtext, font, 0, WHITE) h = SCREEN_HEIGHT - debugimg.get_height() screen.blit(debugimg, (2 * SCALE, h)) pygame.display.flip()
def render(self, left, top, screen, hotbargap, item_to_skip = None): font = Game.get_font() mouse_pos = pygame.mouse.get_pos() tooltip_item = None for r in range(len(self.items)): for c in range(len(self.items[r])): inv_item = self.items[r][c] if inv_item is not None and inv_item is not item_to_skip: #c and r are flipped here so it renders across then down slotX = left + GUI.SCALING * 13 / 8 + c * GUI.SCALING slotY = top + GUI.SCALING / 2 + r * GUI.SCALING if r > 0 and hotbargap: slotY += HOTBAR_GAP inv_item.render((slotX, slotY), screen) rect = pygame.rect.Rect(slotX, slotY, GUI.SCALING, GUI.SCALING) if rect.collidepoint(mouse_pos): tooltip_item = inv_item highlight_pos = (slotX, slotY) #TODO draw armor if not none if tooltip_item is not None and item_to_skip is None: screen.blit(Images.highlight_image, highlight_pos) text = World.items[tooltip_item.name]["description"] if isinstance(text, str): text = [text] else: text = text.copy() displayName = World.items[tooltip_item.name]["displayName"] text.insert(0, displayName) text_image = GUI.render_string_array(text, font, 0, Game.WHITE) width = text_image.get_width() height = text_image.get_height() corner = 4 * Game.SCALE pos = (mouse_pos[0] + corner, mouse_pos[1]) #if too long, flip it to the other side of the mouse if pos[0] + width + 2 * corner > Game.SCREEN_WIDTH: pos = (max(pos[0] - width - 4 * corner, 0), pos[1]) #gap for mouse if pos[1] + height + 2 * corner > Game.SCREEN_HEIGHT: pos = (pos[0], pos[1] - height - 2 * corner) screen.blit(Images.tooltip_pieces[0][0], pos) for x in range(0, width, 2 * corner): screen.blit(Images.tooltip_pieces[0][1], (pos[0] + corner + x, pos[1])) screen.blit(Images.tooltip_pieces[0][2], (pos[0] + 3 * corner + x, pos[1])) for y in range(0, height, 2 * corner): screen.blit(Images.tooltip_pieces[1][0], (pos[0], pos[1] + corner + y)) for x in range(0, width, 2 * corner): screen.blit(Images.tooltip_centers[((x + y) // (2 * corner)) % 4], (pos[0] + corner + x, pos[1] + corner + y)) screen.blit(Images.tooltip_pieces[1][2], (pos[0] + 3 * corner + x, pos[1] + corner + y)) screen.blit(Images.tooltip_pieces[2][0], (pos[0], pos[1] + 3 * corner + y)) for x in range(0, width, 2 * corner): screen.blit(Images.tooltip_pieces[2][1], (pos[0] + corner + x, pos[1] + 3 * corner + y)) screen.blit(Images.tooltip_pieces[2][2], (pos[0] + 3 * corner + x, pos[1] + 3 * corner + y)) screen.blit(text_image, (pos[0] + corner, pos[1] + corner))