首页 > 解决方案 > 有没有更好的方法在 pygame 中创建瓷砖地图?

问题描述

当我尝试对我的图块进行 blit 时,它会显示“列表索引超出范围”。我不知道该怎么做,因为我是新手。

错误信息:

window.blit(tilemap.textures[tilemap.tilemap[row][column]], (column tilemap.tilesize, row tilemap.tilesize)) IndexError: 列表索引超出范围

我试图改变 and 的值,mapwidth但这mapheight并没有成功。我有 2 个脚本。主要和瓷砖映射。因此可能存在错误。注意(我已经在完整代码中初始化了 pygame,所以这不是问题)

主文件

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()

瓦片地图.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

标签: pythonpygametiles

解决方案


tilemap是一个列表。列表有 4 个元素,列表的每个元素也是一个有 4 个元素的列表。

 tilemap = [
       [GRASS, GRASS, GRASS, WATER],
       [GRASS, GRASS, WATER, GRASS],
       [GRASS, WATER, GRASS, GRASS],
       [WATER, GRASS, GRASS, GRASS]
    ]

所以tilemap的“宽度”和“高度”是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])

推荐阅读