Pygame蒙版与成组精灵的冲突问题



我正在pygame中制作一个游戏,激光和敌人之间的掩码碰撞不起作用。我尝试了我能找到的一切,但它仍然不起作用。当我向敌人射击时,什么也没发生。我没有收到任何错误激光只是飞过敌人。是矩形或掩码有问题,还是我只是实现错了? 代码如下:

import pygame
import sys
import os
import random
class Sprite(pygame.sprite.Sprite):
def __init__(self, x, y, vel, width, height, img):
pygame.sprite.Sprite.__init__(self)
self.x, self.y = x, y
self.vel = vel
self.width, self.height = width, height
self.img = pygame.transform.scale(img, (self.width, self.height))
self.rect = self.img.get_rect(topleft=(self.x, self.y))
self.mask = pygame.mask.from_surface(self.img)
def show(self, surface):
surface.blit(self.img, (self.x, self.y))
self.rect.topleft = (self.x, self.y)
class Laser(Sprite):
def __init__(self, x, y, vel, width, height, color):
super().__init__(x, y, vel, width, height, pygame.Surface((width, height)).convert())
self.img.fill(color)
class Ship(Sprite):
def __init__(self, x, y, vel, width, height, img, laserColor, laserVel):
super().__init__(x, y, vel, width, height, img)
self.lasers = pygame.sprite.Group()
self.laserColor = laserColor
self.laserVel = laserVel
def shoot(self):
laserWidth, laserHeight = pixelSize, pixelSize * 3
self.lasers.add(Laser(self.x + self.width // 2 - laserWidth // 2, self.y, self.laserVel, laserWidth,
laserHeight, self.laserColor))
def moveLasers(self):
for laser in self.lasers.sprites():
if laser.y > 0:
laser.y -= laser.vel
laser.show(win)
else:
laser.kill()
del laser
class Enemy(Ship):
def shoot(self):
laserWidth, laserHeight = pixelSize, pixelSize * 3
enemyLasers.add(Laser(self.x + self.width // 2 - laserWidth // 2, self.y, self.laserVel, laserWidth,
laserHeight, self.laserColor))
def gameLoop():
clock = pygame.time.Clock()
fps = 60
frameCount = 0
enemyImg = []
for i in range(3):
enemyImg.append(pygame.image.load(os.path.join('assets', 'img', f'enemy{i}.png')))
enemyWidth, enemyHeight = pixelSize * 9, pixelSize * 7
enemies = pygame.sprite.Group()
global enemyLasers
enemyLasers = pygame.sprite.Group()
playerImg = pygame.image.load(os.path.join('assets', 'img', 'player.png')).convert_alpha()
playerWidth, playerHeight = pixelSize * 15, pixelSize * 14
player = Ship(screenWidth // 2 - playerWidth // 2, 500, 7, playerWidth, playerHeight, playerImg,
(0, 255, 0), 5)
while True:
clock.tick(fps)
if frameCount % fps == 0:
enemies.add(Enemy(random.randint(0, screenWidth - enemyWidth), -enemyHeight, 3, enemyWidth,
enemyHeight, random.choice(enemyImg), (255, 0, 0), -5))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
keys = pygame.key.get_pressed()
if (keys[pygame.K_LEFT] or keys[pygame.K_a]) and player.x > 0:
player.x -= player.vel
if (keys[pygame.K_RIGHT] or keys[pygame.K_d]) and player.x + player.width < screenWidth:
player.x += player.vel
if (keys[pygame.K_UP] or keys[pygame.K_w]) and player.y > 0:
player.y -= player.vel
if (keys[pygame.K_DOWN] or keys[pygame.K_s]) and player.y + player.height < screenHeight:
player.y += player.vel
if keys[pygame.K_SPACE] and frameCount % (fps / 10) == 0:
player.shoot()
for laser in enemyLasers.sprites():
if laser.y < screenHeight:
laser.y -= laser.vel
laser.show(win)
else:
laser.kill()
del laser
for enemy in enemies.sprites():
for laser in player.lasers.sprites():
if laser.mask.overlap(enemy.mask, (laser.rect[0] - enemy.rect[0], laser.rect[1] - enemy.rect[1])):
enemy.kill()
del enemy
print('Hit!')
if frameCount % fps == 0 and random.choice([True, False]):
enemy.shoot()
enemy.y += enemy.vel
enemy.show(win)
player.moveLasers()
player.show(win)
pygame.display.update()
win.fill((0, 0, 0))
frameCount += 1
def main():
global screenWidth, screenHeight, win, pixelSize
pixelSize = 5
pygame.init()
screenWidth, screenHeight = 650, 650
win = pygame.display.set_mode((screenWidth, screenHeight))
pygame.display.set_caption('Space shooter')
gameLoop()
if __name__ == '__main__':
main()

没关系,事实证明,为了创建一个蒙版,表面需要一个Laser没有的阿尔法通道。我纠正了这一点,它工作正常。

最新更新