我想我没有根据屏幕上的图像位置正确地更新遮罩的位置。我不明白为什么,因为,在更新了图像的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
或致电
^{pr2}$convert_alpha
或致电
set_colorkey
顺便说一句,没有理由在
move_x
和move_y
方法中创建新的掩码。只有在修改self.image
曲面时才需要执行此操作。最好是事先制作好面具,在需要的时候再换一个。在相关问题 更多 >
编程相关推荐