Pygame平台游戏开发:2D数组加载CSV瓦片图片报错问询
问题解决思路与代码修正
错误原因
你触发ValueError的直接原因是这段代码:
self.tiles[rowcounter][colcounter] = int("Tile_" + data[colcounter] + ".png")
你试图把字符串"Tile_36.png"转换成整数,而这个字符串并非纯数字格式,自然无法完成转换。
2D数组应该存什么?
推荐两种实用方案,按需选择:
- 方案1:存瓦片ID(csv中的数字):内存占用小,适合瓦片数量多的场景,渲染时根据ID匹配预加载的图片即可,灵活性更高。
- 方案2:存Pygame Surface对象:直接存储加载好的图片,渲染时可直接使用,但瓦片数量较多时会占用更多内存。
通常优先选择方案1,兼顾性能与灵活性。
修正后的代码
level.py 修改版
import pygame class Tilemap: def __init__(self): self.tile_size = 32 self.start_x = 0 self.start_y = 0 self.tiles = [] # 预加载瓦片图片的字典:key为瓦片ID,value为Surface对象 self.tile_images = {} def load_map(self, filename, tile_folder="tiles"): # 合并原initArray与PopArray功能,减少文件IO次数 self.tiles = [] with open(filename, "r") as file: for line in file: row_data = line.strip().split(",") current_row = [] for tile_id_str in row_data: tile_id = int(tile_id_str) if tile_id == -1: current_row.append(-1) else: # 方案1:存储瓦片ID current_row.append(tile_id) # 预加载对应图片(避免重复加载) if tile_id not in self.tile_images: tile_path = f"{tile_folder}/Tile_{tile_id}.png" self.tile_images[tile_id] = pygame.image.load(tile_path).convert_alpha() self.tiles.append(current_row) return self.tiles # 新增瓦片渲染示例方法 def draw(self, screen): for y, row in enumerate(self.tiles): for x, tile_id in enumerate(row): if tile_id == -1: continue tile_img = self.tile_images[tile_id] screen.blit(tile_img, (x * self.tile_size, y * self.tile_size))
Main.py 修改版
import pygame from level import Tilemap pygame.init() screen = pygame.display.set_mode((800, 600)) map = Tilemap() tile_array = map.load_map("project.csv") print(tile_array) # 游戏主循环示例 running = True while running: screen.fill((0, 0, 0)) map.draw(screen) pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT: running = False pygame.quit()
关键修改说明
- 移除了错误的字符串转整数逻辑,直接存储csv中的瓦片ID(整数)。
- 合并原两个数组处理方法,用
with语句自动管理文件关闭,避免资源泄漏。 - 新增瓦片图片预加载逻辑,用字典缓存已加载的图片,避免重复IO操作影响性能。
- 添加了渲染示例方法,展示如何通过2D数组中的ID渲染对应瓦片。
内容的提问来源于stack exchange,提问作者The epic Gamer
相关产品推荐
相关产品推荐

