Bullet to Enemy Collision Detection

时间:2014-04-26 05:27:14

标签: python-3.x pygame

经过几个小时的寻找代码参考。我失败了,我试图重新写入碰撞代码,但失败了。现在我的问题是

如何修复我的代码,以便在子弹击中他时删除敌人的船只

注意:我没有要求你这样做,我只是需要它进一步解释了问题或我犯了错误

代码段

    for bullet in Bullets:
    Hit_list = pygame.sprite.Group()
    if pygame.sprite.collide_rect(bullet, Enemy_list):
        Hit_list.add(hit)
        for hit in Hit_list:
            Bullets.remove(bullet)
            All.remove(bullet)
            All.remove(hit)
            Enemy_list.remove(hit)
            # If the bullet goes off the screen it deletes
        if bullet.rect.y < 0:
            Bullets.remove(bullet)
            All.remove(bullet)

错误

Traceback (most recent call last):
  File "C:\Users\jb127996\Desktop\Invaders in Space\Space Shooter.py", line 92, in     <module>
    if pygame.sprite.collide_rect(bullet, Enemy_list):
  File "C:\Python32\lib\site-packages\pygame\sprite.py", line 1290, in collide_rect
    return left.rect.colliderect(right.rect)
AttributeError: 'Group' object has no attribute 'rect'

整个代码

import pygame
import Player_func
import AI
from pygame.locals import *


#Background 
Background = pygame.image.load('Tempback.png')
Background_size = Background.get_size()
Background_rect = Background.get_rect()

# Screens Resoultion
Width = 640
Height = 480
Scr = pygame.display.set_mode((Width,Height))

# Fps Clock Vars( Clock.tick(FPS) )
Clock = pygame.time.Clock()
FPS = 60

# Colors
White = (255, 255, 255)
Black = (0, 0, 0)
Green = (0, 255, 0)
Red = (255, 0, 0)
Blue = (0, 0, 255)
Orange = (255, 140, 0)
Default = White


# Sprite Lists
Bullets = pygame.sprite.Group()
Enemy_list = pygame.sprite.Group()
All = pygame.sprite.Group()

# Shorting the Class files 
AI = AI.Enemy()
Ply = Player_func.Player()


# CORDS for Player
AI.rect.x, AI.rect.y = 100, 50
AI_pos = (AI.rect.x, AI.rect.y)

Ply.rect.x, Ply.rect.y = 580, 425
P_pos = (Ply.rect.x, Ply.rect.y)

# True false statements and Vars
running = True
Gun_Overload = 0
Fire = 20

while running:
    Enemy_list.add(AI)
    All.add(AI)
    All.add(Ply)

    # Collision Detection for walls on the spaceship
    if Ply.rect.x <= 0:
        Ply.rect.x += 5.5
    elif Ply.rect.x >= 590:
        Ply.rect.x -= 5.5

    # Events
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False

        elif event.type == KEYDOWN:
            if event.key == K_SPACE and Gun_Overload == Fire:
                bullet = Player_func.Bullet()
                bullet.rect.x = (Ply.rect.x +15)
                bullet.rect.y = Ply.rect.y
                Bullets.add(bullet)
                All.add(bullet)
                Gun_Overload = 0


    #Cool Down
    if Gun_Overload < Fire:
        Gun_Overload += 1

    AI.movement()
    Ply.Controls()

    # Updates the Sprite lists so they can all be drawn
    All.update()

    # Checks if a bullet hits the enemy on the list
    for bullet in Bullets:
        Hit_list = pygame.sprite.Group()
        if pygame.sprite.collide_rect(bullet, Enemy_list):
            Hit_list.add(hit)
            for hit in Hit_list:
                Bullets.remove(bullet)
                All.remove(bullet)
                All.remove(hit)
                Enemy_list.remove(hit)
                # If the bullet goes off the screen it deletes
            if bullet.rect.y < 0:
                Bullets.remove(bullet)
                All.remove(bullet)


    Scr.blit(Background, Background_rect)
    All.draw(Scr)
    pygame.display.flip()

    # FPS Clock Loaded in
    Clock.tick(FPS)

pygame.quit()

1 个答案:

答案 0 :(得分:0)

您的If条件使用collide_rect:

pygame.sprite.collide_rect()
Collision detection between two sprites, using rects.
collide_rect(left, right) -> bool

你传递了2个参数 - 一个Bullet和一个SpriteGroup。该错误告诉您SpriteGroup没有Rect属性。

我想你想用:

pygame.sprite.spritecollide()
Find sprites in a group that intersect another sprite.
spritecollide(sprite, group, dokill, collided = None) -> Sprite_list

除此之外,我会将所有变量名称更改为小写。我还注意到你的if bullet.rect.y < 0:正在进行碰撞测试。我想你想要从屏幕上移除子弹,即使没有碰撞。