“TypeError:'int'对象不可调用”此代码中的错误

时间:2013-08-22 16:02:47

标签: python pygame

以下代码给了我这个错误,我很困惑。对不起,如果我提出错误的问题,我是新来的,但我认为这符合指南。图像会移动 一旦我释放了密钥,就会在背景中发出错误并崩溃。

Traceback (most recent call last):
  File "C:\Users\Samga_000\Desktop\game\game.py", line 89, in <module>
    rungame()
  File "C:\Users\Samga_000\Desktop\game\game.py", line 79, in rungame
    p.still()
TypeError: 'int' object is not callable

import pygame, sys
from pygame.locals import *
pygame.init()

WIDTH = 400
HEIGHT = 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
bif = "grass.png"
background = pygame.image.load(bif)
pygame.display.set_caption('RPG')

def drawEntitys():
    frispri.update()
    frispri.draw(screen)

def drawScreen():
    screen.blit(background, (0,0))


class Player(pygame.sprite.Sprite):
    image = pygame.image.load("misha.png")
    image = image.convert_alpha()

    def __init__(self):
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.pos = (20, 20)
        self.image = Player.image
        self.rect = self.image.get_rect()
        self.movepos = [0,0]
        self.area = screen.get_rect()
        self.still = True

    def update(self):
        newpos = self.rect.move(self.movepos)
        if self.area.contains(newpos):
            self.rect = newpos
        pygame.event.pump()

    def move(self, x, y):
        self.still = 0
        if self.still == 0:
            self.movepos[0] = self.movepos[0] - x
            self.movepos[1] = self.movepos[1] - y
        else:
            pass

    def still(self):
        self.still = 1





frispri = pygame.sprite.Group()
Player.groups = frispri
p = Player()


def rungame():
    while True:
        drawScreen()
        drawEntitys()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            elif event.type == KEYDOWN:
                if event.key == K_UP:
                    p.move(0,1)
                elif event.key == K_DOWN:
                    p.move(0,-1)
                elif event.key == K_LEFT:
                    p.move(1,0)
                elif event.key == K_RIGHT:
                    p.move(-1,0)
            elif event.type == KEYUP:
                if event.key == K_UP:
                    p.still()
                elif event.key == K_DOWN:
                    p.still()
                elif event.key == K_LEFT:
                    p.still()
                elif event.key == K_RIGHT:
                    p.still()

        flipgame()

def flipgame():
    pygame.display.flip()
rungame()

2 个答案:

答案 0 :(得分:2)

Player.still是一个布尔值,在此处指定:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        # ...
        self.still = True

你不能调用一个布尔值,因为它不是一个函数,你在这里尝试:

p = Player()
# ...

            p.still()

答案 1 :(得分:1)

这与本question

中讨论的问题基本相同

您的问题是您有一个实例变量still,其名称与您的方法相同。当你执行p.still()时,Python会将p.still解释为尝试访问变量而不是方法,然后尝试“调用”该变量。

解决方案是重命名方法或变量。要使代码工作,您只需要更改其中一个。但良好的编程习惯可能会说你应该改变它们。

由于变量是一个标志,指示玩家是否仍然存在,您可以将其名称更改为is_still。这是一个稍微具有描述性的名称,可以清楚地表明变量的含义。

对于该方法,您可以将其重命名为set_stillmark_still,以表明它正在更改播放器的状态。或者结合上面对变量名称的更改,您可以创建方法名称set_is_still,以清楚地说明您正在设置的变量。