免责声明:我知道这个网站上的其他人有这个错误,但是它处于不同的环境中,并且修复程序似乎在这里不起作用。
嘿stackoverflow, 基本上我一直在做一个侧身太空入侵者游戏,你的船沿着鼠标的Y位置,但是留在左边,然后点击射击子弹。敌人从右侧随机产生并飞向左侧,并且一旦它们在屏幕的每一侧都被移除。这一切都很好,但是当我试图实现碰撞检测以查看射击何时击中敌人时,我得到了错误:
TypeError: Argument must be rect style object.
它指向“return hitbox.colliderect(target.rect)”行。为了尝试找出造成这种情况的原因,我在它下方制作了一些“打印”线,以查看'target.rect'是什么(以及它是否是一个正确的矩形对象),它看起来与镜头的样式完全相同自己的矩形,所以我完全迷失了为什么colliderect不接受它。
我几乎注意到了所有事情,抱歉,如果这是对你的情报的侮辱,但它应该让事情变得更容易。
导致问题的类:
class gameObject:
def __init__(self, image, height, speed):
self.speed = speed
self.image, self.rect = load_image("shot.dsf", -1) #Loads the image and creates rectange
self.pos = image.get_rect().move(0, height)
def move(self):
self.pos = self.pos.move(self.speed, 0) #Moves along
self.rect = [self.pos, 32, 32] #Updates the position of the rectange. Without it the rectangle just stays in the top left corner but the image moves
if self. pos.right > 1400: #Checks if shot goes offscreen
objects.remove(self) #Removes it
def hitreg(self,target):
hitbox = self.rect #Creates hitbox of it's own rectangle
return hitbox.colliderect(target.rect) #SHOULD return true if hitbox collides with the rect of target, however it returns the error
print("OWN RECT: ",self.rect) #Debug purposes, returns ('OWN RECT: [<rect(1350, 245, 32, 32)>, 32, 32])
print("TARGET RECT: ",target.rect) #Debug purposes, returns ('TARGET RECT: [<rect(360, 479, 128, 64)>, 128, 64])
主循环
r.drawFrame() #Renders Frame
while running:
sleep(0.0166) #Make sure it only renders at most 60fps
rand = rnd(10,20) #Generates random number from 10 to 20
pos = pygame.mouse.get_pos() #Gets mouse position
for event in pygame.event.get():
if event.type == MOUSEBUTTONUP: #Prevents hang
None
if event.type == MOUSEBUTTONDOWN: #Creates shot if mousebuttondown, at mouse height with random speed
o = gameObject(shot, pos[1], rand)
objects.append(o)
if rnd(1,120) == 60: #Randomely Spawns Enemy Ships
s = enemyShip(enemya, rnd(10,890), rand) #enemya is filename
ships.append(s)
for o in objects: #For each shot
for s in ships: #For each enemy ship
if o.hitreg(s): #Calls hitreg function, s being the target
s.takedamage()
score = score + 10 #Increases score
r.drawFrame() #Renders Frame
答案 0 :(得分:1)
如果源代码中显示的输出可以信任,则调试语句显示self.rect
和target.rect
都不是“rect style”对象。它们似乎是由rect组成的列表,后跟2个整数,如下所示:
OWN RECT: [<rect(1350, 245, 32, 32)>, 32, 32])
TARGET RECT: [<rect(360, 479, 128, 64)>, 128, 64]
move()
方法负责将self.rect
从“普通”矩形更改为如上所列的列表,但此修改后的self.rect
将不会像rect一样。也许在hitreg()
您应该致电hitbox = self.rect[0]
。
无论如何,在这种情况下,我怀疑所显示的调试语句的输出是不正确的。可能self.rect
的值是rect
(因为列表没有方法colliderect()
,但似乎确实调用了colliderect()
),它是target.rect
这是一个清单。 target.rect
类型为enemyShip
,但您没有显示相应的代码,因此无法确定实际发生的情况(尽管有人可能会猜到move()
已有已被调用,self.rect
已损坏。
我建议您捕获一些真正的调试输出并将其添加到您的问题中。如果您可以发布准确的代码也会有所帮助,因为至少有1个语法错误,例如在行:
if self. pos.right > 1400:
enemyShip
的代码是什么样的?