Pygame中Tiled地图加载异常问题求助
问题描述
我觉得游戏开发是绝佳的学习途径——既出于对游戏的热爱,又能直观看到代码变更带来的效果。跟着教程学习时,遇到了地图加载异常的问题:没有报错信息,但实际显示效果和预期完全不符。
效果对比
项目代码
怀疑问题出在level文件,但无法准确定位;另外support文件只能用绝对路径读取CSV,不确定是否和当前问题相关。
main文件
import pygame, sys from settings import * from level import level from game_data import level_0 pygame.init() screen = pygame.display.set_mode((screen_width,screen_height)) clock = pygame.time.Clock() level = level(level_0,screen) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() screen.fill("black") level.run() pygame.display.update() clock.tick(60)
settings文件
vertical_tile_number = 11 tile_size = 64 screen_height = vertical_tile_number * tile_size screen_width = 1200
level文件
import pygame from support import import_csv_layout from settings import tile_size from tiles import Tile class level: def __init__(self,level_data,surface): self.display_surface = surface terrain_layout = import_csv_layout(level_data["terrain"]) # print(terrain_layout) self.terrain_sprites = self.create_tile_group(terrain_layout,"terrain") def create_tile_group(self,layout,type): sprite_group = pygame.sprite.Group() for row_index, row in enumerate(layout): for col_index,val in enumerate (row): if val != "-1": x = col_index * tile_size y = col_index * tile_size if type == "terrain": sprite = Tile(tile_size,x,y) sprite_group.add(sprite) return sprite_group def run(self): # Run this entire game / level self.terrain_sprites.draw(self.display_surface)
support文件
from csv import reader def import_csv_layout(path): terrain_map = [] # with open(path) as map: with open(r"C:\Users\XXXX\Python games\Mariolike\levels\0\level_0_terrain.csv") as map: #with open(r"C:/Users/XXXX/Python games/Mariolike/levels/0/level_0_terrain.csv") as map: level = reader(map,delimiter = ",") for row in level: # print(row) terrain_map.append(list(row)) return terrain_map
tiles文件
import pygame class Tile(pygame.sprite.Sprite): def __init__(self,size,x,y): super().__init__() self.image = pygame.Surface((size,size)) self.image.fill("grey") self.rect = self.image.get_rect(topleft = (x,y))
Game_data文件
level_0 = { "terrain":"..levels/0/level_0_terrain.csv", "coins":"..levels/0/level_0_coins.csv", "fg palms": "..levels/0/level_0_fg_palms.csv", "bg palms": "..levels/0/level_0_bg_palms.csv", "crates": "..levels/0/level_0_crates.csv", "enemies": "..levels/0/level_0_enemies.csv", "constraints": "..levels/0/level_0_constraints.csv", "player": "..levels/0/level_0_player.csv", "grass": "..levels/0/level_0_grass.csv" }
解决方案
1. 核心问题:Tile的Y坐标计算错误
level.py的create_tile_group方法里,Y坐标错误使用了列索引col_index计算,导致所有Tile的X、Y坐标完全一致,最终排列成斜线。
错误代码:
x = col_index * tile_size y = col_index * tile_size
修正后:
x = col_index * tile_size y = row_index * tile_size
2. 次要问题:CSV路径的硬编码与格式错误
game_data.py里的相对路径少了斜杠,修正为:
level_0 = { "terrain":"../levels/0/level_0_terrain.csv", # 其余路径同理修改为../开头 }
support.py恢复使用传入的path参数,去掉硬编码的绝对路径:
def import_csv_layout(path): terrain_map = [] with open(path) as map: level = reader(map,delimiter = ",") for row in level: terrain_map.append(list(row)) return terrain_map
内容的提问来源于stack exchange,提问作者Runtown
相关产品推荐
相关产品推荐

