Pygame碰撞Mas

2024-04-18 01:03:04 发布

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

我想我没有根据屏幕上的图像位置正确地更新遮罩的位置。我不明白为什么,因为,在更新了图像的x和y坐标后,我重新绘制了遮罩以匹配它们的位置。我相信即使是在画了面具之后,它也不会共线,因为面具没有被更新以匹配图像的坐标。这就是这里发生的事吗? 最小代码如下:

import pygame
import random

pygame.init()

black = (0, 0, 0)
height = 600
width = 800
screen = pygame.display.set_mode((width, height))
white = (255, 255, 255)
FPS = 60
clock = pygame.time.Clock()

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((40, 50))
        self.image.fill(black)
        self.rect = self.image.get_rect()
        self.rect.x = 0 + self.rect.x
        self.rect.y = height - self.rect.height
        self.lead_x_change = 0
        self.lead_y_change = 0
        self.speed = 5
        self.health = 100
        self.mask = pygame.mask.from_surface(self.image)

    def move_x(self):

        self.rect.x += self.lead_x_change
        self.mask = pygame.mask.from_surface(self.image)

    def move_y(self):

        self.rect.y += self.lead_y_change
        self.mask = pygame.mask.from_surface(self.image)

    def move_xd_change(self):
        self.lead_x_change += self.speed

    def move_xa_change(self):
        self.lead_x_change += -self.speed

    def move_yu_change(self):
        self.lead_y_change += -self.speed

    def move_yd_change(self):
        self.lead_y_change += self.speed

    def stop_x_change(self):
        self.lead_x_change = 0

    def stop_y_change(self):
        self.lead_y_change = 0

class Apple(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((40, 50))
        self.image.fill(black)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(100, 700)
        self.rect.y = random.randint(100, 500)
        self.mask = pygame.mask.from_surface(self.image)



apple = Apple()
player = Player()

all_sprites = pygame.sprite.Group()
all_sprites.add(player, apple)
gameExit = False

while not gameExit:

    screen.fill(white)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameExit = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:

                player.move_yu_change()

            if event.key == pygame.K_s:

                player.move_yd_change()

            if event.key == pygame.K_d:

                player.move_xd_change()

            if event.key == pygame.K_a:

                player.move_xa_change()

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_w or event.key == pygame.K_s:

                player.stop_y_change()

            if event.key == pygame.K_d or event.key == pygame.K_a:

                player.stop_x_change()

    player.move_x()
    player.move_y()
    all_sprites.draw(screen)

    hit = pygame.sprite.collide_mask(player, apple)
    if hit:
        apple.rect.x = random.randint((100, 700))
        apple.rect.y = random.randint((100, 500))
        apple.mask = pygame.mask.from_surface(apple.image)

    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()
quit()

Tags: keyrectimageselfeventapplemoveif
1条回答
网友
1楼 · 发布于 2024-04-18 01:03:04

pygame.mask.from_surface仅当曲面具有alpha通道时有效。将pygame.SRCALPHA作为flags(第二个)参数传递给pygame.Surface

self.image = pygame.Surface((40, 50), pygame.SRCALPHA)

或致电convert_alpha

^{pr2}$

或致电set_colorkey

self.image.set_colorkey((0, 0, 0))

顺便说一句,没有理由在move_xmove_y方法中创建新的掩码。只有在修改self.image曲面时才需要执行此操作。最好是事先制作好面具,在需要的时候再换一个。在

相关问题 更多 >

    热门问题