2015-05-21 67 views
0

我收到錯誤XSHIFT,YSHIFT = Manager.movementKeys(個體經營,XSHIFT,YSHIFT)類型錯誤:「NoneType」對象不是可迭代的,當我運行我的代碼和我無法弄清楚爲什麼。我不應該得到任何回報作爲無,並且我的論據都不是無。我對任何縮進錯誤表示歉意。類型錯誤:「NoneType」對象不是可迭代時調用鍵的功能

import pygame, sys, time, os 
from pygame.constants import QUIT, KEYDOWN, K_LEFT, K_RIGHT, K_RETURN,    

FULLSCREEN, K_w, K_s, K_a, K_d 

global screenWidth, screenHeight 

surface = pygame.display.set_mode((0,0),pygame.FULLSCREEN) 
width = pygame.display.Info().current_w 
height = pygame.display.Info().current_h 
screenWidth = width - (width % 25) 
screenHeight = height - (height % 25) 

class Manager: 
    def update(self, startTime): 
     curTime = time.time() 
     if curTime - float(startTime) >= 1/60: 
      pygame.display.update() 
     return time.time() 
    def render(self, images): 
     rendered = [] 
     for i in images: 
      rendered.append(pygame.image.load(i)) 
     return rendered 
    def draw(self, renderedImages, positions): 
     for i in range(len(renderedImages)): 
      surface.blit(renderedImages[i], (positions[0][i],positions[1]  
[i])) 
    def __init__(self): 
     state = MenuState() 
    def getLevel(self): 
     saves = open("save.txt", "r") 
     level = saves.readline() 
     saves.close() 
     return level 
    def movementKeys(self, vx, vy): 
     if pygame.key.get_pressed()[K_w]: 
      xShift, yShift = Manager.movement(self, "w", vx, vy) 
      return xShift, yShift 
     elif pygame.key.get_pressed()[K_a]: 
      xShift, yShift = Manager.movement(self, "a", vx, vy) 
      return xShift, yShift 
     elif pygame.key.get_pressed()[K_s]: 
      xShift, yShift = Manager.movement(self, "s", vx, vy) 
      return xShift, yShift 
     elif pygame.key.get_pressed()[K_d]: 
      xShift, yShift = Manager.movement(self, "d", vx, vy) 
      return xShift, yShift 
    def movement(self, pressedKey, vx, vy): 
     if pressedKey == "w": 
      dy = -0.01 
      if vy > -1: 
       vy += dy 
     elif pressedKey == "s": 
      dy = 0.01 
      if vy < 1: 
       vy += dy 
     else: 
      dy = 0 
     if pressedKey == "d": 
      dx = 0.01 
      if vx > -1: 
       vx += dx 
     elif pressedKey == "a": 
      dx = -0.01 
      if vx < 1: 
       vx -= dx 
     else: 
      dy = 0 
     if dy == 0: 
      if vy > 0: 
       vy -= dy 
      elif vy < 0: 
       vy += dy 
     if dx == 0: 
      if vx > 0: 
       vx -= dy 
      elif vx < 0: 
       vx += dy 
     return vx, vy 
class TileMap: 
    def getLevelMap(self, level): 
     map = [] 
     levelFile = level + ".txt" 
     file = open(levelFile, "r") 
     x = file.readline() 
     y = file.readline() 
     for i in range(int(y)): 
      line = file.readline() 
      curLine = list(line) 
      if i != (int(y)-1): 
       curLine.pop() 
      map.append(curLine) 
     file.close() 
     return map 
    def drawMap(self, map, tiles, xShift, yShift): 
     for i in range(len(map)): 
      for j in range(len(map[0])): 
       surface.blit(tiles[int(map[i][j])], (j * 25 + xShift,i * 25 
+ yShift)) 
class MenuState: 
    global surface 
    if surface.get_flags() & FULLSCREEN: 
     os.environ["SDL_VIDEO_CENTERED"] = "1" 
     surface = pygame.display.set_mode((800,600), pygame.NOFRAME) 
    def focusedButton(self, curButton): 
     if curButton: 
      curButton = False 
     else: 
      curButton = True 
     return curButton 
    def __init__(self): 
     images = ["MenuBackground.png", "MenuBackgroundOverlay.png", 
"MenuButton1.png", "MenuButton1Focused.png", "MenuButton2.png", 
"MenuButton2Focused.png","MenuTitle.png"] 
     renderedImages = Manager.render(self, images) 
     endTime = time.time() 
     button1Focused = True 
     inMenu = True 
     x = 0 
     x2 = -2400 
     while inMenu: 
      imagesToDraw = [renderedImages[0], renderedImages[1], 
renderedImages[1], renderedImages[3], renderedImages[4], renderedImages[6]] 
      if button1Focused: 
       imagesToDraw[3] = renderedImages[2] 
       imagesToDraw[4] = renderedImages[5] 
      else: 
       imagesToDraw[3] = renderedImages[3] 
       imagesToDraw[4] = renderedImages[4] 
      positions = [[0,x,x2,180,460,50],[0,0,0,350,350,75]] 
      for event in pygame.event.get(): 
       if event.type == QUIT: 
        pygame.quit() 
        sys.exit() 
       elif event.type == KEYDOWN: 
        if event.key == K_LEFT or event.key == K_RIGHT: 
         button1Focused = MenuState.focusedButton(self, 
button1Focused) 
        elif event.key == K_RETURN: 
         if button1Focused: 
          state = GameState() 
         else: 
          pygame.quit() 
          sys.exit() 
      x += 10 
      x2 += 10 
      if x >= 800: 
       x = x2 - 2400 
      if x2 >= 800: 
       x2 = x - 2400 
      Manager.draw(self, imagesToDraw, positions) 
      endTime = Manager.update(self, endTime) 
class GameState: 
    def __init__(self): 
     level = Manager.getLevel(self) 
     levelMap = TileMap.getLevelMap(self, level) 
     tileImages = ["tile1.png", "tile2.png"] 
     tileImages = Manager.render(self, tileImages) 
     surface = pygame.display.set_mode((screenWidth, screenHeight), 
pygame.FULLSCREEN) 
     endTime = time.time() 
     xShift = 0 
     yShift = 0 
     while True: 
      for event in pygame.event.get(): 
       if event.type == QUIT: 
        pygame.quit() 
        sys.exit() 
       xShift, yShift = Manager.movementKeys(self, xShift, yShift) 
       TileMap.drawMap(self, levelMap, tileImages, xShift, yShift) 
       endTime = Manager.update(self, endTime) 
start = Manager() 

回答

0

問題就來了,當你試圖「解包」一NoneType這樣的:

>>> x, y = None 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not iterable 

因此,我們可以得出結論,這個Manager.movementKeys(self, xShift, yShift)回報None

我猜想,如果沒有關鍵是按下,您的movementKeys(self, vx, vy)函數不會返回任何內容,因此返回None

def movementKeys(self, vx, vy): 
    if pygame.key.get_pressed()[K_w]: 
     xShift, yShift = Manager.movement(self, "w", vx, vy) 
     return xShift, yShift 
    elif pygame.key.get_pressed()[K_a]: 
     xShift, yShift = Manager.movement(self, "a", vx, vy) 
     return xShift, yShift 
    elif pygame.key.get_pressed()[K_s]: 
     xShift, yShift = Manager.movement(self, "s", vx, vy) 
     return xShift, yShift 
    elif pygame.key.get_pressed()[K_d]: 
     xShift, yShift = Manager.movement(self, "d", vx, vy) 
     return xShift, yShift 

    # try adding this 
    return (0, 0) # when nothing is pressed the shift is 0 
+0

我甚至沒有從運動的關鍵得到回報。我正在做一些痕跡,當我調用移動功能時,它似乎會出現錯誤。作爲參考,我在每個功能(移動和移動鍵)的頂部放置了一個打印件,並且只有移動鍵中的打印件出現。 –

+0

嘿,這正是我的帖子所說的。您的'movementKeys'功能只有'if'和'elif'。因此,如果沒有按鈕被按下,函數不返回任何東西,這意味着它返回'None'。查看我更新的答案並提供可能的修復方法但請記住,我沒有真正檢查你的遊戲邏輯。 – enpenax

+0

你說得對,我錯過了那個相當大的東西,但感謝你的幫助 –

0

看來問題是在函數內部使用了pygame.key.get_pressed()而不是直接在主循環中。這是pygame的小事情,不是嗎?

相關問題