3

Python/PyGame の時限イベントに関して問題があります。私は 2D 横スクロール プラットフォーマーを作成しています。目標はすべての敵に触れることであり、すべての敵が収集された後、カメラの中心を「出口ブロック」に置きたいと考えています。

カメラが「出口ブロック」の中心に置かれた後、その周囲のブロックを取り除き、カメラをプレーヤーの中心に戻したいと思います。そのため、プレイヤーは周囲のブロックがどのように削除され、「出口ブロック」に到達できるかを確認できます。

すべての敵が集められた後、「出口ブロック」を中心とするコードを取得しましたが、周囲のブロックが削除される前に、カメラがプレーヤーに切り替わります。カメラがプレーヤーを中心に置いた後、ブロックが削除されます。

ここには重要な部分がありません。周囲のブロックが削除された後、pygame.time.wait() を試しました。何か助けはありますか?私が提供したコードが十分でない場合は教えてください。

編集: メインのゲーム ループを次のように分割しました。

level.handle_events(pygame.event.get())
level.update()
level.render(screen)
pygame.display.flip()

メインループが USEREVENT を処理し、その後カメラが更新され、その描画が完了した後にのみ問題が発生する可能性があります。これが、周囲のブロックの削除が見られない理由ですか? しかし、まだ私は続行する方法がわかりません..

関連コード:

プレイヤーの初期化:

self.EXITBLOCKCLEAR = pygame.USEREVENT + 1

プレイヤーの衝突検出:

for e in enemies_group:
    if pygame.sprite.collide_rect(self, e)
        if len(enemies_group) == 0:
           self.exit_block_reveal = True
           pygame.time.set_timer(self.EXITBLOCKCLEAR, 3000)

レベルの更新:

if self.player.exit_block_reveal == False:
    self.camera.update(self.player)     # camera follows player
else:
    self.camera.update(self.exit_block) # camera centered on "exit block"

レベルのイベント処理:

if event.type == self.player.EXITBLOCKCLEAR:
    if self.player.exit_block_reveal == True:
        for block in self.disappearing_block_group:
            block.kill()
            self.disappearing_block_group.remove(block) # remove the surrounding blocks

        if len(self.disappearing_block_group) == 0:     # when blocks are removed, center camera back to player
            self.player.exit_block_reveal = False

最新の編集:コードが機能するようになりました

色々と遊んでみたところ、思い通りに動くようになりました。これは今私にとって完璧に機能します。

更新されたコード (これらは元のコードに対する唯一の変更です)

このコードでは、最後の敵を集めると、カメラが 3 秒間「ブロックの終了」に移動し、周囲のブロックが削除され、さらに 3 秒後にカメラがプレイヤーの中心に戻ります。

レベルの初期化:

self.i = 0

レベルのイベント処理:

if event.type == self.player.EXITBLOCKCLEAR:
    for block in self.disappearing_block_group:
        block.kill()
        self.disappearing_block_group.remove(block)

    if len(self.disappearing_block_group) == 0 and self.i < 1:
        self.i += 1
        self.player.exit_block_reveal = True
    else:
        self.player.exit_block_reveal = False
        pygame.time.set_timer(self.player.EXITBLOCKCLEAR, 0) # stop calling USEREVENT
4

1 に答える 1