Как отобразить мозаичную карту в Pygame с помощью Tiled и pytmx?

Я знаю, что есть аналогичный вопрос, но ответы не были достаточно конкретными, чтобы быть полезными в моем случае.

Я пытаюсь создать программу, которая может отображать мозаичную карту, созданную в Tiled и загруженную в Pygame с помощью pytmx. Единственная проблема, с которой я столкнулся, - это отображение изображений на экране в Pygame.

Я продолжаю получать эту ошибку: Traceback (последний вызов последним): файл «C: \ Users \ b \ Desktop \ Frozen Map Textures \ test.py», строка 32, в screen.blit (images [i], ( x * 32, y * 32)) TypeError: аргумент 1 должен быть pygame.Surface, а не None

Если кто знает, как исправить проблему, буду очень признателен! Спасибо за вашу помощь!

Код ниже:

import pygame
from pytmx import load_pygame
import random


white = (255,255,255)


#create window
screenSize = (800,600)
screen = pygame.display.set_mode(screenSize)
pygame.display.set_caption("GameName")
screen.fill(white)


gameMap = load_pygame("Frozen.tmx")


#creates list of single tiles in first layer
images = []
for y in range(50):
    for x in range(50):
        image = gameMap.get_tile_image(x,y,0)
        images.append(image)


#displays tiles in locations
i = 0
for y in range(50):
    for x in range(50):
        screen.blit(images[i],(x*32,y*32))
        i += 1


#main loop
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    pygame.display.flip()

pygame.quit()

person Christian Ermann    schedule 14.03.2015    source источник
comment
Между прочим, я работаю на 64-битной Windows 8. Я не уверен, что это повлияет на что-нибудь.   -  person Christian Ermann    schedule 14.03.2015
comment
Не могли бы вы рассказать нам, что происходит, когда вы пытаетесь блит.   -  person elegent    schedule 16.03.2015
comment
Я буду. Я не смог попробовать. Мне пришлось уехать из города, прежде чем я увидел твой ответ.   -  person Christian Ermann    schedule 16.03.2015


Ответы (1)


Я не очень знаком с pytmx, но думаю, проблема в том, что переменная i работает от 0 до 2600 в первом for-цикле (у вас 2600 элементов / изображений / плиток в списке images). Но когда вы создаете список местоположений плиток (imageLocs), i запускается только от 0 до 49, поэтому у вас есть список 50 разных местоположений.

Это означает, что у вас недостаточно локаций для каждой плитки.

В дополнение к этому вам не нужно увеличивать какие-либо переменные в for i in rang(value)-цикле в python, потому что i запускает throw (т.е. присваивает) все значения, возвращаемые функцией range().

Вы можете обновить свой код, чтобы избежать этой проблемы:

#Original code    

#create a list of 2600 single tiles in first layer
images = []

for y in range(50):
    for x in range(50):
        image = gameMap.get_tile_image(x,y,0)
        images.append(image)

#blit all tiles onto the screen
i = 0 #runs from 0 to 2600

for y in range(50):
    for x in range(50):
        screen.blit(images[i],(x * 32, y * 32))
        i += 1

#Orginal code

Надеюсь, это поможет :)

person elegent    schedule 14.03.2015
comment
Я обновил свой код и добавил сообщение об ошибке, которое тоже получал. Вы знаете, в чем проблема? Я просто не могу понять, почему индекс списка предоставляет тип None. - person Christian Ermann; 17.03.2015
comment
Привет! Просто проигнорируйте мой последний комментарий. Оказалось, что в моем файле карты было одно пустое место .... Спасибо за ваше время! Ваши предложения действительно сделали мой код красивым! - person Christian Ermann; 17.03.2015
comment
я думаю, что я от 0 до 2500 (т.е. 50 * 50) - person umbe1987; 12.07.2016