import pygame class Sprite: @staticmethod def draw(dest, source, x, y, cell_x, cell_y, cell_w=32, cell_h=32): """ 绘制精灵图中,指定x,y的图像 :param dest: surface类型,要绘制到的目标surface :param source: surface类型,来源surface :param x: 绘制图像在dest中的坐标 :param y: 绘制图像在dest中的坐标 :param cell_x: 在精灵图中的格子坐标 :param cell_y: 在精灵图中的格子坐标 :param cell_w: 单个精灵的宽度 :param cell_h: 单个精灵的高度 :return: """ dest.blit(source, (x, y), (cell_x * cell_w, cell_y * cell_h, cell_w, cell_h)) @staticmethod def draw_rect(dest, source, x, y, src_x, src_y, w, h): dest.blit(source, (x, y), (src_x, src_y, w, h)) @staticmethod def blit(dest, source, x, y): """ 绘制原图 """ dest.blit(source, (x, y)) @staticmethod def blit_w(dest, source, x, y, percent): """ 按宽度百分比绘制 percent:[0,1] """ dest.blit(source, (x, y), (0, 0, int(source.get_width() * percent), source.get_height())) @staticmethod def blit_alpha(target, source, x, y, opacity, rect=None): """ 绘制半透明图片(解决带alpha通道的surface的set_alpha不起作用的问题) """ temp = pygame.Surface((source.get_width(), source.get_height())).convert() if rect: rect[0] = -rect[0] rect[1] = -rect[1] temp.blit(target, (-x, -y), rect) temp.blit(source, (0, 0), rect) temp.set_alpha(opacity) target.blit(temp, (x, y), rect) else: temp.blit(target, (-x, -y)) temp.blit(source, (0, 0)) temp.set_alpha(opacity) target.blit(temp, (x, y)) @staticmethod def draw_alpha(dest, source, x, y, cell_x, cell_y, cell_w=32, cell_h=32, opacity=0): """ 有bug,不可用 """ print((cell_x * cell_w, cell_y * cell_h, cell_w, cell_h)) Sprite.blit_alpha(dest, source, x, y, opacity, [cell_x * cell_w, cell_y * cell_h, cell_w, cell_h]) @staticmethod def subsurface(source, cell_x, cell_y, cell_w=32, cell_h=32): """ 返回子表面 """ return source.subsurface([cell_x * cell_w, cell_y * cell_h, cell_w, cell_h]) @staticmethod def draw_fill_rect(target, x, y, w, h, rgba): """ 画半透明矩形 """ surface = pygame.Surface((w, h), pygame.SRCALPHA) surface.fill(rgba) target.blit(surface, (x, y)) def draw_text(dest, x, y, text, font, rgb): """ 绘制文字(取中心点绘制) """ surface = font.render(text, True, rgb) w = surface.get_width() Sprite.blit(dest, surface, x - int(w / 2), y) def draw_src_text(dest, x, y, text, font, rgb): """ 绘制文字 """ surface = font.render(text, True, rgb) Sprite.blit(dest, surface, x, y) def draw_outline_text(dest, x, y, text, font, inner_rgb, outter_rgb): """ 绘制带边框的文字 """ sur_inner = font.render(text, True, inner_rgb) sur_outter = font.render(text, True, outter_rgb) w = sur_inner.get_width() Sprite.blit(dest, sur_outter, x - int(w / 2) + 1, y) Sprite.blit(dest, sur_outter, x - int(w / 2) - 1, y) Sprite.blit(dest, sur_outter, x - int(w / 2), y + 1) Sprite.blit(dest, sur_outter, x - int(w / 2), y - 1) Sprite.blit(dest, sur_inner, x - int(w / 2), y) def draw_src_outline_text(dest, x, y, text, font, inner_rgb, outter_rgb): """ 绘制带边框的文字 """ sur_inner = font.render(text, True, inner_rgb) sur_outter = font.render(text, True, outter_rgb) Sprite.blit(dest, sur_outter, x + 1, y) Sprite.blit(dest, sur_outter, x - 1, y) Sprite.blit(dest, sur_outter, x, y + 1) Sprite.blit(dest, sur_outter, x, y - 1) Sprite.blit(dest, sur_inner, x, y) def draw_rect_text(dest, color, text, font, x, y, width): lineWidth = 0 lastSubStrIndex = 0 lineHeight = font.get_linesize() # 行高=字体高度+行距 for i in range(0, len(text)): lineWidth += font.size(text[i])[0] if lineWidth > width or text[i] == '\n': draw_src_text(dest, x, y, text[lastSubStrIndex:i], font, color) y += lineHeight lineWidth = 0 if text[i] == '\n': lastSubStrIndex = i + 1 else: lastSubStrIndex = i if i == len(text) - 1: draw_src_text(dest, x, y, text[lastSubStrIndex:i + 1], font, color)