Есть ли лучший способ создать плитку в Pygame? - PullRequest
0 голосов
/ 10 февраля 2019

Когда я пытаюсь заморозить свои плитки, он говорит: «индекс списка вне диапазона».Я понятия не имею, что делать, так как я новичок в этом.

Сообщение об ошибке:

window.blit (tilemap.textures [tilemap.tilemap [row] [column]], (column tilemap.tilesize, row tilemap.tilesize)) IndexError: список индексов вне диапазона

Я пытался изменить значения mapwidth и mapheight, но это не сработало.У меня есть 2 сценария.Основное и укладка плитки.Возможно, из-за этого произошла ошибка.Примечание (я включил pygame в полный код, так что это не проблема)

main.py

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

tilemap.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

1 Ответ

0 голосов
/ 10 февраля 2019

tilemap - это список.Список имеет 4 элемента, и каждый элемент списка также представляет собой список из 4 элементов.

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

Таким образом, «ширина» и «высота» карты тайла составляют 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])
...