Python:如何将多个精灵组合成一个并保存图像?

问题描述 投票:1回答:1

目前,我正在研究2D自上而下风格的RPG(在Pygame中;最新版本的Python),我想让角色绘制过程尽可能简单。但是,我对于如何实现这一目标一无所知。

我已经知道使用for循环绘制sprite会破坏我的游戏性能,然后我还会有更多的代码需要担心。

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

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

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

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

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

python pygame python-imaging-library sprite sprite-sheet
1个回答
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中查找图像,无论如何),选择适合您需求的方式。

© www.soinside.com 2019 - 2024. All rights reserved.