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

时间:2015-07-25 11:37:12

标签: python pygame collision-detection collision rect

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

嘿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

1 个答案:

答案 0 :(得分:1)

如果源代码中显示的输出可以信任,则调试语句显示self.recttarget.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的代码是什么样的?