You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:15:36