我正在为我在GMTK Game Jam中的一个条目制作续集。这是一个平台游戏机,玩家必须通过随机选择的各种游戏模式的地图,比如平台游戏比赛、boss之战,以及我只能描述为躲避球但有一个巨大的杀手pac man。为此,我想制作许多关卡,用python脚本慢慢编辑列表是不可行的。所以我想学习如何读取.csv文件,并使用它们创建一个使用多个瓦片的级别。但是我该怎么做呢?
到目前为止,我有一个主脚本,一个精灵脚本和一个关卡脚本。最后一个里面有两个测试级别的映射,我想用一个包含各种.csv文件的文件夹来代替它。在我的主要剧本中,我有一节游戏课。在__init__
方法中,我设置了一个从级别脚本中提取的级别列表,随机选择一个要加载的级别,并在索引为某个值时循环通过它从我的精灵脚本创建一个精灵。
#Set tile map
self.level = [levels.plat_lvl_1, levels.plat_lvl_2]
self.tile_map = random.choice(self.level)
for i in range(len(self.tile_map)):
for j in range(len(self.tile_map[i])):
if self.tile_map[i][j] == 1:
sprites.Tile(j * 32, i * 32, 1, self.tile_group)
elif self.tile_map[i][j] == 2:
sprites.Tile(j * 32, i * 32, 2, self.tile_group, self.platform_group)
elif self.tile_map[i][j] == 3:
sprites.Tile(j * 32, i * 32, 3, self.tile_group, self.platform_group)
elif self.tile_map[i][j] == 4:
sprites.Tile(j * 32, i * 32, 4, self.tile_group, self.platform_group)
elif self.tile_map[i][j] == 5:
self.player = sprites.Player(j * 32, i * 32, self.player_group, self.platform_group)
elif self.tile_map[i][j] == 6:
sprites.Tile(j * 32, i * 32 - 32, 6, self.tile_group)
我该如何用.csv文件替换列表,以及我需要如何循环或剥离它或其他什么才能正确创建我的级别?如果你需要的话,这是整个项目的链接。
非常感谢!
-多米尼克。
我有这个函数可以将csv映射转换为List[List[int]]格式。
def convert_csv_to_2d_list(csv_file: str):
tile_map = []
with open(csv_file, "r") as f:
for map_row in csv.reader(f):
tile_map.append(list(map(int, map_row)))
return tile_map
它的用途将是:
self.tile_map = convert_csv_to_2d_list(csv_file="csv_file_location.csv")
for row in range(len(self.tile_map)):
for col in range(len(self.tile_map[row])):
# specific codes follows here
您可以这样做:
import csv
with open('level_file.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
for column in range(len(row)):
if row[column] == 1:
#do sprite stuff
sprites.Tile(column * 32, row * 32, 1, self.tile_group)
elif row[column] == 2:
#etc
导入csv
#LOADING A MAP DATA
with open("YOUR CSV FILE") as f:
data = csv.reader(f, delimiter=',')
y = 0
for row in data:
x = 0
for column in range(len(row)):
x += 1
#IF THE TILE IS IN THE ROW THEN WE RENDERING IT
if row[column] == "-1":
#Render your tile here
display.blit(image, (x * your tile width, y * your tile height , tile width size, tile height size))
y += 1