【Python】自由落下ゲーム開発(スイカゲーム風) Part6

こんにちは、にわこまです!

今回は、終了判定とGame Overテキストの表示処理を作成します。

 

本記事で使用するソースコードを以下に示します。

 

何か分からない点がございましたらご連絡お願いいたします!

メールまたは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テキストの表示処理を作成しました。

この自由落下ゲームは一旦完成となりますが、課題があります。それは終了判定が甘いということです。実際には終了ではないのに終了と判定してしまうことがあります。

 

 

本記事で使用したソースコードを以下に示します。

完成版のソースコードを以下に示します。

 

 

最後までお読みいただきありがとうございます。

 

 

参考

 


スポンサードサーチ