2013-08-22 68 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完全清楚您正在設置的變量。

相關問題