見出し画像

【Godot】2Dトップビューゲームでジャンプ【Z-axis Jump】

Godot 3.2.3

ググってもGodotでの実装方法が見つからない!ということで他のゲームエンジンでの実装を参考にしました。

こちらの動画はGodotではなくGameMaker Studio2 を用いたものですが、これと同じ考え方でGodotでも実装できたのでさっそく作っていきましょう。

やること
仮想のZ軸を変数で作る
Z座標の値をキャラのY座標に足したり引いたりして、見かけ上ジャンプしているように動かす

Area2Dを使ってプレイヤーキャラを作成

画像1

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

画像2

動き回りながらもいまだ大地に縛られる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  

画像3

5分後、そこには元気に跳ね回るgodotくんの姿が!

動画のように段差があったりするともっと複雑になりそうですが、ひとまず平らな地面でのジャンプの実装でした。

この記事が気に入ったらサポートをしてみませんか?