问题
I've been having trouble getting my powerups to disappear upon colliding with the player character. I've been able to get powerups to drop upon killing enemies with bullets, but I can't seem to collect them. I've listed my project so far. I've tried messing with a couple functions (pygame.sprite.spritecollide() and pygame.rect.colliderect()) but neither seemed to work. I can't seem to figure out if the problem is in my Player or Power class or in the "while" loop at the bottom.
import pygame, sys, random
from pygame.locals import *
# Colors
black = (0,0,0)
white = (255, 255, 255)
blue = (0, 0, 255)
red = (255, 0, 0)
pygame.init()
screen_width = 600
screen_height = 600
screen = pygame.display.set_mode([screen_width, screen_height])
# Bullet
bullet_image = pygame.image.load('pbbullet.png')
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('pbtouhou.png')
self.rect = self.image.get_rect()
self.x = 300
self.y = 300
self.bombamount = 3
self.bombtimer = 0
self.bombmax = 10
self.power = 1.0
self.lives = 3
def handle_keys(self):
key = pygame.key.get_pressed()
dist = 5
if key[pygame.K_LSHIFT]:
dist = 2
else:
dist = 5
if key[pygame.K_DOWN]:
self.y += dist
elif key[pygame.K_UP]:
self.y -= dist
if key[pygame.K_RIGHT]:
self.x += dist
elif key[pygame.K_LEFT]:
self.x -= dist
def draw(self, surface):
surface.blit(self.image, (self.x, self.y))
class Bullet(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = bullet_image
self.rect = self.image.get_rect()
def update(self):
# Move the bullet
self.rect.y -= 5
class Enemy(pygame.sprite.Sprite):
def __init__(self, color):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([20, 15])
self.image.fill(color)
self.rect = self.image.get_rect()
# Powerups
class Power(pygame.sprite.Sprite):
def __init__(self, x, y, player):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([5, 5])
self.image.fill(red)
self.player = player
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
def update(self):
self.rect.y += 2
#Set up
player = Player() # create an instance
clock = pygame.time.Clock()
#Lists
all_sprites_list = pygame.sprite.Group()
enemy_list = pygame.sprite.Group()
bullet_list = pygame.sprite.Group()
power_list = pygame.sprite.Group()
#Test Enemy
bad_guy = Enemy(blue)
bad_guy.rect.x = 100
bad_guy.rect.y = 100
all_sprites_list.add(bad_guy)
enemy_list.add(bad_guy)
###
running = True
while running: #main game loop
key = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
running = False
if key[pygame.K_z]:
bullet = Bullet()
bullet.rect.x = player.x + 35
bullet.rect.y = player.y
all_sprites_list.add(bullet)
bullet_list.add(bullet)
all_sprites_list.update()
# Bullets hit enemies
for bullet in bullet_list:
# See if it hit a enemy
enemy_hit_list = pygame.sprite.spritecollide(bullet, enemy_list, True)
for enemy in enemy_hit_list:
bullet_list.remove(bullet)
all_sprites_list.remove(bullet)
power = Power(bullet.rect.left, bullet.rect.top, player)
power_list.add(power)
all_sprites_list.add(power)
if bullet.rect.y < -10:
bullet_list.remove(bullet)
all_sprites_list.remove(bullet)
# Player gathers bonuses
power_hit_list = pygame.sprite.spritecollide(player, power_list, True)
for power in power_hit_list:
power_list.remove(power)
all_sprites_list.remove(power)
for power in power_list:
if power.rect.y > (10 + screen_height):
power_list.remove(power)
all_sprites_list.remove(power)
player.handle_keys()
screen.fill(white)
all_sprites_list.draw(screen)
player.draw(screen)
pygame.display.flip()
clock.tick(60)
回答1:
You are not setting the self.rect.x and self.rect.y on your player only the self.x and self.y, so the collision detection is using (0, 0) as its position.
In the pygame docs
spritecollide(sprite, group, dokill, collided = None) -> Sprite_list
Return a list containing all Sprites in a Group that intersect with another Sprite. Intersection is determined by comparing the Sprite.rect attribute of each Sprite.
来源:https://stackoverflow.com/questions/25733027/powerups-not-colliding-with-player-pygame