чтение файла tmx (для pygame) во время работы mainloop - PullRequest
1 голос
/ 20 февраля 2020

так что я делаю игру с pygame, и у меня есть несколько прилично больших файлов tmx для картографических данных. Мне было интересно, есть ли A, способ ускорить его или B, если бы я мог одновременно запустить mainl oop и загрузить карту. Таким образом, у меня мог быть экран загрузки. Я попытался использовать многопроцессорность, но он сказал, что не может засечь объекты Pygame. Спасибо!

1 Ответ

0 голосов
/ 21 февраля 2020

Ваш код может загрузить карту TMX в потоке. Это позволит основному l oop ждать события «законченная загрузка» и делать что-то еще во время ожидания.

В приведенном ниже примере кода используется библиотека pytmx. Обычно для рендеринга карты в изображение требуется больше кода, но я упустил это, чтобы сделать ответ короче. Может быть, полезно также публиковать больше информации о состоянии во время загрузки. Это позволило бы main-l oop отображать индикатор прогресса или что-то подобное.

Очевидно, что этот пример ничего не делает с окном, кроме заполнения его синим цветом.

import pygame
import threading
import pytmx

WINDOW_WIDTH    = 400
WINDOW_HEIGHT   = 400
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE

DARK_BLUE = (   3,   5,  54 )
CREAM     = ( 255, 254, 224 )

MAP_LOAD_DONE  = pygame.USEREVENT + 1
MAP_LOAD_ERROR = pygame.USEREVENT + 2

# global to hold map
global_tmx_map = None

# Thread function to load map in the background
class MapLoadThread( threading.Thread ):
    def __init__( self, map_name ):
        threading.Thread.__init__(self)
        self.daemon = True # exit with parent
        self.map_name = map_name

    def run( self ):
        global global_tmx_map

        new_event_args = {}
        try:
            global_tmx_map = pytmx.load_pygame( self.map_name, pixelalpha=True )
            # TODO: do more TMX operations in the thread here.
            new_event      = pygame.event.Event( MAP_LOAD_DONE, new_event_args )
        except Exception as e:
            new_event_args[ 'exception' ] = e
            new_event = pygame.event.Event( MAP_LOAD_ERROR, new_event_args )

        # send the load/fail event to the main loop
        pygame.event.post( new_event )

# ...

### Window initialisation
pygame.init()
pygame.mixer.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption( "TMX Loader Thread Example" )

# Start the Map Loading thread
thread1 = MapLoadThread( "my_map.tmx" )
thread1.start()


### Main Loop
clock = pygame.time.Clock()
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == MAP_LOAD_DONE ):
            print( "MAP LOADED OK" );
        elif ( event.type == MAP_LOAD_ERROR ):
            print( "MAP LOAD FAILED" );
            print( "EXCEPTION WAS " + str( event.exception ) )

    # Update the window, but not more than 60 FPS
    window.fill( DARK_BLUE )
    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(60)

pygame.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...