2013-08-22 70 views
0

下面的代码给了我这个错误,我很困惑。对不起如果我提出的问题不对,我在这里是新的,但我认为这符合指导原则。只要我释放密钥,图像就会在整个背景中移动 ,它会给我这个错误并崩溃。“TypeError:'int'object is callable”error from this code

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() 
+0

单独注释'move'中的'if-else'块是多余的。你在'if self.still == 0'行的上方设置'self.still = 0',所以'if'将始终为真。 –

回答

2

Player.still是一个布尔值,在这里分配:

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

你不能叫一个布尔值,因为它不是一个功能,当你试图在这里:

p = Player() 
# ... 

      p.still() 
+0

我改变了“self.still = True”为“self.still = 1”,现在它给了我 “TypeError:'int'object is callable” – user2708079

+0

这就是你声称的错误是在第一位, 1'仍然不是一个功能! – Useless

1

这实质上与问题相同d在这question

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

解决方法是重命名方法或变量。为了让你的代码正常工作,你只需要改变其中的一个。但良好的编程习惯可能会说你应该改变这两者。

由于变量是一个标志,指示玩家是否仍然存在,因此您可能会将其名称更改为is_still。这是一个稍微更具描述性的名称,它明确了变量的含义。

对于该方法,您可以将其重命名为set_stillmark_still以指示它正在更改播放器的状态。或者将上述更改与变量名称结合使用,您可以使方法名称set_is_still完全清楚您正在设置的变量。

相关问题