1

所以我一直在用精灵和组创建一个游戏。除了一直困扰我的一件事之外,一切都进展顺利。一张图说一千多个字:http: //i.imgur.com/S3fsone.png

如您所见,背景图像显示在十字准线中,就像它应该的那样。然而,这艘船被矩形的白色边缘切断了。十字准线和船都是精灵,其中使用的图像是透明的PNG图像。

我不知道如何删除它。目前我正在试验十字准线,所以考虑到这一点,我将发布相关代码:

#Ship class
class Ship(pygame.sprite.Sprite):

    def __init__(self, position):
        pygame.sprite.Sprite.__init__(self)
        self.imageoriginal = pygame.image.load("ship.png")
        self.image = self.imageoriginal
        self.rect = self.image.get_rect()
        self.rect.center = position

#Crosshair class
class Pointer(pygame.sprite.Sprite):

    def __init__(self, image):
        super(Pointer, self).__init__()
        self.image = image.convert_alpha()
        self.rect = self.image.get_rect()

    def update(self):
        self.rect.center = pygame.mouse.get_pos()


def main():
    pygame.init()

    #Window and background
    window = pygame.display.set_mode((1000, 600), SRCALPHA)
    background = pygame.image.load("background.png")
    window.blit(background, (0, 0))

    #Ship and ship group
    ship = Ship((490, 500))
    theship = pygame.sprite.Group(ship)

    #Crosshair image and group
    crosshairimage = pygame.image.load("images\\crosshair.png")
    pointer = pygame.sprite.Group()

    #Game loop
    running = True
    while running:
        clock.tick(60)

        #Cut out from my event loop. Creates the crosshair that follows the mouse
        for e in pygame.event.get():
            elif e.key == K_4:
                pointer.add(Pointer(crosshairimage))

        #Update and redraw methods for both
        theship.clear(window, background)
        theship.update(window)
        theship.draw(window)
        pointer.clear(window, background)
        pointer.update()
        pointer.draw(window)
        pygame.display.flip()

应该就是这样。十字准线完美地跟随鼠标,它的非红色部分在背景上是透明的。然而,它对其他精灵并不透明,这就是问题的关键所在。其他精灵在其他精灵上移动也会导致此问题。

我可以猜测是精灵中的矩形导致了这种情况,但我不知道如何解决它。尝试使用蒙版,但我有点需要矩形才能移动我的精灵,不是吗?在掩码类中发现不等于“self.rect.center = position”方法。

非常感谢有人能告诉我我能做些什么,这已经很长时间了。

4

1 回答 1

0

我认为问题出在您的绘图部分。不是让每个组都清除并单独绘制,而是清除两个组,然后更新它们,然后绘制它们,而不是:

    #Update and redraw methods for both
    theship.clear(window, background)
    theship.update(window)
    theship.draw(window)
    pointer.clear(window, background)
    pointer.update()
    pointer.draw(window)
    pygame.display.flip()

有:

    #Update and redraw methods for both
    theship.clear(window, background)
    pointer.clear(window, background)
    theship.update(window)
    pointer.update()
    theship.draw(window)
    pointer.draw(window)
    pygame.display.flip()

我希望这有帮助。

于 2013-08-07T05:33:32.070 回答