2013/02/25

ミッション01:自機を自由に動けるようにしてみんとす!

ついに奴らがやってきた……! ということで、毎年のことながら杉花粉の猛威に今から戦々恐々のpon_zuです。 既に鼻がムズムズし始めてるので今日はマスク着用での執筆です。

前回の記事で宣言したとおり、今回からenchant.jsを使った新連載「シューティングゲームを育成してみんとす!」を開始します。



記念すべき第1回のテーマは、「自機を自由に動けるようにしてみんとす!」です。




ステップ0:自機の動きを見てみんとす!

前回のコードを動かすと、こんな感じになります。
動かしてみれば分かりますが、自機はクリック/タッチ位置に追従して上下方向にのみ移動できます。



どんなに頑張っても左右方向に移動することはできません。
今回はこの自機を上下左右自由に移動できるようにしてみましょう。

ステップ1:自機を左右方向に移動できるようにしてみんとす!

自機を左右方向に移動できるようにするにはどこをいじればいいのでしょうか?
こんな感じに直してみました。



コード差分はこれだけです。
game.rootScene.addEventListener('touchstart', function (e) {
-            player.y = e.y;
+            player.x = e.x - player.width/2;
+            player.y = e.y - player.height/2;
             game.touched = true;
         });
         game.rootScene.addEventListener('touchmove', function (e) {
-            player.y = e.y;
+            player.x = e.x - player.width/2;
+            player.y = e.y - player.height/2;
         });
         game.rootScene.addEventListener('touchend', function (e) {
-            player.y = e.y;
+            player.x = e.x - player.width/2;
+            player.y = e.y - player.height/2;
             game.touched = false;
         });
タッチ/クリック開始時、スワイプ/ドラッグ時、タッチ/クリック終了時に処理する処理を書き換えて、タッチ位置をplayerインスタンスの位置に代入しています。
playerの幅や高さの半分を引き算しているのは自機の表示位置の調整のためです。
このコードを動かすとこんな感じになります。
狙ったとおり、自由に上下左右に動けるようにはなったのですが、このままでは以下のような問題が残っています。
  • タッチ/クリック開始時に自機がタッチ/クリック位置に瞬間移動してしまう。
  • スマートフォンでプレイする際に指で自機が隠れてしまう。
これらの問題を解決するために、もうちょっとコードをいじってみましょう。

ステップ2:自機をスワイプ/ドラッグ距離に応じて相対移動するようにしてみんとす!

先ほど挙げた問題を解決する方法として、自機をスワイプ/ドラッグ距離に応じて相対移動するように変更してみます。

こんな感じに直してみました。

コード差分はこれだけです。
@@ -150,6 +151,18 @@ var Player = enchant.Class.create(enchant.Sprite, {
         this.frame = 0;
 
         /**
+         * タッチした位置からドラッグした距離で相対移動するための変数を追加
+         * - "xs" : タッチ開始時の自機のX座標
+         * - "ys" : タッチ開始時の自機のY座標
+         * - "xts" : タッチ開始位置のX座標
+         * - "yts" : タッチ開始位置のY座標
+         */
+        var xs = x;
+        var ys = y;
+        var xts = 0;
+        var yts = 0;
+

...

@@ -179,22 +192,30 @@ var Player = enchant.Class.create(enchant.Sprite, {
          * EventTarget#dispatchEvent で任意のイベントを発行することもできる。
          *
          * ここでは、以下のような処理を登録してしている
-         *    画面がクリックされたとき … 自機をその座標に移動させ、弾を撃ちはじめる
-         *    クリックしている座標が動いたとき … 自機をその座標に移動させる
-         *    クリックが離されたとき … 自機をその座標に移動させ、弾を撃つのをやめる
+         *    画面がクリックされたとき … 移動目標を初期化し、弾を撃ちはじめる
+         *    クリックしている座標が動いたとき … ドラッグした距離に応じて自機を相対的に移動させる
+         *    クリックが離されたとき … 移動目標を初期化し、弾を撃つのをやめる
          */
         game.rootScene.addEventListener('touchstart', function (e) {
-            player.x = e.x - player.width/2;
-            player.y = e.y - player.height/2;
+            player.xs = player.x;
+            player.ys = player.y;
+            player.xts = e.x;
+            player.yts = e.y;
             game.touched = true;
         });
         game.rootScene.addEventListener('touchmove', function (e) {
-            player.x = e.x - player.width/2;
-            player.y = e.y - player.height/2;
+
+            var xNew = player.xs + (e.x - player.xts);
+            var yNew = player.ys + (e.y - player.yts);
+
+            if(xNew > 0 && (xNew + player.width) < game.width){
+                player.x = xNew;
+            }
+            if(yNew > 0 && (yNew + player.height) < game.height){
+                player.y = yNew;
+            }
         });
         game.rootScene.addEventListener('touchend', function (e) {
-            player.x = e.x - player.width/2;
-            player.y = e.y - player.height/2;
             game.touched = false;
         });

タッチ/クリック時に自機の座標とタッチ/クリックされた位置を記録しておき、スワイプ/ドラッグされた距離に応じて自機を相対的に移動させています。 ついでに画面端まで行ったら移動できないように移動制限もかけています。 この操作方法だと、スマートフォンでプレイする場合もタッチする位置を変えることで指の影に自機がかぶってしまうこともなくなります。 動かすとこんな感じです。
さて、今回はここまでです! 今回の改造で自機が自由に動くようになりました。 次回は何を改造しましょうね?

0 comments:

コメントを投稿