Mario風カメラの考察
通常、プレイヤーノードに「Camera2D」ノードを追加すれば、簡単にカメラがプレイヤーを追従してくれるが、マリオの場合はちょつと違うことに気がついた。いろいろ調べて見るっと下記の様になっているみたいだ。ホントのゲームをやったことがないので壁にぶつかった。
Mario風カメラの動き
プレイヤーが右に移動しているときに、左側に少し余裕を持たせて、プレイヤーを画面のほぼ中央に配置。 プレイヤーが左に動き始めるとカメラの動きが止まる。 カメラは、プレーヤーが画面の中央付近まで右に移動したときにのみ動き始めます。 カメラの左側に見えない壁があるようだ。 またカメラの左側端に来た時それ以上右に移動出来ない仕組みになっている。
Mario風カメラの方法
- マリオが中央付近に来た時、カメラを追従させる。正確にはマリオのX位置がカメラのX位置より大きくなった時点で、マリオのX位置をカメラのX位置に代入する。(カメラがマリオを追従)
- 一旦マリオを停止させ左側に移動すると、マリオのX位置がカメラのX位置より小さくなる。(カメラがマリオを追従しない)
- マリオが左側に移動し、画面の左端に来たら左への移動ができない様にする。(Vector.ZERO)
この方法は、ネットで調べまくった結果だ。最近「Godot」関連の情報が増えてきて助かる。感謝!
カメラノードの追加
「Level11」ノードの下に「Camera2D」ノードを追加する。
「インスペクター」>Enabled→ONを確認、Zoom→x=3,y=3に変更(ビューポート内の画像が小さすぎるので)
カメラ位置の変更
カメラの表示範囲は元々のビューポート1152☓648→384☓216に自動的に変更となっている。(Zoom3倍した結果)
カメラノードの追加と配置の調整
まずは、「Level11」ノードに「Camera2D」ノードを追加する。
インスペクターの「Camera2D」>「Enabled」がONになっていることを確認する。ONになっていない状態ではカメラ機能が動作しないので要注意。
初期カメラの位置を調整。「Node2D」>「Transform」>「Position」
カメラの右端がPosiion = 0、上部画像がかけない範囲に配置。
カメラスクリプトの追加
Godot4.0より、@export_node_path
が使用できるようになったので「Player.gd」に「Camera2D」を追加する。そしてカメラ同期をするかどうかの符号を追加する。
インスペクターの「Camera Sync」が割当となっているのでクリックする。
下記のように「ノード選択」で「Camera2d」選択する。
最終的には、下記のようになれば大丈夫。
カメラ追従のスクリプト
マリオの特徴である「マリオが画面中央付近に移動するとカメラが追従し、その後左に移動すると追従しない」スクリプトの追加。この場合は、厳密に1/60秒で動作しなくても良いのでfunc _process関数を使用する。また引数deltaを使用しないのでエラーが発生する。よって戦闘にアンダースコア(_delta)を付けることを忘れずに!またカメラは「Y軸」方向には追従しないので調整して固定値とする。要するにマリオposition.xが画面中央のカメラposition.xより大きくなれば追従する仕組みだ。当然のごとく左に移動すれば追従しない。
マリオが画面左端に来た時、移動できないスクリプト
画面左端のX座標の計算(camera_left_bound)今度は、func _physics_process内に記述する。
この計算は勘違いしやすいので、説明しよう。
画面サイズはカメラZoomサイズが「3倍」なので1152/3☓648/3、すなわち384☓216となっている。画面中央の画面position.xは384/2=191でカメラのposition.xも191となる。よって最初の段階では、camera_left_bound=0だ。仮にマリオが右の移動、カメラが追従しカメラposition.xが201と成った場合、camera_left_bound=10,すなわち画面右端のposition.x=10となる。これで左端の座標が計算できる。
では、移動できなくするスクリプトは下記の通り。マリオのposition.xが画面左端(正確にはマリオの画像幅が16ドットなのでcamera_left_bound+8)より左にきたら、マリオの移動ベクトルを0とします。&&で左へ移動中sign(velosity.x)は1,0,-1を返すプロパティです。camera_left_bound+αのαを変えることで左側への移動制限を変えることが出来る。
カメラ追従(中央より先で)
カメラ追従は、例えば下の動画のごとく中央の先で行おこともいと簡単の出来る。
方法は「インスペクター」>「Camera2D」>「Drag」>「Horizontal Enabled」ONにする。中央の先の距離は「Right Margin」の値で変更できる。例えば「Right Margin」= 1にした場合はマリオが右端に来た時追従する。ゲームの内容で色々と変更できるので便利。Godotの進化に驚く限り!
コメント