当前位置: 首页 > 知识库问答 >
问题:

参数必须是rect样式的对象-Pygame

李浩邈
2023-03-14

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

嘿stackoverflow,基本上我一直在做一个横向空间入侵者游戏,你的船跟随你鼠标的Y位置,但留在左边,点击发射一颗子弹。敌人从右边随机产卵,然后飞向左边,一旦物体进入屏幕一侧,它们就会被移除。这一切都很好,但是当我试图实施冲突检测来查看射击何时击中敌人时,我得到了错误:

TypeError: Argument must be rect style object.

它指向行返回hitbox.colliderect(target.rect)。为了找出是什么导致了这种情况,我在它下面做了一些“打印”线,看看“target.rect”是什么(以及它是否是一个合适的矩形对象),它似乎与照片自己的矩形完全相同,所以我完全不明白为什么碰撞不接受它。

我已经注释了几乎所有的东西,如果这是对你智力的侮辱,很抱歉,但这应该会让事情变得更容易。

引起问题的类:

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

共有1个答案

章飞虎
2023-03-14

如果源代码中显示的输出是可信的,那么调试语句将显示这两个self。rect目标。rect是“rect样式”对象。它们似乎是由一个rect后跟2个整数组成的列表,如下所示:

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

方法负责将self.rect从正常的rect更改为如上所述的列表,但是这个修改后的self.rect不会表现得像rect。也许在hitreg()中,您应该调用hitbox=self.rect[0]

无论如何,在这种情况下,我怀疑所显示的调试语句的输出是不正确的。可能self.rect的值是一个rect(因为列表中没有方法碰撞器(),但是碰撞器()似乎确实被调用),并且它是target.rect这是一个列表。target.rect是类型敌军Ship,但是你没有显示代码,所以不可能知道那里实际发生了什么(尽管有一个可以猜测,mobile()已被调用,并且它的self.rect已损坏)。

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

if self. pos.right > 1400:

那么敌对的代码是什么样子的呢?

 类似资料:
  • 这是我的代码的一部分,工作不正常,我试图设置键,使桨向上和向下移动,但我无法找出我的代码有什么问题。 错误是: 参数必须是rect样式对象

  • 当我试图运行我的程序我结束了以下错误 错误发生在代码的第134行。这里是使用的代码,详细的答案将不胜感激,因为我是pygame的新手

  • 一段时间以来,我一直在努力教自己如何在pygame中使用精灵,而现在我被困在碰撞检测上。 我在代码中遇到问题的具体位置是标记为“error here”的注释部分,这段代码一直给我“TypeError:Argument必须是rect-style-object”错误,该特定代码的目标是检测冲突。 这段代码的目标是每当玩家块进入非玩家块时在shell中打印一条消息,正如我之前所说的,我很难做到这一点。

  • 我创建这个类是为了更好地使用它 然后我想创建一个简单的函数来剪辑一个矩形,就像这样 但是当我将rect传递到我的函数中时,我在标题中得到了错误。我甚至还打印了字体 我想知道Rect样式的对象和Rect对象之间是否有区别,因为我太困惑了。此外,在屏幕上绘制矩形是布局tic-tac-toe GUI的最佳方式,还是绘制线条更简单。

  • 我目前正在制作一个平台游戏,我被阻止碰撞...你能帮帮我吗?我实际上添加了一些方块来测试碰撞,在Perso类下创建了一个玩家。我真的需要在那个入口之后制造碰撞,并且必须精心设计重力来让玩家跳跃。这是我的代码:导入pyplay从pygame.locals导入*pygame.init() pygame.quit()

  • 我正在用一个简单的游戏尝试python,但是遇到了这个错误 代码如下所示: 然后错误显示: 文件“my_code/alien_invision/bullet.py”,第15行,在init self中。rect=pygame。Rect(左=0,上=0,宽=self.settings.bullet\u width, 类型错误:参数必须是Rect样式的对象 如果我按以下方式更改该行,它将正常工作: 我不