TypeError:destroy()获取0个位置参数但给出了1

时间:2014-07-11 09:07:55

标签: python pygame

这是我尝试从其列表中删除精灵时所得到的错误,以便从屏幕上删除它。我可以通过按键调出精灵,但是当我尝试删除它时会发生这种情况。 在Purpongie的collision detection视频的帮助下,我有点想要自己的代码。

现在我将向你展示最省略的不相关的东西:

Main.py

while True:
    process(Select)
    H2Ps.destroy()
    H2Ps.List.draw(screen)

Classes.py

class BaseClass(pygame.sprite.Sprite):
allsprites = pygame.sprite.Group()
def __init__(self, x, y, image_string):

    pygame.sprite.Sprite.__init__(self)
    BaseClass.allsprites.add(self)

    self.image = pygame.image.load(image_string)

    self.rect = self.image.get_rect()
    self.rect.x = x
    self.rect.y = y


def destroy(self, ClassName):
    ClassName.List.remove(self)
    BaseClass.allsprites.remove(self)
    del self



class H2Ps(BaseClass):
List = pygame.sprite.Group()

def __init__ (self,x,y,image_string):
    BaseClass.__init__(self,x,y,image_string)
    H2Ps.List.add(self)

@staticmethod
def destroy():
    for test in H2Ps.List:
        if (pygame.key.get_pressed()[pygame.K_ESCAPE]):
            test.destroy(H2Ps)

Process.py

def process(Select):
    if Select.rect.collidepoint(370,400): #How to play
        if keys[pygame.K_RETURN]:
            HowToPlay = H2Ps(0,0,"Images/How To Play.png")

我认为错误指出Classes.py中的test.destroy(H2Ps)存在问题。我已经提前运行它似乎已经有效但现在我不确定我可能会改变什么会破坏它。我非常感谢一些解决方案。

1 个答案:

答案 0 :(得分:1)

您已使用destroy(self, ClassName)中的BaseClass静态方法在destroy()中覆盖H2Ps {。}}。您需要更改其中一个的名称!

因此,当您在main.py中调用H2Ps.destroy()时,您正在调用静态方法,然后循环遍历List

for test in H2Ps.List:
    if (pygame.key.get_pressed()[pygame.K_ESCAPE]):
        test.destroy(H2Ps)

test这是一个H2Ps对象,当你执行test.destroy(H2Ps)时,仍然调用H2Ps上定义的静态方法,不是destroy(self, ClassName)上的方法BaseClass

与其他语言不同,方法可以通过参数区分,因此在Java中,编译器可以区分这些方法:

public void destroy(String className);
public static void destroy();

Python并不像那样工作,只选择通过名称调用的方法。当您在destroy中覆盖H2Ps时,您正在使用destroy(self, ClassName)替换destroy()的定义。