强化道具不会与玩家冲突(Pygame)
在与玩家角色发生碰撞时,我的能量提升消失不见了。我已经获得了强大的技能,可以用子弹杀死敌人,但我似乎无法收集它们。到目前为止,我已经列出了我的项目。我尝试将几个函数(pygame.sprite.spritecollide()和pygame.rect.colliderect())弄混,但似乎都不起作用。我似乎无法弄清楚问题出在我的Player或Power类中还是在底部的 while循环中。
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)
您没有设置自身。 rect.x
和 self.rect.y
在播放器上只有 self.x
和 self.y
,因此碰撞检测将(0,0)
用作位置。
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.
在 pygame文档中>
spritecollide(sprite,group,dokill,collided = None)-> Sprite_list
spritecollide(sprite, group, dokill, collided = None) -> Sprite_list
返回一个列表,其中包含一个组中与另一个Sprite相交的所有Sprite。通过比较每个Sprite的Sprite.rect属性来确定交叉点。
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.