※この連載の全ての記事は、タグ「ビッグカツ」の検索一覧から探すことができます。
※この連載で作ったゲームは「BigBreakOut(ゲームの作り方の記事付き) | フリーゲーム投稿サイト GodotPlayer」でプレイできます。
昔から人気の駄菓子「ビッグカツ」のフリー素材画像が公開されたので、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 を使って、ビッグカツ画像を使ったブロック崩しを作成します。
「ビッグカツブロック崩し」作成の第7回では、前回までに作成した左側・上側・右側の壁とパドル(バー)を配置したステージのシーンに追加する、壁やパドルにぶつかると向きを変えて移動しつづけるボールの画像設定と当たり判定領域の設定、スクリプト例を紹介します。
![](https://compota-soft.work/wp1/wp-content/uploads/2024/09/GodotEngine4.3-公式サイトの一部-20240911.png)
※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。
前回の記事
前回は、左右に移動するパドルシーンを子ノードとしてステージのシーンに追加して、パドル(バー)が左右の壁に衝突して止まることを確認しました。
ボール用のシーンを作成
現在編集中のシーンがあれば保存してから、メニュー「シーン」→「新規シーン」でボール用のシーンを新しく作成します。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成1](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成1.png)
シーンドックでは「その他のノード」を選択して、衝突などの物理演算をしながら動かすことができる CharacterBody2D クラスを選択してルートノードを作成します。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成2](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成2-1024x662.png)
ルートノードの名前を Ball に変更します。
※ノードを右クリックして表示されるメニュー「名前を変更」で名前を変更できます。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成3](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成3.png)
画像を表示するノードの追加
ボールの画像ファイルをシステムファイルドックにドラッグ&ドロップしてプロジェクトに追加します。
その後、ファイルシステムドックのその画像ファイルを 2D ワークスペースにドラッグ&ドロップすることでその画像を表示する Sprite2D クラスのノードが Ball ルートノードの下位に追加されました。
追加された画像を表示するノードをインスペクタードックで表示して Node2D クラスの Position プロパティの x, y を 0 に調整して、扱いやすように原点を (0, 0) にしましょう。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成4](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成4-1024x603.png)
当たり判定領域のノードの追加
Ball ルートノードの下位に CollisionShape2D クラスのノードを追加します。
※ Ball ルートノードを右クリックして表示されるメニュー「子ノードを追加」を選択してから CollisionShape2D クラスを選択して作成します。
そのノードをインスペクタードックで表示して、Shape プロパティのリストで円の形の領域を定義するために「新規 CircleShape2D」を選択します。
2D ワークスペースに小さな半透明の水色の円が表示されるので、オレンジ色の丸いハンドルをマウスドラッグして画像と同じ大きさになるように円の大きさを調整します。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成4](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成5-1024x603.png)
スクリプトの作成
シーンドックで、Ball ルートノード( CharacterBody2D クラス )を選択してから、右上の+のアイコンのついた「選択したノードに新規または既存のスクリプトをアタッチする。」ボタンを押します。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成6](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成6-1024x603.png)
パスのファイルパスを指定して「作成」ボタンを押します。
※例ではデフォルトの ball.gd で作成します。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成7](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成7.png)
Script ワークスペースに切り替わり、作成された ball.gd スクリプトが表示されたら、以下のスクリプトで上書きします。
※処理の説明については、スクリプト内のコメントを参照してください。
extends CharacterBody2D
class_name Ball
## ブロック崩しの玉の動きを制御するスクリプトです。
## ボールの移動速度です。
@export var BALL_SPEED: float = 400.0
## ボールの初期角度です。
@export var INITIAL_ANGLE: float = PI / 4 # 45度
## 壁・パドルにぶつかった際の効果音を読み込んで保持します。
@onready var audio_stream_hit: AudioStream = preload("res://sound/Hit.wav")
## ブロックにぶつかりブロックを壊した際の効果音を読み込んで保持します。
@onready var audio_stream_break: AudioStream = preload("res://sound/Break.wav")
func _ready():
# 初期角度でボールを発射
var direction = Vector2(cos(INITIAL_ANGLE), sin(INITIAL_ANGLE))
velocity = direction * BALL_SPEED
func _physics_process(delta):
# 設定されている加速度で移動します。
var collision: KinematicCollision2D = move_and_collide(velocity * delta)
# 何かに衝突した場合
if collision:
# 衝突した Object を取得します。
var collider:Object = collision.get_collider()
# Paddle の場合
if collider.name == "Paddle":
#print("Paddle")
velocity = velocity.bounce(collision.get_normal()) # 進行方向を変更
SCUtil.AudioStreamOnShotPlay(self, audio_stream_hit) # hit.wav 効果音を再生
# Wall の場合
elif collider.name.begins_with("Wall"):
#print("Wall")
velocity = velocity.bounce(collision.get_normal()) # 進行方向を変更
SCUtil.AudioStreamOnShotPlay(self, audio_stream_hit) # hit.wav 効果音を再生
# Block の場合
elif collider.name.begins_with("Block"):
#print("Block")
velocity = velocity.bounce(collision.get_normal()) # 進行方向を変更
collider.queue_free() # 衝突したブロックを消去します。
SCUtil.AudioStreamOnShotPlay(self, audio_stream_break) # break.wav 効果音を再生
else:
printerr("Ball が不明なものと衝突しました。") # 不明なものとの接触はエラーメッセージを表示します。
return
以上で、ボールのシーンができたので、 Ctrl + S などでシーンを保存します。
※例ではデフォルトの ball.tscn で保存しました。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成8](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成8.png)
ステージシーンの子ノードとしてボールシーンを追加
前回、左右に移動するパドルシーンを壁などを配置したステージシーンに子ノードとして追加しました。
それと同様に作成したボールシーンを、ステージシーンに子ノードとして追加します。
先ほど保存したボールシーンのファイル (ball.tscn) をシステムファイルドックから、Stage シーンのタブを選択している状態で、シーンドックの Stage ルートノードにドラッグ&ドロップすることで、ボールシーンをステージシーンに子ノードとして追加できます。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成9](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成9-1024x831.png)
ボールがステージの他のものと比べて大きかったので、シーンドックで追加された Ball ノードを選択してから、インスペクタードックの Node2D クラスの Scale プロパティの x, y を 1 から 0.2 に変更して5分の1にサイズを縮小します。
その後、 2D ワークスペースのボールを移動ツールなどでマウスドラッグしてパドルの上側に配置します。
![Godot4 ビッグカツブロック崩し ボールのシーンの作成10](https://compota-soft.work/wp1/wp-content/uploads/2024/12/Godot4-ビッグカツブロック崩し-ボールのシーンの作成10-1024x603.png)
これで、ボールシーンを作成して、ステージシーンに配置できました。
次回、さらに当たり判定の Collision Layer, Mask の設定をすることで、ボールがパドルにぶつかった際に、パドルはボールの衝突の影響を受けず、ボールは衝突を検知して向きを変える以下の動画のような動きを実現します。
まとめ
「ビッグカツブロック崩し」作成の第7回では、前回までに作成した左側・上側・右側の壁とパドル(バー)を配置したステージのシーンに追加する、壁やパドルにぶつかると向きを変えて移動しつづけるボールの画像設定と当たり判定領域の設定、スクリプト例を紹介しました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- Xユーザーのビッグカツといか姿フライのすぐる【公式】さん: 「使いどころは思いつきませんが、フリー素材としてどうぞご自由にお使いくださいませ! https://t.co/8F9q3hS02b」 / X
- しょかきうたげ【フリーフォント版あり】 – ぼんのう堂 – BOOTH
- Make A Video Game in 30 Minutes | Quick Godot 4 Tutorial – YouTube
- CharacterBody2D — Godot Engine (4.x)の日本語のドキュメント
- Sprite2D — Godot Engine (4.x)の日本語のドキュメント
- CollisionShape2D — Godot Engine (4.x)の日本語のドキュメント
- アイドル処理と物理処理 — Godot Engine (4.x)の日本語のドキュメント
記事一覧 → Compota-Soft-Press
コメント