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

2024-04-25 05:18:50 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在开发一个2D自上而下风格的RPG(Pygame中;Python的最新版本),我希望使角色绘制过程尽可能简单。然而,我不知道该怎么做。在

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

我想做的是拍一个“裸体”的精灵,把眼睛、头发和衣服放在上面,然后把它保存成一个新的形象。在

在(MaleSprite.png+眼睛1.png+Hair1.png+closes1.png=精灵表.png)在

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

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

我想得到球员的眼睛颜色,头发和衣服的选择,然后写到他们的球员文件。之后,makesprite()函数应该获取精灵,根据需要调整它们(头发将上移两个像素,帽子可能会更多),然后将其保存为一个新的sprite sheet(png),我可以在我的精灵.绘制()功能。在


Tags: 代码图像角色png风格绘制像素rpg
1条回答
网友
1楼 · 发布于 2024-04-25 05:18:50

Pygame可以很好地处理这个问题,不需要其他库。只需看看^{}模块,在那里您可以找到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中查找图像,等等),选择一种适合您需要的方式。在

相关问题 更多 >