【Python】自由落下ゲーム開発(スイカゲーム風) Part6
こんにちは、にわこまです!
今回は、終了判定とGame Overテキストの表示処理を作成します。
本記事で使用するソースコードを以下に示します。
【Python】自由落下ゲーム開発 Part6 ソースコード
何か分からない点がございましたらご連絡お願いいたします!
メールまたはTwitterのDMまで!
スポンサードサーチ
終了判定の作成
ゲームの終了は、ボールがフィールドの上辺を超えているかどうかで判定します。
また、判定のタイミングはボールを落下させてから1秒後とします。常に終了判定を実行してしまうと落下中のボールを検知してしまうからです。
コードの提示
終了判定のソースコードを以下に示します。
import math
import pygame
import pymunk
import random
# 省略
def check_game_over(balls, y):
result = False
for ball in balls:
ball_top = ball.body.position[1] + ball.shape.radius
if(ball_top >= y):
result = True
break
return result
def game():
# 省略
# Game Over Custom Event
CHECKGAMEOVER = pygame.USEREVENT + 1
# Game Over Flag
GAMEOVERFLAG = False
# Game Start
while(not GAMEOVERFLAG):
for event in pygame.event.get():
if(event.type == pygame.QUIT):
return
if(pygame.key.get_pressed()[pygame.K_DOWN]):
# Drop Current Circle
balls.append(current_circle.get_ball())
# Update Current Circle
current_circle.color = next_circle.color
current_circle.radius = next_circle.radius
# Update Next Circle
next_circle.update()
# Set Game Over Custom Event
pygame.time.set_timer(CHECKGAMEOVER, 1000)
if(event.type == CHECKGAMEOVER):
# Check Game Over
GAMEOVERFLAG = check_game_over(balls, tly)
# Fiil background
display.fill(WHEAT)
# Draw Field
field.draw()
# Draw Ball
for ball in balls:
ball.draw()
# Draw Sample Ball
for ball in sample_circles:
ball.draw()
# Draw Current Circle
current_circle.draw()
current_circle.handle_keys()
# Draw Next Circle
next_circle.draw()
# Draw Next Text
display.blit(next_text, next_rect)
# Draw Score Text
score_text = font.render("Score: {:,}".format(handler.data["score"]), True, BLACK)
score_rect = score_text.get_rect(
bottomleft=convert_cordinates((tlx, cx+radius_06))
)
display.blit(score_text, score_rect)
# Display Update
pygame.display.update()
clock.tick(FPS)
space.step(1/FPS)
game()
pygame.quit()
コードの解説
8行目から15行目の「check_game_over関数」は終了判定を実行する関数です。
11行目ではボールの最高座標を取得しています。
12行目ではボールの最高座標がフィールドの上辺を超えていないか判定しています。
23行目ではカスタムイベントを定義しています。このカスタムイベントを検知した場合、check_game_over関数を実行します。
25行目ではゲームオーバーフラグを定義しています。ゲームオーバーである状態がTrueであるため、初期値はFalseを定義しています。
41行目では1秒後にカスタムイベントを発生させるように設定しています。
42行目から44行目ではカスタムイベントが発生した場合の処理を定義しています。
44行目ではcheck_game_over関数を実行しゲームオーバーフラグを更新しています。
動作確認
動作確認を実施します。
コードを保存し、コマンドプロンプトを開きます。コードを保存したフォルダまで移動し、以下のコマンドを実行します。
python free_fall_game_part6_1.py
ゲームオーバーになるまでゲームをプレイしてみてください。
ボールがフィールドの上辺に到達した時にゲームが終了することを確認します。
スポンサードサーチ
Game Over 表示処理の作成
先の終了判定の動作確認で気づいたと思いますが、終了して直ぐにウィンドウが閉じてしまいます。
これでは、終了後にフィールドやスコアを確認できません。ゆえに、ゲーム終了後に画面を表示させたままにすることとゲームオーバーの表示処理を作成します。
コードの提示
ゲームオーバーの表示処理のソースコードを以下に示します。
import math
import pygame
import pymunk
import random
# 省略
def game():
# 省略
# Game Start
while(not GAMEOVERFLAG):
# 省略
# Game Over Text
game_over_text = font.render("Game Over", True, BLACK)
game_over_rect = game_over_text.get_rect(
midbottom=(disp_size[0]/2, disp_size[1]/2)
)
while(True):
for event in pygame.event.get():
if(event.type == pygame.QUIT):
return
# Fiil background
display.fill(WHEAT)
# Draw Field
field.draw()
# Draw Ball
for ball in balls:
ball.draw()
# Draw Sample Ball
for ball in sample_circles:
ball.draw()
# Draw Current Circle
current_circle.draw()
current_circle.handle_keys()
# Draw Next Circle
next_circle.draw()
# Draw Next Text
display.blit(next_text, next_rect)
# Draw Score Text
score_text = font.render("Score: {:,}".format(handler.data["score"]), True, BLACK)
score_rect = score_text.get_rect(
bottomleft=convert_cordinates((tlx, cx+radius_06))
)
display.blit(score_text, score_rect)
# Draw Game Over Text
display.blit(game_over_text, game_over_rect)
# Display Update
pygame.display.update()
clock.tick(FPS)
space.step(1/FPS)
game()
pygame.quit()
コードの解説
17行目では表示するテキストを定義しています。第1引数にテキスト、第2引数にアンチエイリアスの有無、第3引数にテキストの色を設定します。
ここでは第1引数に「Game Over」、第2引数にTrueつまりアンチエイリアスあり、第3引数に黒を設定しています。
18行目から20行目ではテキストの表示位置を設定しています。midbottomを基準として表示位置を設定しています。
22行目から63行目はゲーム終了後も画面後表示させるための処理を実行しています。処理の流れとしては、ゲーム中の画面表示処理とほぼ同じです。
58行目では「Game Over」テキストを表示しています。
動作確認
動作確認を実施します。
コードを保存し、コマンドプロンプトを開きます。コードを保存したフォルダまで移動し、以下のコマンドを実行します。
python free_fall_game_part6_2.py
以下のように、ゲーム終了までゲームをプレイしてみてください。
ゲーム終了後に「Game Over」テキストが表示されることを確認します。
スポンサードサーチ
まとめ
今回は、終了判定とGame Overテキストの表示処理を作成しました。
この自由落下ゲームは一旦完成となりますが、課題があります。それは終了判定が甘いということです。実際には終了ではないのに終了と判定してしまうことがあります。
自由落下ゲーム開発の目次はこちら
本記事で使用したソースコードを以下に示します。
【Python】自由落下ゲーム開発 Part6 ソースコード
完成版のソースコードを以下に示します。
【Python】自由落下ゲーム開発 ソースコード
最後までお読みいただきありがとうございます。
参考
・pygameの公式ドキュメントはこちら
・pymunkの公式ドキュメントはこちら
・pymunkのチュートリアルを説明しているYoutubeはこちら
・カラーコード 原色大辞典はこちら
・カラーコード 色検索はこちら
スポンサードサーチ