我收到错误xShift,yShift = Manager.movementKeys(self,xShift,yShift)TypeError:当我运行代码时,'NoneType'对象不可迭代,我无法弄清楚原因。我不应该得到任何返回为None,我的参数都不是None。我为任何缩进错误道歉。
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 :(得分: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
答案 1 :(得分:0)
看来问题是在函数内部使用pygame.key.get_pressed()而不是直接在主循环中。它是pygame的小东西,不是吗?