参数必须是矩形样式对象 - Pygame

argument must be rect style object - Pygame

免责声明:我知道这个网站上的其他人也遇到过这个错误,但它出现在不同的环境中,修复似乎在这里不起作用。

嘿计算器, 基本上,我一直在制作横向 space 入侵者游戏,您的船会跟随鼠标的 Y 位置但保持在左侧,然后单击会发射子弹。敌人从右边随机生成并飞到左边,一旦物体出现在屏幕的一侧,它们就会被移除。这一切都很好,但是当我尝试实施碰撞检测以查看射击何时击中敌人时,我收到错误消息:

TypeError: Argument must be rect style object.

指向"return hitbox.colliderect(target.rect)"行。为了找出造成这种情况的原因,我在它下面做了一些 'print' 行来查看 'target.rect' 是什么(以及它是否是一个正确的 rect 对象),它似乎与镜头自己的矩形,所以我完全不知道为什么 colliderect 不接受它。

我已经对几乎所有内容进行了注释,如果这冒犯了您的智商,我深表歉意,但它应该会让事情变得更简单。

Class 导致问题:

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

如果您的源代码中显示的输出是可信的,则您的调试语句表明 self.recttarget.rect 都不是 "rect style" 对象。它们似乎是由一个矩形和后跟 2 个整数组成的列表,例如:

OWN RECT: [<rect(1350, 245, 32, 32)>, 32, 32])
TARGET RECT: [<rect(360, 479, 128, 64)>, 128, 64]

move() 方法负责将 self.rect 从 "normal" rect 更改为上面的列表,但是这个修改后的 self.rect 不会像 rect 那样工作。也许在 hitreg() 你应该打电话给 hitbox = self.rect[0].

无论如何,在这种情况下,我怀疑您显示的调试语句的输出不正确。可能 self.rect 的值是 rect(因为列表没有方法 colliderect(),但 colliderect() 似乎确实被调用),它是 target.rect那是一个列表。 target.rectenemyShip 类型,但您没有显示它的代码,因此无法判断那里实际发生了什么(尽管可以猜测 move() 有被调用,它 self.rect 已损坏)。

我建议您捕获一些真实的调试输出并将其添加到您的问题中。如果您可以 post 准确的代码,那也会很有帮助,因为至少有 1 个语法错误,例如在行中:

if self. pos.right > 1400:

enemyShip 的代码是什么样的?