问题描述
如果玩家和敌人发生碰撞,我希望程序检测玩家和敌人之间的碰撞(几乎是代码底部)。如果发生这种情况,它应该运行“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
# [...]