python - Pygame - 碰撞遮罩
问题描述
我相信我没有根据屏幕中的图像位置正确更新蒙版位置。我不明白为什么,因为在更新图像 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()
解决方案
pygame.mask.from_surface
仅当表面具有 Alpha 通道时才有效。要么pygame.SRCALPHA
作为flags
(第二个)参数传递给pygame.Surface
self.image = pygame.Surface((40, 50), pygame.SRCALPHA)
或致电convert_alpha
self.image = pygame.Surface((40, 50)).convert_alpha()
或致电set_colorkey
self.image.set_colorkey((0, 0, 0))
顺便说一句,没有理由在move_x
andmove_y
方法中创建新的掩码。self.image
只有在修改曲面时才需要这样做。预先创建蒙版并在需要另一个蒙版时切换它们会更好。
推荐阅读
- php - 内联/嵌入式图像附件在 PHP Swift Mailer 发送的邮件中不可见
- react-native - 使用自定义转换和禁用延迟加载来响应本机导航?
- reactjs - 如何动态更新对象的状态?
- android - 构建 APK 需要遵循哪些步骤?
- visual-studio - 如何使用新的 Windows 终端作为 Visual Studio 调试控制台
- javascript - 使用 CSS 交换 div 项
- html - 如何修复:通过 Ajax 加载弹出窗口时出现 404 错误?
- html - Bootstrap 元素无法按预期工作的问题
- python-3.x - 在 Windows 环境中,如果 GPU 已经使用,Cupy 在 multithread.pool 中会出错,即使我使用了 multiprocessing.set_start_method('spawn')
- python-3.x - 如何通过 pyftdi lib 正确地与通过 FTDI USB 连接的 spi 从站通信?