微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame 不会杀人

如何解决Pygame 不会杀人

如果玩家和敌人发生碰撞,我希望程序检测玩家和敌人之间的碰撞(几乎是代码底部)。如果发生这种情况,它应该运行“killBullet()”函数。它实际上运行它,但“self.kill()”不起作用。它真的让我发疯,因为它似乎适用于“更新”。

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

pygame.mixer.init()
pygame.font.init()
pygame.init()

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

global lives
lives = 3

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player,self).__init__()
        self.surf = pygame.image.load("jet.png").convert()
        self.surf.set_colorkey((255,255,255),RLEACCEL)
        self.rect = self.surf.get_rect()

    def update(self,pressed_keys):
        if pressed_keys[K_UP]:
            self.rect.move_ip(0,-5)
            move_up_sound.play()
        if pressed_keys[K_DOWN]:
            self.rect.move_ip(0,5)
            move_down_sound.play()
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-5,0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(5,0)

        #Keep on screen
        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 Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy,self).__init__()
        self.surf = pygame.image.load("missile.png").convert()
        self.surf.set_colorkey((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 killBullet(self):
        self.kill()
        #global lives

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

class Cloud(pygame.sprite.Sprite):
    def __init__(self):
        super(Cloud,self).__init__()
        self.surf = pygame.image.load("cloud.png").convert()
        self.surf.set_colorkey((0,0),)
        )

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

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

ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY,250)
ADDCLOUD = pygame.USEREVENT + 2
pygame.time.set_timer(ADDCLOUD,1000)

player = Player()

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

font = pygame.font.SysFont(None,30)
clock = pygame.time.Clock()
timer = 0

pygame.mixer.music.load("Apoxode_-_Electric_1.mp3")
pygame.mixer.music.play(loops=-1)
move_up_sound = pygame.mixer.sound("Rising_putter.ogg")
move_down_sound = pygame.mixer.sound("Falling_putter.ogg")
collision_sound = pygame.mixer.sound("Collision.ogg")

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()
            cloud.add(new_cloud)
            all_sprites.add(new_cloud)

    pressed_keys = pygame.key.get_pressed()
    player.update(pressed_keys)

    enemies.update()
    cloud.update()


    # Fill the screen with blue
    screen.fill((135,206,250))

    text = font.render(str(timer),True,(255,255))
    screen.blit(text,(0,(SCREEN_HEIGHT-text.get_rect().height)))
    timer=timer+1

    for entity in all_sprites:
        screen.blit(entity.surf,entity.rect)

    if pygame.sprite.spritecollideany(player,enemies):
        Enemy().killBullet()
        lives -= 1
        print(lives)
        if lives <= 0:
            player.kill()
            move_up_sound.stop()
            move_down_sound.stop()
            collision_sound.play()
            running = False
            
    pygame.display.update()
    clock.tick(30)

pygame.mixer.music.stop()
pygame.mixer.quit()

解决方法

pygame.sprite.spritecollideany 测试精灵是否与组中的任何东西相交并返回检测到的第一个精灵或 None。你必须kill检测到的 Sprite 而不是一个新的敌人实例:

while running:
    # [...]

    enemy = pygame.sprite.spritecollideany(player,enemies)
    if enemy:  
        enemy.killBullet()
        lives -= 1
        
        # [...]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。