【问题标题】:Python: How can I combine several sprites into one and save the image?Python:如何将多个精灵合二为一并保存图像?
【发布时间】:2019-07-08 23:24:43
【问题描述】:

目前,我正在开发一个 2D 自上而下风格的 RPG(在 Pygame 中;最新版本的 Python),我想让角色绘制过程尽可能简单。但是,我不知道如何实现它。

我已经知道使用 for 循环绘制精灵会影响我的游戏性能,然后我还要担心更多代码。

我想做的是拍摄一个“裸体”精灵,将眼睛、头发和衣服放在上面,然后将其保存为新图像。

(MaleSprite.png + Eyes1.png + Hair1.png + Clothes1.png = Spritesheet.png)

我已经有一个裸体精灵的精灵表,我也有一个发型的精灵表。我需要将头发向上移动两个像素,然后将其绘制在角色的顶部,然后将其保存到新图像中(因为角色的精灵表是 64px 高,所以新图像将是 66px 高)。

我将处理代码中出现的任何其他依赖项,我只需要组合这些图像,我相信我应该为此使用 Pillow。

我想获取玩家对眼睛颜色、头发和服装的选择,然后将其写入他们的玩家文件。之后,makesprite() 函数应该获取精灵,根据需要调整它们(头发将向上移动两个像素,帽子可能会更多),然后将其保存为我可以使用的新精灵表 (png)在我的 sprite.draw() 函数中。

【问题讨论】:

  • 这听起来像premature optimisation,这通常很糟糕。通常我们对什么是慢和快的想法与实践不同。我建议实施您的初始方法,然后研究如何优化问题。在重叠图像方面,您可以在配置过程中将它们全部blit 到您的精灵图像上。当你展示你迄今为止所做的尝试时,会更容易回答问题。
  • @Eric 提出了一个很好的观点。显然代码不应该每次都绘制 4x sprites 来绘制玩家位图,但是可以将 4 个部分组合为一次性操作,然后用作单个 sprite。即使在sprite.__init__()。实际上听起来很灵活。
  • 实际上,你们都提出了很好的观点。我从来没有听过关于过早优化的谚语(这实际上是我一直在做的),所以我会先努力让它发挥作用,呵呵。感谢您的建议!

标签: python pygame python-imaging-library sprite sprite-sheet


【解决方案1】:

Pygame 可以很好地处理这个问题,不需要其他库。只需查看image 模块,您会在其中找到save 函数以及tostring/fromstring

但是,如果您从一组模板创建播放器精灵,则没有太多理由将图像实际保存到磁盘。您可以在启动时通过将所有不同的部分(身体、头发、眼睛......)blitting 到一个新的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 中查找图像,等等),选择适合您需要的方法。

【讨论】:

  • 好吧该死的,从来没有想过这一点。我得试一试,谢谢!实际上,这里发生的事情的步骤是什么(我不知道 **look 部分是什么)?
  • 只需谷歌“python kwargs”。这基本上意味着您可以向此函数传递任意数量的关键字参数,它们将被收集在一个字典中。
猜你喜欢
  • 2012-08-27
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
相关资源
最近更新 更多