与玩家碰撞时弹跳

时间:2020-05-20 09:56:38

标签: python pygame game-physics

我是pygame的新手(实际上是3天),一旦导弹与玩家发生碰撞,我希望导弹:

if pygame.sprite.spritecollideany(player, enemies):
        print("Hit!")

自行消灭,所以它不会一直与玩家碰撞,因为当您与玩家和导弹碰撞时,它会打印“ HIT!”。我认为原因是它多次穿过导弹,并且玩家在穿过导弹时不断与导弹相撞。

这是完整的代码:

import pygame
import random

from pygame.locals import(
    RLEACCEL,
    K_UP,
    K_DOWN,
    K_LEFT,
    K_RIGHT,
    K_ESCAPE,
    KEYDOWN,
    QUIT
)

pygame.init()
pygame.display.set_caption("Dodge The Missile")

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

font = pygame.font.Font("Airstrip Four.ttf", 24)

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy, self).__init__()
        self.surf = pygame.image.load("Missiles.png").convert()
        self.surf.set_colorkey((255,255,255), RLEACCEL)
        self.rect = self.surf.get_rect(
            center=(
                random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100),
                random.randint(0, SCREEN_HEIGHT),
            )
        )
        self.speed = random.randint(5,20)


    def update(self):
        self.rect.move_ip(-self.speed, 0)
        if self.rect.right < 0:
            self.kill()

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player, self).__init__()
        self.surf = pygame.image.load("Spaceship.png").convert()
        self.surf.set_colorkey((255,255,255), RLEACCEL)
        self.rect = self.surf.get_rect()
        self.layers = 1
    def update(self, pressed_keys):
            if pressed_keys[K_UP]:
                self.rect.move_ip(0, -5)
            if pressed_keys[K_DOWN]:
                self.rect.move_ip(0, 5)
            if pressed_keys[K_LEFT]:
                self.rect.move_ip(-5, 0)
            if pressed_keys[K_RIGHT]:
                self.rect.move_ip(5, 0)

            if self.rect.left < 0:
                self.rect.left = 0
            if self.rect.right > SCREEN_WIDTH:
                self.rect.right = SCREEN_WIDTH
            if self.rect.top <= 0:
                self.rect.top = 0
            if self.rect.bottom >= SCREEN_HEIGHT:
                self.rect.bottom = SCREEN_HEIGHT

class Cloud(pygame.sprite.Sprite):
    def __init__(self):
        super(Cloud, self).__init__()
        self.surf = pygame.image.load("Cloud.png").convert()
        self.surf.set_colorkey((255,255,255), RLEACCEL)
        self.layers = 3
        self.rect = self.surf.get_rect(
            center=(
                random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100),
                random.randint(0, SCREEN_HEIGHT)
            )
        )

    def update(self):
        self.rect.move_ip(-5, 0)
        if self.rect.right < 0:
            self.kill()



class AddEnemyTimer():
    def __init__(self, Generate_Enemy_Timer, Generate_Cloud_Timer):
        self.Generate_Enemy_Timer = Generate_Enemy_Timer
        self.Generate_Cloud_Timer = Generate_Cloud_Timer

count = 0
green = (0, 255, 0)

screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) 

green = (0, 255, 0)

Generate_Timer= AddEnemyTimer(random.randint(250, 350), random.randint(500, 1000) )
ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY, Generate_Timer.Generate_Enemy_Timer)
ADDCLOUD = pygame.USEREVENT + 2
pygame.time.set_timer(ADDCLOUD, Generate_Timer.Generate_Cloud_Timer)
New_Progress = pygame.USEREVENT + 3
player = Player()

health = 0

green = (0, 255, 0)

enemies = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)
clouds = pygame.sprite.Group()


clock = pygame.time.Clock()

running = True

while running:
    for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:

                    running = False
            elif event.type == QUIT:
                running = False

            elif event.type == ADDENEMY:
                new_enemy = Enemy()
                enemies.add(new_enemy)
                all_sprites.add(new_enemy)

            elif event.type == ADDCLOUD:
                new_cloud = Cloud()
                clouds.add(new_cloud)
                all_sprites.add(new_cloud)

            elif event.type == New_Progress:
                count+= 1

    screen.fill((135,206,250))
    for entity in all_sprites:
        screen.blit(entity.surf, entity.rect)
    if pygame.sprite.spritecollideany(player, enemies):
        print("Hit!")


    screen.blit(font.render(str(count), True, (0, 0, 0)), (375, 48))

    pressed_keys = pygame.key.get_pressed()
    player.update(pressed_keys)
    enemies.update()
    clouds.update()
    pygame.display.flip()

    clock.tick(59.94)





1 个答案:

答案 0 :(得分:1)

使用pygame.sprite.spritecollide()而不是pygame.sprite.groupcollide()pygame.sprite.spritecollide()有一个附加参数 dokill 。如果设置为True,则所有碰撞的精灵将从组中删除。

if pygame.sprite.spritecollide(player, enemies, True):
    print("Hit!")