在 pygame 中创建 tilemap 有更好的方法吗?
Is there an better way to create a tilemap in pygame?
当我尝试 blit 我的瓷砖时,它说 "list index out of range"。我不知道该怎么做,因为我是新手。
错误信息:
window.blit(tilemap.textures[tilemap.tilemap[row][column]], (columntilemap.tilesize, rowtilemap.tilesize))
IndexError: list index out of range
我尝试更改 mapwidth
和 mapheight
的值,但没有成功。我有 2 个脚本。主要和瓷砖贴图。因此可能存在错误。注意(我在完整代码中初始化了 pygame 所以这不是问题)
main.py
import pygame as pg
# Importing files
import constants
import classes
import tilemap
# Functions
def draw_game():
""" This function draws everything on the screen """
global window, clock
# The background
window.blit(constants.img_background, (0, 0))
# Tiles
for row in range(tilemap.mapheight):
for column in range(tilemap.mapwidth):
window.blit(tilemap.textures[tilemap.tilemap[row][column]], (column*tilemap.tilesize, row*tilemap.tilesize))
# Updating
clock.tick(60)
pg.display.update()
tilemap.py
import pygame as pg
import constants
GRASS = 0
WATER = 1
textures = {
GRASS : pg.image.load("image\grass.png"),
WATER : pg.image.load("image\water.png")
}
tilemap = [
[GRASS, GRASS, GRASS, WATER],
[GRASS, GRASS, WATER, GRASS],
[GRASS, WATER, GRASS, GRASS],
[WATER, GRASS, GRASS, GRASS]
]
tilesize = 40
mapwidth = 2
mapheight = 5
tilemap
是一个列表。该列表有 4 个元素,列表的每个元素也是一个包含 4 个元素的列表。
tilemap = [
[GRASS, GRASS, GRASS, WATER],
[GRASS, GRASS, WATER, GRASS],
[GRASS, WATER, GRASS, GRASS],
[WATER, GRASS, GRASS, GRASS]
]
所以tilemap的"width"和"height"是4:
mapwidth = 4
mapheight = 4
但是你根本不需要那个变量,因为你可以通过len()
得到列表的长度:
for row in range( len(tilemap.tilemap) ):
for column in range( len(tilemap.tilemap[row]) ):
window.blit(tilemap.textures[tilemap.tilemap[row][column]],
(column*tilemap.tilesize, row*tilemap.tilesize))
如果你想在地图上放置更多的瓦片,那么在tilemap:
中添加更多的瓦片就足够了
例如
tilemap = [
[WATER, WATER, WATER, WATER, WATER, WATER],
[WATER, GRASS, GRASS, GRASS, WATER, WATER],
[WATER, GRASS, GRASS, WATER, GRASS, WATER],
[WATER, GRASS, WATER, GRASS, GRASS, WATER],
[WATER, WATER, GRASS, GRASS, GRASS, WATER],
[WATER, WATER, WATER, WATER, WATER, WATER]
]
mapwidth = len(tilemap.tilemap)
mapheight = len(tilemap.tilemap[0])
当我尝试 blit 我的瓷砖时,它说 "list index out of range"。我不知道该怎么做,因为我是新手。
错误信息:
window.blit(tilemap.textures[tilemap.tilemap[row][column]], (columntilemap.tilesize, rowtilemap.tilesize)) IndexError: list index out of range
我尝试更改 mapwidth
和 mapheight
的值,但没有成功。我有 2 个脚本。主要和瓷砖贴图。因此可能存在错误。注意(我在完整代码中初始化了 pygame 所以这不是问题)
main.py
import pygame as pg
# Importing files
import constants
import classes
import tilemap
# Functions
def draw_game():
""" This function draws everything on the screen """
global window, clock
# The background
window.blit(constants.img_background, (0, 0))
# Tiles
for row in range(tilemap.mapheight):
for column in range(tilemap.mapwidth):
window.blit(tilemap.textures[tilemap.tilemap[row][column]], (column*tilemap.tilesize, row*tilemap.tilesize))
# Updating
clock.tick(60)
pg.display.update()
tilemap.py
import pygame as pg
import constants
GRASS = 0
WATER = 1
textures = {
GRASS : pg.image.load("image\grass.png"),
WATER : pg.image.load("image\water.png")
}
tilemap = [
[GRASS, GRASS, GRASS, WATER],
[GRASS, GRASS, WATER, GRASS],
[GRASS, WATER, GRASS, GRASS],
[WATER, GRASS, GRASS, GRASS]
]
tilesize = 40
mapwidth = 2
mapheight = 5
tilemap
是一个列表。该列表有 4 个元素,列表的每个元素也是一个包含 4 个元素的列表。
tilemap = [ [GRASS, GRASS, GRASS, WATER], [GRASS, GRASS, WATER, GRASS], [GRASS, WATER, GRASS, GRASS], [WATER, GRASS, GRASS, GRASS] ]
所以tilemap的"width"和"height"是4:
mapwidth = 4
mapheight = 4
但是你根本不需要那个变量,因为你可以通过len()
得到列表的长度:
for row in range( len(tilemap.tilemap) ):
for column in range( len(tilemap.tilemap[row]) ):
window.blit(tilemap.textures[tilemap.tilemap[row][column]],
(column*tilemap.tilesize, row*tilemap.tilesize))
如果你想在地图上放置更多的瓦片,那么在tilemap:
例如
tilemap = [
[WATER, WATER, WATER, WATER, WATER, WATER],
[WATER, GRASS, GRASS, GRASS, WATER, WATER],
[WATER, GRASS, GRASS, WATER, GRASS, WATER],
[WATER, GRASS, WATER, GRASS, GRASS, WATER],
[WATER, WATER, GRASS, GRASS, GRASS, WATER],
[WATER, WATER, WATER, WATER, WATER, WATER]
]
mapwidth = len(tilemap.tilemap)
mapheight = len(tilemap.tilemap[0])