2016-07-19 4 views
0

Я пытаюсь сделать этот объект перемещенным, когда вы нажмете его в pygame; и он работает в первый раз, когда вы щелкните по ней, но после того, что он дает мне эту ошибку:Ошибка python/pygame ТипError: объект 'bool' не может быть вызван

game_loop() 
    File "C:\Users\MadsK_000\Desktop\spil\Python\spiltest\Test spil.py", line 57, in game_loop 
    Clicked_ = clicked(x,y,width,height,mouse_pos) 
TypeError: 'bool' object is not callable 

Вот мой код

import pygame 
import time 
pygame.init() 

display_width = 800 
display_height = 600 

black = (0,0,0) 
white = (255,255,255) 
red = (255,0,0) 
gameDisplay = pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption("test") 
clock = pygame.time.Clock() 
mainthingImg = pygame.image.load("mainthing.PNG") 
width = 88 
height = 85 
x = 100 
y = 100 
mouse_pos = pygame.mouse.get_pos() 
def mainthing(x,y): 
    gameDisplay.blit(mainthingImg, (x,y)) 

def clicked(x,y,width,height,mouse_pos): 
    clicked = False 
    if mouse_pos[0] > x and x + width > mouse_pos[0] and mouse_pos[1] > y and y + height > mouse_pos[1]: 
     clicked = True 
     global clicked 

    return clicked 

def text_objects(text, font): 
    textSurface = font.render(text, True, white) 
    return textSurface, textSurface.get_rect() 

def ptd(text): 
    stortext = pygame.font.Font("freesansbold.ttf", 40) 
    TextSurf, TextRect = text_objects(text,stortext) 
    TextRect.center = ((display_width/2),(display_height/2)) 
    gameDisplay.blit(TextSurf, TextRect) 
    pygame.display.update() 
    time.sleep(2) 
    game_loop() 


def game_loop(): 



    gameExit = False 
    while not gameExit: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 
      if event.type == pygame.MOUSEBUTTONDOWN: 
       mouse_pos = pygame.mouse.get_pos() 
       Clicked_ = clicked(x,y,width,height,mouse_pos) 
       if Clicked_ == True: 
        x += 100 
        y += 100 
        global x 
        global y 
     gameDisplay.fill(red) 
     mainthing(x,y) 
     pygame.display.update() 
     clock.tick(60) 
ptd("Wellcome") 
pygame.display.update() 
game_loop() 
pygame.quit() 
quit() 
+0

Помимо вопроса, вы должны, вероятно, поставить логику игры в класс и глобальные переменные в атрибуты. Это перетасовка глобальных переменных - это действительно плохой стиль. –

ответ

3

Вы можете установить глобальный clicked в булево, внутри функцииclicked:

def clicked(x,y,width,height,mouse_pos): 
    clicked = False 
    if mouse_pos[0] > x and x + width > mouse_pos[0] and mouse_pos[1] > y and y + height > mouse_pos[1]: 
     clicked = True 
     global clicked 

    return clicked 

Используйте разные глобального на me for boolean или переименуйте функцию clicked. Функции также являются глобальными.

0

Существует конфликт имен для clicked. Внутри функции clicked есть переменная с тем же именем (clicked = False), и это также связано с глобальной областью (global clicked). Таким образом, когда функция выполняется, clicked был изменен на boolean, а не на функцию (определение функции создает имя переменной в своей области, глобальное здесь). Пожалуйста, назовите функцию и переменную отдельно.

Смежные вопросы