pygameで作るインベーダーゲーム ポーズ画面作成の仕方
初めまして、Python初心者です。
今回、pythonのpygameライブラリを用いて、インベーダーゲームを作成しています。
ネットに落ちていたコードを元にある程度のところまでは作れたのですが、ポーズ画面がうまく動作しません。
画面は全部で4画面あります。
1:タイトル
2:プレイ
3:ポーズ
4:ゲームオーバー
2のプレイ画面起動中に、キーボード”P”を押すとポーズ画面が起動されるようにしているのですが、ポーズ画面終了後に敵の動きだけ止まりませんでした。
その他の、球などは止まっています。
そこでコードを読んだところ、
敵クラスを最初に呼び出した時間と現在時刻の差の分だけ敵が動くように記載されていました。
なので、対策としてポーズ画面起動中は、その差が変わらないよう
敵クラスを最初に呼び出した時間にポーズ中の時間も足されるようにコーディングした所敵の動きも止まるようになりました。
しかし、ポーズ画面を解除し、プレイ画面に戻っても敵の動きが動かなくなりました。
その間も敵の弾は動いています。
不規則な時間経過後また動き出すのですが、このラグを無くしたいです。どのようにすればよろしいでしょうか?
稚拙な質問内容、質問の仕方で恐縮なのですが、ご有識者の方よろしくお願いします。
出ているエラーメッセージを入力
エラーメッセージ自体は出ていません。
該当するソースコード
Python pygame
ソースコードを入力
【敵のグループクラス】
class EnemiesGroup(sprite.Group):
def init(self, columns, rows):
super().init()
sprite.Group.init(self)
self.enemies = [[None] * columns for _ in range(rows)]
self.columns = columns
self.rows = rows
self.leftAddMove = 0
self.rightAddMove = 0
self.moveTime = 600
self.direction = 1
self.rightMoves = 30
self.leftMoves = 30
self.moveNumber = 0
self.timer = time.get_ticks()
self.bottom = game.enemyPosition + ((rows - 1) * 45) + 35
self._aliveColumns = list(range(columns))
self._leftAliveColumn = 0
self._rightAliveColumn = columns - 1
def update(self, current_time , paused):
if not paused:
# saved_timer = self.timer
if current_time - self.timer > self.moveTime:
if self.direction == 1:
max_move = self.rightMoves + self.rightAddMove
else:
max_move = self.leftMoves + self.leftAddMove
if self.moveNumber >= max_move:
self.leftMoves = 30 + self.rightAddMove
self.rightMoves = 30 + self.leftAddMove
self.direction *= -1
self.moveNumber = 0
self.bottom = 0
for enemy in self:
enemy.rect.y += ENEMY_MOVE_DOWN
enemy.toggle_image()
if self.bottom < enemy.rect.y + 35:
self.bottom = enemy.rect.y + 35
else:
velocity = 10 if self.direction == 1 else -10
for enemy in self:
enemy.rect.x += velocity
enemy.toggle_image()
self.moveNumber += 1
self.timer += self.moveTime
else:
self.timer = self.timer + current_time
【メインクラス内に記載の関数】
def check_input(self):
self.keys = key.get_pressed()
for e in event.get():
if self.should_exit(e):
sys.exit()
if e.type == KEYDOWN:
if e.key == K_SPACE:
if len(self.bullets) == 0 and self.shipAlive:
if self.score < 1000:
bullet = Bullet(self.player.rect.x + 23,
self.player.rect.y + 5, -1,
15, 'laser', 'center')
self.bullets.add(bullet)
self.allSprites.add(self.bullets)
self.sounds['shoot'].play()
else:
leftbullet = Bullet(self.player.rect.x + 8,
self.player.rect.y + 5, -1,
15, 'laser', 'left')
rightbullet = Bullet(self.player.rect.x + 38,
self.player.rect.y + 5, -1,
15, 'laser', 'right')
self.bullets.add(leftbullet)
self.bullets.add(rightbullet)
self.allSprites.add(self.bullets)
self.sounds['shoot2'].play()
elif e.key == K_p:
self.paused = not self.paused
self.startGame = not self.startGame
def draw_pause_screen(self):
# self.screen.fill((0, 0, 0))
# self.screen.blit(self.background, (0, 0))
pause_text = Text(FONT, 50, 'Paused', WHITE, 300, 250)
resume_text = Text(FONT, 30, 'Press R to Resume', WHITE, 290, 320)
quit_text = Text(FONT, 30, 'Press Q to Quit', WHITE, 310, 370)
pause_text.draw(self.screen)
resume_text.draw(self.screen)
quit_text.draw(self.screen)
self.keys = key.get_pressed() # 現在のキーボードの状態を取得
for e in event.get(): # イベントを処理
if self.should_exit(e): # ウィンドウを閉じるイベントがあればプログラムを終了
sys.exit()
if e.type == KEYDOWN: # キーの押下によるイベント処理
if e.key == K_p: # Pキーが押された場合
self.paused = not self.paused
self.startGame = not self.startGame
【メインクラス内のメインループないコード】
def main(self):
while True:
if self.mainScreen:
self.screen.blit(self.background, (0, 0))
self.titleText.draw(self.screen)
self.titleText2.draw(self.screen)
self.enemy1Text.draw(self.screen)
self.enemy2Text.draw(self.screen)
self.enemy3Text.draw(self.screen)
self.enemy4Text.draw(self.screen)
self.create_main_menu()
for e in event.get():
if self.should_exit(e):
sys.exit()
if e.type == KEYUP:
# Only create blockers on a new game, not a new round
self.allBlockers = sprite.Group(self.make_blockers(0),
self.make_blockers(1),
self.make_blockers(2),
self.make_blockers(3))
self.livesGroup.add(self.life1, self.life2, self.life3)
self.reset(0)
self.startGame = True
self.mainScreen = False
elif self.startGame:
if self.paused:
self.draw_pause_screen()
else:
if not self.enemies and not self.explosionsGroup:
currentTime = time.get_ticks()
if currentTime - self.gameTimer < 3000:
self.screen.blit(self.background, (0, 0))
self.scoreText2 = Text(FONT, 20, str(self.score),
GREEN, 85, 5)
self.scoreText.draw(self.screen)
self.scoreText2.draw(self.screen)
self.nextRoundText.draw(self.screen)
self.livesText.draw(self.screen)
self.livesGroup.update()
self.check_input()
if currentTime - self.gameTimer > 3000:
# Move enemies closer to bottom
self.enemyPosition += ENEMY_MOVE_DOWN
self.reset(self.score)
self.gameTimer += 3000
else:
currentTime = time.get_ticks()
self.play_main_music(currentTime)
self.screen.blit(self.background, (0, 0))
self.allBlockers.update(self.screen)
self.scoreText2 = Text(FONT, 20, str(self.score), GREEN,
85, 5)
self.scoreText.draw(self.screen)
self.scoreText2.draw(self.screen)
self.livesText.draw(self.screen)
self.check_input()
# self.check_input2()
self.enemies.update(currentTime , self.paused)
self.allSprites.update(self.keys, currentTime)
self.explosionsGroup.update(currentTime)
self.check_collisions()
self.create_new_ship(self.makeNewShip, currentTime)
self.make_enemies_shoot()
elif self.gameOver:
currentTime = time.get_ticks()
# Reset enemy starting position
self.enemyPosition = ENEMY_DEFAULT_POSITION
self.create_game_over(currentTime)
else:
self.draw_pause_screen()