1

レベルが互いに接続されている pygame でプラットフォーマーを作成しています。(1 つのレベルは 1 つの画面であり、画面から離れると次のレベルに移動します)。

私は現在、オフスクリーンを歩いた後にファイルから接続されたレベルをロードすることを持っていますが、これは明らかに遅いので、すべてのレベルをプリロードしたいと思います。これを行うには、ルート レベルを 1 つ取得し、それが接続されているすべてのレベルを取得し、それらの各レベルが接続されているすべてのレベルを取得し、すべてのレベルを取得するまで繰り返します。

そのためにこのコードを書きましたが、機能しません。疲れた時に書きました。誰でもこれで私を助けることができますか?必要に応じて追加の質問にお答えします。

def loadLinkedLevels(level, surface, ignoredIds = []):
    levels = {}

    for levelId in level.warps.values():
        if levelId and levelId not in ignoredIds:
            levels[levelId] = LevelBuilder.loadLevel(levelId, surface)

    return levels

def getBranchingLevels(levels, p):
    newLevels = True # Do-while

    while newLevels:
        for level in levels.values():
            newLevels = loadLinkedLevels(level, p.screen, levels.keys())

        levels.update(newLevels)

        return levels

def preloadLevels(rootLevel, p):
    levels = loadLinkedLevels(rootLevel, p.screen)
    newLevels = {}

    for level in levels.values():
        newLevels.update(loadLinkedLevels(level, p.screen, levels.keys()))

    levels.update(newLevels)

    levels.update(getBranchingLevels(levels, p))

    return levels
4

1 に答える 1

2

目立つバグは次のとおりです。

for level in levels.values():
    newLevels = loadLinkedLevels(level, p.screen, levels.keys())

levels.update(newLevels)

levelsnewLevelsループの最後のラウンドでのみ更新されます。( Python デバッガーでこのコードをステップ実行していれば、これを簡単に見つけることができたはずです。)

しかし、一般的に、あなたのコードは複雑すぎるようです。ルートから始まるレベルのグラフを検索しようとしています。では、簡単な幅優先探索アルゴリズムを使用してみませんか? このような:

from collections import deque

def load_all_levels(root, p):
    """Load all levels reachable from `root`.
    Return a dictionary mapping level id to level.
    """
    # Queue of levels that have been loaded but whose neighbours have not.
    q = deque([root])
    # Map from level id to level for all levels loaded so far.
    loaded = {root.id: root}
    while q:
        for level_id in q.popleft().warps.values():
            if level_id not in loaded:
                level = LevelBuilder.loadLevel(level_id, p.screen)
                loaded[level_id] = level
                q.append(level)
    return loaded
于 2013-03-24T09:37:26.130 に答える