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