【Python】自由落下ゲーム開発(スイカゲーム風) Part1
こんにちは、にわこまです!
今回は、スイカゲーム風の自由落下ゲームを開発します。スイカゲームというと一時期大流行した任天堂から発売されているゲームです。果物を落下させて合体させて最終的にはスイカを作り、高得点を目指すゲームです。非常にシンプルなゲームであるため、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では、色と大きさ違いのボールを作成します。さらにフィールドを作成します。
自由落下ゲーム開発の目次はこちら
本記事で使用したソースコードを以下に示します。
【Python】自由落下ゲーム開発 Part1 ソースコード
最後までお読みいただきありがとうございます。
スポンサードサーチ
参考
・pygameの公式ドキュメントはこちら
・pymunkの公式ドキュメントはこちら
・pymunkのチュートリアルを説明しているYoutubeはこちら
・カラーコード 原色大辞典はこちら
・カラーコード 色検索はこちら
スポンサードサーチ