最適な方法か自信がありませんが、一応想定通りの動きをしてくれたものです。
背景のスクロールループ
背景素材をスクリプトでループさせるのが一番簡単そう。
Spriteに背景素材を設定、インスペクタ―タブのOffset→Centeredのチェックを外すと原点が左上になりループさせやすくなります。
背景素材
Spriteにスクリプトをアタッチして移動とループの設定。
func _process(delta: float) -> void: position.y += 0.25 #背景画像が特定位置まで移動したら画面外の上に移動する if position.y >= 256: position.y = -256
画面内に画像1、画面外の上に画像2を配置する。
画像1と画像2が画面下に移動、画像1が画面外に消えると画像2の場所に移動…を繰り返す。
※背景画像は画面サイズよりも少し大きめの物を用意した方が良いかもしれません。
完成画像がこちら
ParallaxLayerは縦方向に使える?
結論から言うと使えました。
縦方向に言及している記事が見当たらなかったため使用できるのか気になっていました。
ノードParallaxBackgroundを作り、その子としてParallaxLayerを作る。
ParallaxLayerの子にスクロールさせたい画像素材をノードにする、SpriteのほかにTileMap等も使用できるようです。
次にParallaxLayerのMotionからMirroringを設定、自身のループさせたい方向の画面サイズを入力、今回はY方向に画面サイズ256を入力した。
更にMotionのScaleを画像1はY0.25、画像2でY0.5に設定、Scaleの数値が0に近づくほどスクロールが遅くなるのでより遠くにある背景を演出できる。
非常に単純だけどParallaxLayerが縦方向にも使える事が分かり個人的に満足。
背景をキャラの動きと合わせたい場合は非常に便利です。
FCマリオ風のステージを進むと戻れないギミック
ファミコンのマリオブラザーズの様に先に進むと戻れないギミックを無理やり再現。
下の画像は先に進んでもステージを戻る事ができる状態です
理屈は更新される画面端の座標を記憶させ、そこをストッパーとして使う事だと思う。
結果思いついた方法
#Position2D var pos = Vector2() func _process(delta: float) -> void: #プレイヤーの座標から画面半分引いた位置で固定される global_position.x = get_parent().position.x - 256 #変数posより座標が大きい場合ポジションを保存する if pos.x <= global_position.x: pos = global_position #スタート時の画面端のストッパー if global_position.x <= 0: global_position.x = 0 #posは先に進んだ座標を更新し続けるのでその位置がストッパーになる elif global_position.x <= pos.x: global_position.x = pos.x
上で取得した座標をカメラとプレイヤーに覚えさせる
#Camera2D #カメラのlimitに座標を覚えさせる func _process(_delta: float) -> void: limit_left = get_parent().get_node("Position2D").pos.x
#player #playerの子ノードの変数posを読み込むことができる var player_stop = $Position2D.pos.x if position.x <= 0: position.x = 0 #posを使う事でプレイヤーも左側へ戻れなくなる if position.x <= player_stop: position.x = player_stop
カメラもプレイヤーも先に進んだ後戻れなくなりました
でも画面端を取得したりもっとスマートな方法がある気がする…
物体を左右に往復させる
到達地点で方向切り替えればいいだろうと思いきやそれだけではダメだった。
var player_return = false var direction := 1 func _process(delta: float) -> void: position.x += 1 * direction if position.x < 480 and player_return == false: direction = 1 elif position.x == 480: player_return = true if position.x > 32 and player_return: direction = -1 elif position.x == 32: player_return = false
directionを「1と-1」で切り替えてかける事で移動する方向が切り替わります。
またplayer_returnの往復スイッチが無いと、上のコードを例にした場合position.xの480と479の場所を往復してしまう。
上手く行けば下のように往復させる事ができました