2017-01-23 43 views
1

當我運行我的代碼時,出現錯誤:「NameError:name'distantCity'未定義」,我不確定它爲什麼沒有定義,因爲我認爲我在加載函數中定義Loading.py。在不同文件中使用函數

mainGame.py:

import pygame 
from settings import * 
from Loading import * 
from characters import * 

pygame.init() 

class game(): 

    def __init__(self): 

     self.gameRunning = True 
     self.gameWindow = pygame.display.set_mode((gameWindowWidth, gameWindowHeight)) 
     pygame.display.set_caption(title) 
     self.clock = pygame.time.Clock() 
     self.playerSpeed = speed 
     load() 

    def update(self): 

     self.gameWindow.blit(distantCity, (0,0)) 
     for layer in gameMap.visible_layers: 
      for x, y, gid, in layer: 
       tile = gameMap.get_tile_image_by_gid(gid) 
       self.gameWindow.blit(tile, (x * gameMap.tilewidth, y * gameMap.tileheight)) 
     self.gameWindow.blit(ninjaIdle01, (player1.playerX, player1.playerY)) 
     pygame.display.update() 

    def gameLoop(self): 

     self.clock.tick(FPS) 
     self.event() 
     self.update() 

    def event(self): 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       self.gameRunning = False 

      if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: 
       self.playerSpeed = 5 
      if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT: 
       self.playerSpeed = -5 
      if event.type == pygame.KEYUP and event.key == pygame.K_RIGHT: 
       self.playerSpeed = 0 
      if event.type == pygame.KEYUP and event.key == pygame.K_LEFT: 
       self.playerSpeed = 0 

     player1.playerX = player1.playerX + self.playerSpeed 

playGame = game() 
player1 = player() 
while playGame.gameRunning == True: 
    playGame.gameLoop() 


pygame.quit() 
quit() 

Loading.py

import pygame 
import pytmx 

pygame.init() 

def load(): 

    ninjaIdle01 = pygame.image.load("gameImages\s_ninjaIdle_01.png") 
    ninjaIdle02 = pygame.image.load("gameImages\s_ninjaIdle_02.png") 
    ninjaIdle03 = pygame.image.load("gameImages\s_ninjaIdle_03.png") 
    ninjaIdle04 = pygame.image.load("gameImages\s_ninjaIdle_04.png") 
    ninjaIdle05 = pygame.image.load("gameImages\s_ninjaIdle_05.png") 
    ninjaIdle06 = pygame.image.load("gameImages\s_ninjaIdle_06.png") 
    ninjaIdle07 = pygame.image.load("gameImages\s_ninjaIdle_07.png") 
    ninjaIdle08 = pygame.image.load("gameImages\s_ninjaIdle_08.png") 
    ninjaIdle09 = pygame.image.load("gameImages\s_ninjaIdle_09.png") 
    ninjaIdle10 = pygame.image.load("gameImages\s_ninjaIdle_10.png") 
    ninjaJump01 = pygame.image.load("gameImages\s_ninjaJump_01.png") 
    ninjaJump02 = pygame.image.load("gameImages\s_ninjaJump_02.png") 
    ninjaJump03 = pygame.image.load("gameImages\s_ninjaJump_03.png") 
    ninjaJump04 = pygame.image.load("gameImages\s_ninjaJump_04.png") 
    ninjaJump05 = pygame.image.load("gameImages\s_ninjaJump_05.png") 
    ninjaJump06 = pygame.image.load("gameImages\s_ninjaJump_06.png") 
    ninjaJump07 = pygame.image.load("gameImages\s_ninjaJump_07.png") 
    ninjaJump08 = pygame.image.load("gameImages\s_ninjaJump_08.png") 
    ninjaJump09 = pygame.image.load("gameImages\s_ninjaJump_09.png") 
    ninjaJump10 = pygame.image.load("gameImages\s_ninjaJump_10.png") 
    ninjaRun01 = pygame.image.load("gameImages\s_ninjaRun_01.png") 
    ninjaRun02 = pygame.image.load("gameImages\s_ninjaRun_02.png") 
    ninjaRun03 = pygame.image.load("gameImages\s_ninjaRun_03.png") 
    ninjaRun04 = pygame.image.load("gameImages\s_ninjaRun_04.png") 
    ninjaRun05 = pygame.image.load("gameImages\s_ninjaRun_05.png") 
    ninjaRun06 = pygame.image.load("gameImages\s_ninjaRun_06.png") 
    ninjaRun07 = pygame.image.load("gameImages\s_ninjaRun_07.png") 
    ninjaRun08 = pygame.image.load("gameImages\s_ninjaRun_08.png") 
    ninjaRun09 = pygame.image.load("gameImages\s_ninjaRun_09.png") 
    ninjaRun10 = pygame.image.load("gameImages\s_ninjaRun_10.png") 
    distantCity = pygame.image.load("gameImages\s_distantCity.png") 
    gameMap = pytmx.load_pygame("gameMap.tmx", pixelalpha = True) 
+0

你的函數不返回任何東西。當函數結束/返回時,函數中的變量超出範圍。 – wwii

+2

請張貼最小的例子 - http://stackoverflow.com/help/mcve – wwii

+0

我相信閱讀關於變量作用域[這裏](http://python-textbok.readthedocs.io/en/latest/Variables_and_Scope.html)或[這裏](http://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/)將有所幫助。 –

回答

1

當您在Loading.load定義distantCity,它仍然是一個局部變量。所以,你不能從該函數之外直接訪問它。

一種解決方法是將所有的數據加載到字典,返回從load

def load(): 
    loaded = {} 
    loaded['ninjaIdle01'] = pygame.image.load("gameImages\s_ninjaIdle_01.png") 
    loaded['ninjaIdle02'] = pygame.image.load("gameImages\s_ninjaIdle_02.png") 
    # ... 
    loaded['distantCity'] = pygame.image.load("gameImages\s_distantCity.png") 
    loaded['gameMap'] = pytmx.load_pygame("gameMap.tmx", pixelalpha = True) 
    return loaded 

然後,在調用load代碼:

def __init__(self): 

    self.gameRunning = True 
    self.gameWindow = pygame.display.set_mode((gameWindowWidth, gameWindowHeight)) 
    pygame.display.set_caption(title) 
    self.clock = pygame.time.Clock() 
    self.playerSpeed = speed 
    self.preloaded_data = load() 

def update(self): 
    self.gameWindow.blit(self.preloaded_data['distantCity'], (0,0)) 
    # ... 

這樣,您保留對您可以通過字典訪問的所有預加載數據的引用。

+0

謝謝,那修正了我得到的錯誤,但是當我做了「tile = self.preloadedData [」gameMap「]。get_tile_image_by_gid(gid)」使tile = None而不是gid數字。這是數據字典還是其他問題?再一次感謝我對範圍問題的幫助。 – CustomerSupport

+0

@CustomerSupport我沒有pygame的經驗,所以我不知道那裏發生了什麼。因爲這個問題似乎是完全分開的,所以我建議提出一個新問題 - 別人能夠幫助你! –

相關問題