python-基于位置的Pygame重叠精灵(绘制顺序)

python-基于位置的Pygame重叠精灵(绘制顺序),第1张

概述一般而言,我对Pygame和Python还是比较陌生,所以希望这不是太过.我正在制作一个自上而下的RPG,我有两个Sprite对象,其图像看起来(例如)如下所示: 使用不代表整个图像的矩形:class NPC(pygame.sprite.Sprite): def __init__(self, image, pos, *groups):

一般而言,我对Pygame和Python还是比较陌生,所以希望这不是太过.

我正在制作一个自上而下的RPG,我有两个Sprite对象,其图像看起来(例如)如下所示:

使用不代表整个图像的矩形:

class NPC(pygame.sprite.Sprite):    def __init__(self,image,pos,*groups):        super().__init__(*groups)        self.image = pygame.load(image)        self.rect = self.image.get_rect()        self.collisionRect = pygame.Rect(self.rect.left,self.rect.top + 12,self.image.get_wIDth(),self.image.get_wIDth())         #12 is the number of pixels that will overlap in the y-dimension

我这样做是因为我希望NPC的顶部像素与其他子画面重叠.每当我检测到碰撞时,就会在rect上方使用每个对象中的collisionRect,以便创建此效果.

但是,我需要一种在我的update()函数中重绘它们的方法,以便一个可以根据它们彼此之间的相对位置绘制另一个.

因此,当一个NPC高于另一个NPC时,它看起来像这样:

但是,反之则应如下所示:

这意味着图像需要以不同的顺序绘制,具体取决于哪个精灵位于另一个精灵之下.

我曾考虑过将精灵切成单独的精灵,而只将“ head”精灵绘制到最后,但是我想知道是否存在一种更简单(或至少可靠)的方法来检测是否应该最后绘制精灵或否,取决于它是否同时与另一个子图重叠并且在y维中紧接在其下.

如果这个问题涉及面太广或需要更多背景信息,我深表歉意.可以根据需要提供.

最佳答案正如金斯利(Kingsley)在评论中所说,按其y坐标对子画面进行排序是一种常用的方法.

这是一个完整的运行示例(我将您的图像命名为guy.png和gal.png).由于您已经使用过精灵,因此我使用了一个简单的pygame.sprite.Group-subclass:

import pygameclass Actor(pygame.sprite.Sprite):    def __init__(self,pos):        super().__init__()        self.image = image        self.pos = pygame.Vector2(pos)        self.rect = self.image.get_rect(center=self.pos)    def update(self,events,dt):        passclass Player(Actor):    def __init__(self,pos):        super().__init__(image,pos)    def update(self,dt):        pressed = pygame.key.get_pressed()        move = pygame.Vector2((0,0))        if pressed[pygame.K_w]: move += (0,-1)        if pressed[pygame.K_a]: move += (-1,0)        if pressed[pygame.K_s]: move += (0,1)        if pressed[pygame.K_d]: move += (1,0)        if move.length() > 0: move.normalize_ip()        self.pos += move*(dt/5)        self.rect.center = self.posclass YAwareGroup(pygame.sprite.Group):    def by_y(self,spr):        return spr.pos.y    def draw(self,surface):        Sprites = self.Sprites()        surface_blit = surface.blit        for spr in sorted(Sprites,key=self.by_y):            self.spritedict[spr] = surface_blit(spr.image,spr.rect)        self.lostSprites = []def main():    pygame.init()    screen = pygame.display.set_mode((500,500))    clock = pygame.time.Clock()    dt = 0    Sprites = YAwareGroup(Player(pygame.image.load('guy.png').convert_Alpha(),(100,200)),Actor(pygame.image.load('gal.png').convert_Alpha(),(200,200)))    while True:        events = pygame.event.get()        for e in events:            if e.type == pygame.QUIT:                return        Sprites.update(events,dt)        screen.fill((30,30,30))        Sprites.draw(screen)        pygame.display.update()        dt = clock.tick(60)if __name__ == '__main__':    main()

如果您需要自定义绘制逻辑,则将pygame的Group类子类化通常不是最坏的主意.您可以找到其来源here,以了解其工作原理. 总结

以上是内存溢出为你收集整理的python-基于位置的Pygame重叠精灵(绘制顺序) 全部内容,希望文章能够帮你解决python-基于位置的Pygame重叠精灵(绘制顺序) 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1199614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存