【Godot】2Dトップビューゲームでジャンプ【Z-axis Jump】
Godot 3.2.3
ググってもGodotでの実装方法が見つからない!ということで他のゲームエンジンでの実装を参考にしました。
こちらの動画はGodotではなくGameMaker Studio2 を用いたものですが、これと同じ考え方でGodotでも実装できたのでさっそく作っていきましょう。
やること
仮想のZ軸を変数で作る
Z座標の値をキャラのY座標に足したり引いたりして、見かけ上ジャンプしているように動かす
Area2Dを使ってプレイヤーキャラを作成
Area2D:プレイヤー用のArea2Dノード
Shadow:プレイヤーの影。ジャンプしてるか判別しやすくするために用意
Player:プレイヤーの画像。プロジェクトを作ったら入ってるicon.png
CollisionShape2D:プレイヤーの当たり判定
X軸Y軸の移動
まずは上下左右に動き回れるようにします。
Area2DノードにGDScriptをアタッチして、下記の通り記述
extends Area2D
# プレイヤーの移動速度
var speed = 100.0
func _process(delta):
# 矢印キーで移動
var direction = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
direction.x += 1
if Input.is_action_pressed("ui_left"):
direction.x -= 1
if Input.is_action_pressed("ui_up"):
direction.y -= 1
if Input.is_action_pressed("ui_down"):
direction.y += 1
# 斜め移動の時の速度が上下左右の時より速くならないようにする
if direction.length() > 1:
direction = direction.normalized()
# 移動する処理
position += direction * speed * delta
# 影の位置を調整
$Shadow.global_position.y = global_position.y + 40
動き回りながらもいまだ大地に縛られるgodotくん
Z軸の移動(ジャンプ)
平面移動ができたらいよいよジャンプの挙動を実装です。
スクリプトに「# z軸ジャンプ用の変数」と「# スペースキーを押してジャンプ状態になる」以下を追記
extends Area2D
# プレイヤーの移動速度
var speed = 100.0
# z軸ジャンプ用の変数
var z = 0 # 最終的にY座標に足し引きする値、Z座標(高さ)
var z_floor = 0 # Z座標の0地点(地面の高さ)
var z_speed = 4 # ジャンプ上昇時の勢い
var z_grav = 0 # ジャンプ下降時の勢い
var grav_rate = 0.25 # ジャンプ下降時の勢いに加算する値
var jump = false # ジャンプ状態かどうか判定するbool値
func _process(delta):
# キーボードの矢印キーで移動
var direction = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
direction.x += 1
if Input.is_action_pressed("ui_left"):
direction.x -= 1
if Input.is_action_pressed("ui_up"):
direction.y -= 1
if Input.is_action_pressed("ui_down"):
direction.y += 1
# 斜め移動の速度が上下左右のときと同じになるようにする
if direction.length() > 1:
direction = direction.normalized()
# 移動する処理
position += direction * speed * delta
# 影の位置を調整
$Shadow.global_position.y = global_position.y + 40
# スペースキーを押してジャンプ状態になる
if Input.is_action_just_pressed("ui_select"):
if z <= z_floor:
jump = true
# ジャンプ状態である間、Z座標にz_speedの値を加算
if jump == true:
z += z_speed
# Z座標が地面の高さより大きい(空中にいる)場合は少しずつ下降する力が増えていく
if z >= z_floor:
z -= z_grav
z_grav = z_grav + grav_rate
# Z座標が地面の高さより小さい(地上にいる)場合はジャンプ状態を終了する
if z <= z_floor + 1:
z = z_floor
z_grav = 0
jump = false
# ジャンプに合わせてプレイヤーの画像と当たり判定を動かす
$Player.global_position.y = global_position.y - z
$CollisionShape2D.global_position.y = global_position.y - z
5分後、そこには元気に跳ね回るgodotくんの姿が!
動画のように段差があったりするともっと複雑になりそうですが、ひとまず平らな地面でのジャンプの実装でした。
この記事が気に入ったらサポートをしてみませんか?