python - Python:如何将多个精灵合二为一并保存图像?
问题描述
目前,我正在开发一个 2D 自上而下风格的 RPG(在 Pygame 中;最新版本的 Python),我想让角色绘制过程尽可能简单。但是,我不知道如何实现它。
我已经知道使用 for 循环绘制精灵会降低我的游戏性能,然后我还要担心更多代码。
我想做的是拍摄一个“裸体”精灵,将眼睛、头发和衣服放在上面,然后将其保存为新图像。
(MaleSprite.png + Eyes1.png + Hair1.png + Clothes1.png = Spritesheet.png)
我已经有一个裸体精灵的精灵表,我也有一个发型的精灵表。我需要将头发向上移动两个像素,然后将其绘制在角色的顶部,然后将其保存到新图像中(因为角色的精灵表是 64px 高,所以新图像将是 66px 高)。
我将处理代码中出现的任何其他依赖项,我只需要组合这些图像,我相信我应该为此使用 Pillow。
我想获得玩家对眼睛颜色、头发和服装的选择,然后将其写入他们的玩家文件。之后,makesprite() 函数应该获取精灵,根据需要调整它们(头发将向上移动两个像素,帽子可能会更多),然后将其保存为我可以使用的新精灵表 (png)在我的 sprite.draw() 函数中。
解决方案
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 中查找图像,无论如何),选择适合您需要的方式。
推荐阅读
- r - SplitSeries 在 r 中的 Packed Bubble Highchart 中不起作用
- java - 什么时候需要使用实现 Iterable
- sql - 如何在 SQL 中对层次结构中的组织结构进行编码
- python - 如何修复 Keras LSTM 输入/输出尺寸?
- r - R根据两个不同的参数创建多个列
- php - Stripe - 结帐不支持没有名称的 SKUS
- streamsets - Streamsets 在尝试解析有效 JSON 时出现此错误
- javascript - 仅在没有登录表单的页面上加载 Hubspot 跟踪代码
- jquery - 显示具有动态内容的新面板的简单方法
- php - 在 WooCommerce 电子邮件通知中显示特定产品属性