当前,我正在研究2D自顶向下样式的RPG(在Pygame中; Python的最新版本),并且我希望使字符绘制过程尽可能简单。但是,我不知道如何实现它。
我已经知道使用for循环绘制精灵会杀死我的游戏性能,然后我还要担心更多代码。
我想要做的是拿一个“裸体”精灵,在上面放上眼睛,头发和衣服,然后将其另存为新图像。
(MaleSprite.png + Eyes1.png + Hair1.png + Clothes1.png = Spritesheet.png)
我已经有一个用于裸体精灵的精灵表格,并且我也有一个用于发型的精灵表格。我需要将头发向上移动两个像素,然后将其绘制在角色上方,然后将其保存到新图像中(由于角色的子画面高度为64px,因此新图像的高度为66px)。>
我将处理代码中出现的任何其他依赖关系,我只需要合并这些图像,并且我相信我应该为此使用Pillow。
我想获得玩家对眼睛颜色,头发和衣服的选择,然后将其写入他们的玩家文件中。之后,makesprite()函数应该获取精灵,根据需要对其进行调整(头发将向上移动两个像素,帽子可能会更多),然后将其保存为我可以使用的新精灵表(png)在我的sprite.draw()函数中。
答案 0 :(得分:1)
Pygame可以很好地处理此问题,不需要其他库。只需看一下image
模块,您将在其中找到save
函数和tostring
/ fromstring
。
但是,如果您从一组模板创建播放器精灵,则没有太多理由将图像实际保存到磁盘。您只需在启动时通过将所有不同的部分(身体,头发,眼睛...)涂抹到新的Surface
上来创建播放器图像,然后使用它即可。
下面是一些伪代码,看起来像这样:
import pygame
from collections import defaultdict
def load_image(filename):
... load and cache the image ...
offset = defaultdict(lambda: (0, 0))
offset['eyes'] = (0, 2) # let's blit eyes not at (0, 0), but at (0, 2)
def build_body_image(**look):
surf = pygame.Surface((66, 66))
for part in look:
surf.blit(load_image(look[part]), offset[part])
class Actor(pygame.sprite.Sprite):
def __init__(self, **look):
super().__init__()
self.look = look
self.image = build_body_image(**self.look)
...
player = Actor(body='MaleSprite.png',
clothes='Clothes1.png'
eyes='Eyes1.png',
hair='Hair1.png')
如果要保留玩家的外观,只需保留look
属性,然后在启动时调用build_body_image
一次即可重新创建最终的玩家图像。
当然,有几种方法可以做到这一点(例如,您可以只存储一个索引而不是完整的文件名和/或在Spritesheet中查找图像,无论如何),选择一种适合您需求的方法。