我的Python版本是3.2,Pygame版本是1.9.1。
我遵循了这里的第一部分说明:http://wiki.sheep.art.pl/Tiled%20Map%20in%20PyGame,进行了一些调整以适应我自己的tileset:
def load_tileset(filename, width, height):
image = pygame.image.load(filename).convert_alpha()
imageWidth, imageHeight = image.get_size()
tileSet = []
for tileX in range(0, 3):
line = []
tileSet.append(line)
for tileY in range(0, 3):
rect = (tileX*width, tileY*height, width, height)
line.append(image.subsurface(rect))
if __name__=='__main__':
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Tiled Background')
screen.fill((240, 240, 255))
table = load_tileset('tableset.gif', 16, 16)
for x, row in enumerate(table):
for y, tile in enumerate(row):
screen.blit(tile, (x*24, y*24))
pygame.display.flip()
while pygame.event.wait().type != pygame.locals.QUIT:
pass
我在for x, row in enumerate(table):
*中得到Nonetype错误。我尝试了各种方法,甚至移动了tileset本身,并更改了文件类型。我也尝试过其他代码,比如range。
我过去曾设法加载过图像,这只是我第一次尝试使用磁贴集。瓦片集有9个16x16瓦片,其中有一些透明度(因此为convert_alpha()
)。
那么,有人能说出我为什么在这里出现NoneType
错误吗?这与图像有关吗?(注意,"For tileX in range"中有3个的原因是它不接受教程中设置的第四个计算,所以我只是自己计算。)
- 编辑:在描述中意外键入:
for x, row in range(table):
而不是for x, row in enumerate(table):
您没有发布完整的代码,或者犯了一个错误:上面的代码中没有for x, row in range(table)
行。使用这个特定的代码,您似乎试图从range
函数中提取两个变量,但它一次只返回一个值。
您可能想键入for x, row in enumerate(table)
。在这种情况下,当您调用table = load_tileset('tableset.gif', 16, 16)
时,您需要返回一个对象,因为除非任何给定的函数被明确告知return
一个对象。否则它将返回None
,这就是为什么该行会给您带来麻烦,因为None
的type
是Nonetype
下面是一个函数返回None
然后返回字符串a returned string
:的例子
def thisFuncReturnsNone():
pass
print 'what gets returned:', thisFuncReturnsNone()
>>> None
def thisFuncReturnsAString():
return 'a returned string'
print 'what gets returned a second time:', thisFuncReturnsAString()
>>> a returned string