与玩家碰撞后反弹

问题描述 投票:1回答:1

我是pygame的新手(事实上是3天),我希望导弹一旦与玩家相撞,就会自动销毁,这样它就不会一直与玩家相撞,因为,当你与玩家和导弹相撞的那一刻,它多次打印 "HIT!"。

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)





python pygame game-physics
1个回答
1
投票

使用 pygame.sprite.spritecollide() 而非 pygame.sprite.groupcollide(). pygame.sprite.spritecollide() 有一个加法参数 独角兽. 如果设置为True,所有碰撞的Sprites将从Group中移除。

if pygame.sprite.spritecollide(player, enemies, True):
    print("Hit!")
© www.soinside.com 2019 - 2024. All rights reserved.