Python 为什么colliderect没有检测到我的碰撞

Python 为什么colliderect没有检测到我的碰撞,python,pygame,Python,Pygame,我对编码非常陌生,我通过重新制作旧的街机游戏来学习,在这里我制作了《太空入侵者》,我让外星人在屏幕上用大炮射击,我可以发射大炮,目前我正在尝试获取子弹和使用colliderect的外星人之间的碰撞检测,但它根本不起作用 import pygame,sys,time from pygame.locals import * pygame.init() windowwidth = 1000 windowheight = 700 windowsurface = pygame.display.se

我对编码非常陌生,我通过重新制作旧的街机游戏来学习,在这里我制作了《太空入侵者》,我让外星人在屏幕上用大炮射击,我可以发射大炮,目前我正在尝试获取子弹和使用colliderect的外星人之间的碰撞检测,但它根本不起作用

import pygame,sys,time
from pygame.locals import *


pygame.init()

windowwidth = 1000
windowheight = 700

windowsurface = pygame.display.set_mode((windowwidth,windowheight),0,32)
pygame.display.set_caption("SPACE INVADERS")


BLACK = (0,0,0)
WHITE = (255,255,255)


#
#OBJECTS
#


#Cannon Class
class theCannon:
    def __init__(self,left,bottom):

        self.left = left
        self.bottom = bottom


    def movecannonleft(self,left):
        self.left -= 6

    def movecannonright(self,left):
        self.left += 6

#End Cannon Class

##ALIEN STUFFS
#Alien Class
class Alien:
    def __init__(self,left,bottom):

        self.left = left
        self.bottom = bottom

#End Alien Class

#creates object aliens in arrays

#tr top row of aliens
trobj = []
trleft = 85
for i in range(1,12):
    trobj.append(Alien(trleft,80))
    trleft += 80
trobj.append(Alien(1100,80))#bug fixer alien

#mr1 second row of aliens
mr1obj = []         
mr1left = 85
for i in range(1,12):
    mr1obj.append(Alien(mr1left,80))
    mr1left += 80
mr1obj.append(Alien(1100,80))#bug fixer alien

#mr2 Third row
mr2obj = []
mr2left = 85
for i in range(1,12):
    mr2obj.append(Alien(mr2left,80))
    mr2left += 80
mr2obj.append(Alien(1100,80))#bug fixer alien

#br1 fourth row
br1obj = []
br1left = 85
for i in range(1,12):
    br1obj.append(Alien(br1left,80))
    br1left += 80
br1obj.append(Alien(1100,80))#bug fixer alien

#br2 fifth row
br2obj = []
br2left = 85
for i in range(1,12):
    br2obj.append(Alien(br2left,80))
    br2left += 80
br2obj.append(Alien(1100,80))#bug fixer alien



##END ALIEN STUFFS

#Bullet Class
activebulletx = 0
cannonactive = False

class Bullet:
    def __init__(self,top,left):

        self.top = top
        self.left = left

    def bullet_shooting(self,left):
        activebulletx = left
        self.left = left + 23
        self.top = 650

    def bullet_going(self,cannonactive):
        if cannonactive == True:
            self.top -= 6

    def bullet_top_hitting(self):
        if self.top < 0:
            self.top = -10000
            return False
        else:
            return True

#END BULLET CLASS


#
#END OBJECTS
#


left = 475
mycannonobj = theCannon(475,650)
bulletobj = Bullet(-10000,10000)

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    windowsurface.fill(BLACK)

    mycannon = pygame.Rect(mycannonobj.left,mycannonobj.bottom,50,25)
    pygame.draw.rect(windowsurface, WHITE, mycannon)

    bullet = pygame.Rect(bulletobj.left,bulletobj.top,5,20)
    pygame.draw.rect(windowsurface, WHITE, bullet)


    #moving cannon
    if pygame.key.get_pressed()[K_a] and mycannon.left > 0:
        mycannonobj.movecannonleft(mycannon.left)

    if pygame.key.get_pressed()[K_d] and mycannon.right < windowwidth:
        mycannonobj.movecannonright(mycannon.right)

    #player firing bullet
    if pygame.key.get_pressed()[K_w] and not cannonactive:
        cannonactive = True
        bulletobj.bullet_shooting(mycannon.left)

    cannonactive = bulletobj.bullet_top_hitting()
    bulletobj.bullet_going(cannonactive)


    #translates aliens into rects and puts onto the screen
    tr = []
    for i in range(0,12):
        tr.append(pygame.Rect(trobj[i].left,80,30,30))              
    for i in range(0,len(tr)):
        pygame.draw.rect(windowsurface, WHITE, tr[i])

    mr1 = []
    for i in range(0,12):
        mr1.append(pygame.Rect(mr1obj[i].left,150,30,30))
    for i in range(0,len(mr1)):
        pygame.draw.rect(windowsurface, WHITE, mr1[i])

    mr2 = []
    for i in range(0,12):
        mr2.append(pygame.Rect(mr2obj[i].left,220,30,30))
    for i in range(0,len(mr2)):
        pygame.draw.rect(windowsurface, WHITE, mr2[i])

    br1 = []
    for i in range(0,12):
        br1.append(pygame.Rect(br1obj[i].left,290,30,30))
    for i in range(0,len(br1)):
        pygame.draw.rect(windowsurface, WHITE, br1[i])

    br2 = []
    for i in range(0,12):
        br2.append(pygame.Rect(br2obj[i].left,360,30,30))
    for i in range(0,len(br2)):
        pygame.draw.rect(windowsurface, WHITE, br2[i])                 



    #hit detection for aliens and bullet

    for i in range(0,len(tr)-1):
        if bullet.colliderect(tr[i]):
            bullet.top = -10000
            cannonactive = False
            del tr[i]

    #screen updates
    pygame.display.update()
    time.sleep(0.02)
import pygame,sys,time
从pygame.locals导入*
pygame.init()
窗宽=1000
窗高=700
windowsurface=pygame.display.set_模式((窗口宽度,窗口高度),0,32)
pygame.display.set_标题(“太空入侵者”)
黑色=(0,0,0)
白色=(255255)
#
#物体
#
#大炮级
卡农类:
def_uuuinit_uuu(self,左侧,底部):
self.left=左
self.bottom=底部
def movecannonleft(自身,左侧):
self.left-=6
def movecannonright(自身,左侧):
self.left+=6
#末级加农炮
##外星生物
#异族
外国人类别:
def_uuuinit_uuu(self,左侧,底部):
self.left=左
self.bottom=底部
#结束外星人类
#在数组中创建对象
#tr第一排外星人
trobj=[]
trleft=85
对于范围(1,12)内的i:
trobj.append(外星人(trleft,80))
trleft+=80
trobj.append(外星人(1100,80))#bug修复程序外星人
#mr1第二排外星人
mr1obj=[]
mr1left=85
对于范围(1,12)内的i:
mr1obj.append(外文(mr1left,80))
mr1left+=80
mr1obj.append(外来(1100,80))#错误修复程序外来
#mr2第三排
mr2obj=[]
mr2left=85
对于范围(1,12)内的i:
mr2obj.append(外来(mr2left,80))
mr2left+=80
mr2obj.append(Alien(1100,80))#bug修复程序Alien
#br1第四排
br1obj=[]
br1左=85
对于范围(1,12)内的i:
br1obj.append(外国人(br1left,80))
br1左侧+=80
br1obj.append(外来(1100,80))#错误修复程序外来
#br2第五排
br2obj=[]
br2left=85
对于范围(1,12)内的i:
br2obj.append(外国人(br2left,80))
br2左侧+=80
br2obj.append(Alien(1100,80))#bug修复程序Alien
##结束外星人的东西
#子弹级
activebulletx=0
cannonactive=假
类别项目符号:
def __;初始(自、上、左):
self.top=top
self.left=左
def子弹头射击(自身,左侧):
activebulletx=左
self.left=左+23
self.top=650
def bullet_going(自动、cannonactive):
如果cannonactive==真:
self.top-=6
def bullet_top_打击(自身):
如果self.top<0:
self.top=-10000
返回错误
其他:
返回真值
#末子弹级
#
#终端对象
#
左=475
mycannonobj=theCannon(475650)
bulletobj=Bullet(-1000010000)
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==退出:
pygame.quit()
sys.exit()
窗口表面填充(黑色)
mycannon=pygame.Rect(mycannonobj.left,mycannonobj.bottom,50,25)
pygame.draw.rect(窗口表面,白色,mycannon)
bullet=pygame.Rect(bulletobj.left,bulletobj.top,5,20)
pygame.draw.rect(窗口表面,白色,子弹形)
#移动加农炮
如果pygame.key.get_按下()[K_a]和mycannon.left>0:
mycannonobj.movecannonleft(mycannon.left)
如果pygame.key.get_按下()[K_d]和mycannon.right

当玩家向外星人发射子弹时,子弹会直接穿过外星人,包括应该可以检测到它的最上面一行。

您正在不断地在主应用程序循环中重新创建矩形列表:

为True时:
# [...]
tr=[]
对于范围(0,12)内的i:
tr.append(pygame.Rect(trobj[i].左,80,30,30))
在循环之前创建一次矩形列表,并删除循环中的“命中”矩形。e、 g:

tr=[]
对于范围(0,12)内的i:
tr.append(pygame.Rect(trobj[i].左,80,30,30))
# [...]
尽管如此:
# [...]
对于范围(0,len(tr))内的i:
pygame.draw.rect(windowsurface,白色,tr[i])
对于范围内的i(len(tr)-1,-1,-1):
如果bullet.collide rect(tr[i]):
bullet.top=-10000
cannonactive=假
德尔tr[i]
注意,您必须以相反的顺序遍历矩形列表,否则,如果通过
del tr[i]
从列表中删除一个元素,您将访问“超出范围”列表 进一步注意,的
stop
参数不包括在范围内。看

或者,您可以在命中1个元素时执行循环:

对于范围内的i(len(tr)):
如果子弹碰撞