Jumpの実装
2D Scene
Playerの挙動を実装する際に、
足場
壁
天井
などのオブジェクトが必要になるかもしれない
そういうときは、直接Player sceneにオブジェクトを作らずに、
2DScene
Player.tscn
Platform.tscn
というふうに、上位のsceneを作ってその中で実装したほうがいい
新規シーンの作り方
sceneは、ビューのタブで切り替えられる
+ボタン
scene > new Scene
StaticBody2Dで足場を作る
1. StaticBody2Dをシーンに追加
2. 子要素に CollisionShape2Dを追加
shape > rectangleを選択
クリックすると、Extent (幅)などの大きさが指定できる
ピクセル単位。128x128pxの画像を囲むには、x=64, y=64にする(半径)
3. Spriteを追加
https://gyazo.com/3f4746c098ead54401c8f1f1a57342cd
デフォルトの起動シーンを変更する
編集中のシーン(選択されているタブ)を起動
cmd + R
右上の 映画フィルム + 再生マーク
カスタムシーン(全シーンから1つ選ぶ)を起動
shift + cmd + R
右上の 映画フィルム + フォルダマーク
デフォルトシーンを再生
cmd + B
プロジェクトセッティング > Application > Run > Main Scene で変えられる
ジャンプを実装
is_on_floor()
KinematicBody2Dのメソッド
自分のshapeの下のほうがなにかに接しているかをboolで返す。
code: python
extends KinematicBody2D
const SPEED = 500
const JUMP_SPEED = 3000
const GRAVITY = 500
const UP = Vector2(0, -1) # 下方向が正
var motion = Vector2(0, 0)
# Inputはグローバルなシングルトンオブジェクトで、どのスクリプトからもアクセスできる
func _physics_process(delta):
apply_gravity()
jump()
move()
move_and_slide(motion, UP)
func apply_gravity():
if is_on_floor():
motion.y = 0
else:
motion.y += GRAVITY
func move():
if Input.is_action_pressed("left") and not Input.is_action_pressed("right"):
motion.x = -SPEED
elif Input.is_action_pressed("right") and not Input.is_action_pressed("left"):
motion.x = SPEED
else:
# 滑る動き
motion.x *= 0
func jump():
if Input.is_action_just_pressed("jump") and is_on_floor():
motion.y -= JUMP_SPEED
apply_gravity()
jump()
move()
など、物体になにか力を適用したり、速さを操作する処理は関数にまとめると良い