投稿記事

2024年 07月の記事 (2)

生焼け烏肉 2024/07/23 12:09

【Godotで作ろう脱衣ブロック崩し】第4回:パドルを作ろう

このたびは、Godot Engineチュートリアル記事「Godotで作ろう脱衣ブロック崩し」にアクセスいただき、ありがとうございます。
目次はこちらです。

今回は、プレイヤーの操作を受けるパドルを作りましょう。

4.パドルの作成

4.1:パドルシーンのノード構成

前回までの作業を終えたプロジェクトを開き、新規シーンを作成します。
このシーンのルートノードはCharacterBody2Dに設定し、その子ノードとしてCollisionShape2DとSprite2Dを配置します。

4.2:各ノードの設定

CollisionShape2DのインスペクターからShapeをCapsuleShape2Dに設定します。

CapsuleShape2DのRadiusを17px、Heightを180px、そこから少し下のNode2D -> TransformのRotationを90度に設定しましょう。

Sprite2DのインスペクターからTextureをpaddleフォルダ内のpaddle.svgに設定します。

CharacterBody2DのインスペクターからCollisionObject2D -> CollisionのLayerを2番のみ、Maskを1番と3番のみに設定します。

それで、CharacterBody2Dの名前を"paddle"に書き換えて、このシーンを"paddle.tscn"という名前でpaddleフォルダ内に保存してください。

4.3:スクリプトのアタッチおよび新規作成

paddleノードにスクリプトを新規でアタッチして、以下のように記述します。

#このクラスはCharacterBody2Dを継承している
extends CharacterBody2D
#このクラスに名前はない

#speed:マウスカーソルへの追従度
@export var speed = 20.0
#minimum_distance:追従する最小距離
@export var minimum_distance = 8.0

func _physics_process(delta):
	#hook:追従すべきマウスカーソルのx座標
	var hook = get_viewport().get_mouse_position().x
	#distance:現在の位置と追従先の距離
	var distance = hook - position.x
	#距離が最小未満だったらブレーキをかける
	if abs(distance) < minimum_distance:
		velocity.x = move_toward(distance, 0.0, speed)
	#距離が最小以上だったら距離に比例した速度を設定する
	else:
		velocity.x = distance * speed
	#y座標は動かさない
	velocity.y = 0.0
	#当たり判定をしつつ所定の速度で動かす
	move_and_collide(velocity * delta)

おわりに

今回の作業はここまでです。お疲れさまでした。
次回の更新は、早くて8月中旬、遅くとも8月下旬には公開する予定です。
お楽しみにお待ちください。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

生焼け烏肉 2024/07/06 08:06

【Godotで作ろう脱衣ブロック崩し】第3回:ボールを作ろう

このたびは、Godot Engineチュートリアル記事「Godotで作ろう脱衣ブロック崩し」にアクセスいただき、ありがとうございます。
目次はこちらです。
今回は、ボールを作りましょう。

3:ボールの作成

3.1:ボールシーンのノード構成

プロジェクトを開いたら、新規シーンを作成して、ルートノードとして"CharacterBody2D"を設定しましょう。

その子ノードとして、CollisionShape2DとSprite2D、2つのノードを追加します。
ここまで終わったら、シーンのノード構造はこうなるはずです。

3.2:各ノードの設定

CollisionShape2DノードのインスペクターからShapeの項目を"新規 CircleShape2D"に設定します。

作成されたCircleShape2Dを選択すると、設定項目がいくつか出てくるので、その中の"Radius"を8pxに設定してください。

次に、Sprite2DノードのインスペクターからTextureを設定し、ballフォルダの中のball.svgを指定してください。

それで、CharacterBody2Dノードのインスペクターからコリジョンレイヤーとマスクを
下図のように、レイヤーは1番のみ、マスクは2,3,4番の3つのみをオンにしてください。

CharacterBody2Dノードの名前を"ball"に書き替えて、このシーンを"ball.tscn"という名前でballフォルダの中に保存してください。

3.3:スクリプトのアタッチおよび新規作成

ballノードにスクリプトをアタッチします。

ballノードを選択した状態で、シーンのノードツリーの右上くらいにある書類のようなアイコンをクリックしてください。

すると、このような画面が開きます。

"テンプレート"の項目を"Node: Default"に変更して、"作成"ボタンを押します。

3.4:スクリプトの入力・編集

スクリプトを新規にアタッチすると、画面がテキストエディタのようなものに切り替わり、スクリプトを編集できます。
これを、以下のように書き換え・追記します。
ちなみに、#記号が頭にある行はコメントであり、プログラムの動作に影響を与えません。

# このクラスはCharacterBody2Dを継承している
extends CharacterBody2D
# このクラスはBallという名前
class_name Ball

# 必要なプロパティの定義
# initial_velocity:ボールの移動速度の初期値
var initial_velocity = Vector2(250.0, -250.0)
# hold:この値がtrueのとき、ボールは移動しない
var hold = true

# このメソッドはほぼ毎フレーム呼び出される
# ここに物理演算に関する処理を書く
func _physics_process(delta):
	# holdがtrueならば、速度を0にする
	if hold:
		velocity = Vector2.ZERO
		# なおかつマウスの左ボタンが押されていたらholdをfalseにして速度を初期化する
		if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT):
			hold = false
			velocity = initial_velocity
	# 移動して当たり判定をチェック
	var collision_info = move_and_collide(velocity * delta)
	# 何かに当たったら跳ね返る
	if collision_info and not hold:
		velocity = velocity.bounce(collision_info.get_normal())
		# 当たった相手が何者なのかを調べる
		var collider = collision_info.get_collider()
		# 当たった相手がhitメソッドを持っていた場合、それを呼び出す
		if collider.has_method("hit"):
			collider.call_deferred("hit")

スクリプトをこのように記述して、ball.gdを保存します。

お疲れ様です。今回の記事で解説する作業はここまでです。

おわりに

次回の更新は、早くて7月中旬、遅くても7月末を予定しています。
お楽しみにお待ちください。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

限定特典から探す

記事を検索