0

下面的代码给了我这个错误,我很困惑。抱歉,如果我问错了问题,我是新来的,但我认为这符合准则。一旦我释放它给我这个错误和崩溃的键,图像就会在背景中移动。

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()
4

2 回答 2

2

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

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

您不能调用布尔值,因为它不是函数,正如您在此处尝试的那样:

p = Player()
# ...

            p.still()
于 2013-08-22T16:06:55.370 回答
1

这与此问题中讨论的问题基本相同

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

解决方案是重命名方法或变量。要使您的代码正常工作,您只需要更改两者之一。但是好的编程习惯可能会说你应该改变两者。

由于变量是一个标志,指示玩家是否静止,您可以将其名称更改为is_still。这是一个更具描述性的名称,可以清楚地说明变量的含义。

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

于 2013-08-22T16:53:33.140 回答