Pygame蒙版中具有精灵的蒙版碰撞问题

时间:2020-06-09 15:25:51

标签: python 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()

也为英语不好对不起。

1 个答案:

答案 0 :(得分:0)

没关系,要创建蒙版,表面需要Laser没有的Alpha通道。我已对此进行了纠正,并且效果很好。