Python Pygame:检测子弹和敌人之间的碰撞时出错(太空入侵者)

时间:2016-07-19 01:06:34

标签: python pygame

我正在尝试用Python创建一个基本的Space Invaders游戏。我正在努力的部分是检测玩家发射的子弹何时击中敌方目标。我有一个Sprite class的子弹和敌人都有指定精灵的边界矩形的属性,我有一个intersect method来检查子弹是否使用colliderect方法击中了敌人。然而,无论子弹是否实际击中了敌人,intersect method总会返回1(不确定这意味着什么)。

from pygame import *
import random
import sys

class Sprite:
    '''
        A Sprite class that can initialize a sprite based on an image, and display it.

        Parameters:
            filename -> the path of the image to be used
            xpos -> the x position of the sprite
            ypos -> the y position of the sprite
    '''
    def __init__(self, filename, xpos, ypos):
        self.xpos = xpos
        self.ypos = ypos
        self.sprite_image, self.rect = load_image(filename, (0, 0, 0))
        self.sprite_image.set_colorkey((0, 0, 0)) 

    def display(self, screen):
        '''
            Displays the sprite onto the screen.

            Parameters:
                screen -> the PyGame display to draw onto.
        '''
        screen.blit(self.sprite_image, (self.xpos, self.ypos))

    def intersect(self, sprite_2):
        '''
            Returns whether a sprite intersects with another sprite.

            Parameters:
                sprite_2 -> the sprite to compare intersection with

            Returns:
                Whether the sprite intersects with sprite_2
        '''
        return self.rect.colliderect(sprite_2.rect)

def load_image(path, colorkey):
    '''
        Returns an image and its bounding rectangle based on a filename.

        Parameters:
            path -> the path of the picture
            colorkey -> the color defined to be transparent

        Returns:
            the loaded image
            the bounding rectangle of the image
    '''
    try:
        sprite_image = image.load(path)
    except error, message:
        print("Cannot load image: {0}".format(path))

    sprite_image = sprite_image.convert()

    if colorkey is not None:
        if colorkey is -1:
            colorkey = sprite_image.get_at((0, 0))
        sprite_image.set_colorkey(colorkey, RLEACCEL)

    return sprite_image, sprite_image.get_rect()

def main():
    '''
        The main function runs the Space Invader game, implementing all the logic, calculation,
        and user interaction.
    '''
    init()
    screen = display.set_mode((800, 600))
    display.set_caption("Space Invaders")

    fighter = Sprite("spaceship.png", 357, 520)

    enemies = []
    bullets_good = [] # List of all of the bullets fired by the hero / fighter

    for i in range(8): # Add the enemies into the enemies list
        new_enemy = Sprite("enemy.png", 55 * i + 10, 50)
        enemies.append(new_enemy)

    while True:
        screen.fill((0, 0, 0)) # Continiously refresh the background of the screen

        for enemy in enemies: # Draw the enemies onto the screen
            enemy.display(screen)

        for bullet in bullets_good: # Draw the bullets onto the screen
            bullet.ypos -= 10

            for enemy in enemies:
                if bullet.intersect(enemy) == 0:
                    print("MISSILE HIT ENEMY")

            bullet.display(screen)

        for keyevent in event.get(): # Go through key press events
            if keyevent.type == QUIT:
                quit()
                sys.exit()
            if keyevent.type == KEYDOWN:
                if keyevent.key == K_LEFT: 
                    fighter.xpos -= 5
                if keyevent.key == K_RIGHT:
                    fighter.xpos += 5
                if keyevent.key == K_UP:
                    # Create a new bullet and add it to the list of bullets fired by the hero
                    bullet = Sprite("bullet.png", fighter.xpos + 34, fighter.ypos - 20)
                    bullets_good.append(bullet)

        fighter.display(screen)
        display.update()
        pass

main() # Run the game!

1 个答案:

答案 0 :(得分:2)

你必须为每个敌人设置你的精灵矩形属性,然后才能调用该函数colliderect。

这就是我的意思:

enemy.rect.top = some y-value
enemy.rect.left = some x-value
enemy.rect.bottom = some-height
enemy.rect.right = some-width