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

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

今回は、スイカゲーム風の自由落下ゲームを開発します。スイカゲームというと一時期大流行した任天堂から発売されているゲームです。果物を落下させて合体させて最終的にはスイカを作り、高得点を目指すゲームです。非常にシンプルなゲームであるため、pythonでも作ることができます。

Part1では、はじめに今回開発する自由落下ゲームの概要や完成図を紹介します。

 

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

 

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

メールまたはTwitterのDMまで!

 

 

スポンサードサーチ


自由落下ゲームとは?

自由落下ゲームとは、物体を自由落下させ合体させ高得点を目指すゲームです。同じ大きさ同じ色の物体同士が合体し、一段階大きい物体に変化します。物体が合体するときに得点します。

完成形を以下に示します。

ゲーム開始時の画像
ゲーム終了時の画像

 

 

開発環境

OS:Windows 10 Pro 22H2

Python:3.10.11

 

 

開発の流れ

本記事とこれからの記事では、(1)作成したい処理の提示、(2)実際のコード、(3)コードの解説、(4)動作確認という順番で解説を行います。

(1)作成したい処理の提示では、そこで何を実現したいのかを示します。

(2)実際のコードでは、私が作成したコードをお見せします。

(3)コードの解説では、コードを見ながら具体的にどんな処理を行っているのか、どのような考えがありその書き方にしたのか解説します。

(4)動作確認では、作成したコードが実際にどのように動くのかお見せします。

 

 

パート数

自由落下ゲーム開発は全6パートあります。各パートの概要は下記の通りです。

Part1では、自由落下させる物体ボールを作成します。

Part2では、色大きさ違いのボールとフィールドを作成します。

Part3では、ボール同士の衝突処理を作成します。

Part4では、フィールド上方で動かすボールと次ボールを作成します。

Part5では、ボールの落下処理と更新処理を作成します。さらにテキストを表示させます。

Part6では、終了判定を作成します。

 

 

ボールの作成

自由落下させるボールの基礎となるクラスを作成します。

 

 

コードの提示

自由落下させるボールクラスのソースコードを以下に示します

import pygame
import pymunk

pygame.init()

disp_size = (800, 800)
display = pygame.display.set_mode(disp_size)
clock = pygame.time.Clock()
space = pymunk.Space()
space.gravity = 0, -1000
FPS = 100

BLACK = (0, 0, 0)
WHEAT = (245, 222, 179)


def convert_cordinates(point):
    return point[0], disp_size[1]-point[1]

class Ball(object):
    def __init__(self, x, y, color, radius, mass, collision_type):
        self.color = color
        self.body = pymunk.Body(body_type=pymunk.Body.DYNAMIC)
        self.body.position = x, y
        self.body.mass = mass
        self.shape = pymunk.Circle(self.body, radius)
        self.shape.collision_type = collision_type
        self.shape.density = 1
        self.shape.elasticity = 0.5
        self.shape.friction = 0.5
        space.add(self.body, self.shape)
    def draw(self):
        pygame.draw.circle(
            display,
            self.color,
            convert_cordinates(self.body.position),
            self.shape.radius
        )


def game():
    # Ball
    balls = []

    # Game Start
    while(True):
        for event in pygame.event.get():
            if(event.type == pygame.QUIT):
                return
            if(event.type == pygame.MOUSEBUTTONDOWN):
                x, y = convert_cordinates(event.pos)
                balls.append(
                    Ball(x, y, BLACK, 50, 50,0)
                )
        # Fiil background
        display.fill(WHEAT)

        # Draw Ball
        for ball in balls:
            ball.draw()

        # Display Update
        pygame.display.update()
        clock.tick(FPS)
        space.step(1/FPS)


game()
pygame.quit()

 

 

コードの解説

1行目は、pygameというライブラリをインポートしています。pygameライブラリは画面を作成したり、画面上に図形を表示するためのライブラリです。

 

2行目は、pymunkというライブラリをインポートしています。pymunkライブラリは自由落下を実現するためのライブラリです。

 

4行目は、pygameを初期化しています。pygameを使用するために必ず必要な処理です。

 

6行目から14行目は、それぞれ定数を定義しています。

6行目の「disp_size」は画面のサイズを定義しています。今回は800×800の正方形とします。

7行目の「display」は画面オブジェクトを定義しています。このdisplayオブジェクトに対して図やテキストの表示処理を実行します。

8行目の「clock」はFPSを制御するためのオブジェクトを定義しています。

9行目の「space」は自由落下用の画面オブジェクトを定義しています。このspaceに対して自由落下させたいオブジェクトを追加していきます。

10行目の「space.gravity」は重力の方向と強さを定義しています。今回はy軸をマイナス方向に1000と定義しているため、画面上だと下方向に重力がかかります。

11行目の「FPS」は1秒あたりに画面を更新する回数を定義しています。

13行目の「BLACK」はpygameで使用する黒色を定義しています。14行目の「WHEAT」はpygameで使用する小麦色を定義しています。

 

 

17行目と18行目はpymunkの座標をpygameの座標に変換するための関数です。

pygameの原点は左上です。pymunkの原点は左下です。

 

 

20行目から38行目は自由落下させるボールの基礎クラスです。

21行目から31行目の「__init__関数」は初期処理を実施しています。

23行目の「self.body」は物体の性質を定義しています。「body_type=pymunk.Body.DYNAMIC」は重力や衝突の影響を受け、質量などを持ちます。

24行目の「self.body.position」は物体の座標を定義しています。

25行目の「self.body.mass」は物体の質量を定義しています。

26行目の「self.shape」は物体の形状を定義しています。「pymunk.Circle」は円形です。

27行目の「self.shape.collision_type」は衝突時に物体を識別する値を定義しています。

28行目の「self.shape.density」は密度を定義しています。

29行目の「self.shape.elasticity」は弾性率を定義しています。弾性率とは跳ね返りの程度のことです。

以下に弾性率のイメージ図を示します。

30行目の「self.friction」は摩擦係数を定義しています。

31行目は作成した「self.body」と「self.shape」を自由落下用の画面オブジェクトに追加しています。自由落下空間に物体を追加したイメージです。

 

32行目から38行目の「draw関数」は画面上に物体を表示する処理を実施しています。

物体は円形であるため「pygame.draw.circle」で円を表示します。第1引数にはpygameの画面オブジェクト、第2引数には色、第3引数には座標、第4引数には半径を設定します。

第3引数で「convert_cordinates関数」を使用している理由は、pymunkの座標をpygameの座標に変換するためです。

 

 

41行目から65行目の「game関数」は実際にゲームの処理を実施しています。

43行目の「balls」は空のリストを定義しています。このリストには画面上で表示するボールを追加していきます。

 

46行目から65行目の「while文」はゲーム中の表示処理やイベント処理を実施しています。

48行目と49行目は、ウィンドウ右上の「×ボタン」をクリックした時にゲームを終了する処理を定義しています。

50行目から54行目は画面上をクリックした時にクリックした位置にボールを表示させる処理を定義しています。

51行目はクリックした位置を取得かつpygame用の座標に変換しています。

52行目から54行目はボールを定義かつballsに追加しています。

 

56行目は画面の背景を小麦色に塗りつぶしています。

 

59行目と60行目は「balls」に保持されているボールを表示しています。

 

63行目から65行目は画面の更新に必要な処理です。

 

 

スポンサードサーチ


動作確認

動作確認を実施します。

コードを保存し、コマンドプロンプトを開きます。コードを保存したフォルダまで移動し、以下のコマンドを実行します。

python free_fall_game_part1_1.py

 

以下のように小麦色の画面が表示されることを確認します。

 

さらに、画面上を適当にクリックしボールが表示されることを確認します。

最後にウィンドウ右上の「×印」をクリックしウィンドウが閉じることを確認します。

 

まとめ

今回はスイカゲーム風自由落下ゲームの概要を説明しました。また画面とボールを作成し、実際にボールが落ちることを確認しました。

 

次回Part2では、色と大きさ違いのボールを作成します。さらにフィールドを作成します。

 

 

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

 

 

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

 

 

スポンサードサーチ


参考

 


スポンサードサーチ