Powerups not colliding with player (Pygame)

感情迁移 提交于 2019-12-12 04:58:00

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!