Godot4 ビッグカツブロック崩し7 ボールの絵と当たり判定とスクリプト例

※この連載の全ての記事は、タグ「ビッグカツ」の検索一覧から探すことができます。
※この連載で作ったゲームは「BigBreakOut(ゲームの作り方の記事付き) | フリーゲーム投稿サイト GodotPlayer」でプレイできます。

昔から人気の駄菓子「ビッグカツ」フリー素材画像が公開されたので、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 を使って、ビッグカツ画像を使ったブロック崩しを作成します。

「ビッグカツブロック崩し」作成の第7回では、前回までに作成した左側・上側・右側のパドル(バー)を配置したステージのシーンに追加する、壁やパドルにぶつかると向きを変えて移動しつづけるボールの画像設定と当たり判定領域の設定、スクリプト例を紹介します。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。

前回の記事

前回は、左右に移動するパドルシーンを子ノードとしてステージのシーンに追加して、パドル(バー)が左右の壁衝突して止まることを確認しました。

ボール用のシーンを作成

現在編集中のシーンがあれば保存してから、メニュー「シーン」→「新規シーン」でボール用のシーンを新しく作成します。

Godot4 ビッグカツブロック崩し ボールのシーンの作成1

シーンドックでは「その他のノード」を選択して、衝突などの物理演算をしながら動かすことができる CharacterBody2D クラスを選択してルートノードを作成します。

Godot4 ビッグカツブロック崩し ボールのシーンの作成2

ルートノードの名前を Ball に変更します。
※ノードを右クリックして表示されるメニュー「名前を変更」で名前を変更できます。

Godot4 ビッグカツブロック崩し ボールのシーンの作成3

画像を表示するノードの追加

ボールの画像ファイルシステムファイルドックにドラッグ&ドロップしてプロジェクトに追加します。
その後、ファイルシステムドックのその画像ファイル2D ワークスペースドラッグ&ドロップすることでその画像を表示する Sprite2D クラスのノードが Ball ルートノードの下位に追加されました。

追加された画像を表示するノードインスペクタードックで表示して Node2D クラスの Position プロパティの x, y を 0 に調整して、扱いやすように原点を (0, 0) にしましょう。

Godot4 ビッグカツブロック崩し ボールのシーンの作成4

当たり判定領域のノードの追加

Ball ルートノードの下位に CollisionShape2D クラスのノードを追加します。
※ Ball ルートノードを右クリックして表示されるメニュー「子ノードを追加」を選択してから CollisionShape2D クラスを選択して作成します。

そのノードをインスペクタードックで表示して、Shape プロパティのリストで円の形の領域を定義するために「新規 CircleShape2D」を選択します。

2D ワークスペースに小さな半透明の水色の円が表示されるので、オレンジ色の丸いハンドルをマウスドラッグして画像と同じ大きさになるように円の大きさを調整します。

Godot4 ビッグカツブロック崩し ボールのシーンの作成4

スクリプトの作成

シーンドックで、Ball ルートノードCharacterBody2D クラス )を選択してから、右上の+のアイコンのついた「選択したノードに新規または既存のスクリプトをアタッチする。」ボタンを押します。

Godot4 ビッグカツブロック崩し ボールのシーンの作成6

パスのファイルパスを指定して「作成」ボタンを押します。
※例ではデフォルトの ball.gd で作成します。

Godot4 ビッグカツブロック崩し ボールのシーンの作成7

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

ステージシーンの子ノードとしてボールシーンを追加

前回、左右に移動するパドルシーンを壁などを配置したステージシーンに子ノードとして追加しました。
それと同様に作成したボールシーンを、ステージシーンに子ノードとして追加します。

先ほど保存したボールシーンのファイル (ball.tscn) をシステムファイルドックから、Stage シーンのタブを選択している状態で、シーンドックの Stage ルートノードドラッグ&ドロップすることで、ボールシーンをステージシーンに子ノードとして追加できます。

Godot4 ビッグカツブロック崩し ボールのシーンの作成9

ボールがステージの他のものと比べて大きかったので、シーンドックで追加された Ball ノード選択してから、インスペクタードックの Node2D クラスの Scale プロパティの x, y を 1 から 0.2 に変更して5分の1にサイズを縮小します。

その後、 2D ワークスペースボールを移動ツールなどでマウスドラッグしてパドルの上側に配置します。

Godot4 ビッグカツブロック崩し ボールのシーンの作成10

これで、ボールシーンを作成して、ステージシーンに配置できました。

次回、さらに当たり判定の Collision Layer, Mask の設定をすることで、ボールがパドルにぶつかった際に、パドルはボールの衝突の影響を受けずボールは衝突を検知して向きを変える以下の動画のような動きを実現します。

まとめ

「ビッグカツブロック崩し」作成の第7回では、前回までに作成した左側・上側・右側のパドル(バー)を配置したステージのシーンに追加する、壁やパドルにぶつかると向きを変えて移動しつづけるボールの画像設定と当たり判定領域の設定、スクリプト例を紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました