2016-07-08 9 views
3

「落ちるオブジェクトをキャッチする」という単純なゲームに取り組んでいます。デスクトップデバイスでは、ゲームはきれいでスムーズに動作しています。左右のキーを押すと、「スペースロケット」(ゲームを見るために次のリンクを使用)がx軸上を滑らかに動きます。モバイルデバイスでは、小さな問題を抱えています。「スペースロケット」の左側または右側を押すと、うまく動いています。しかし、「ロケット」を長押しすると、画面上を押し続ける方向に動くことはありません。あなたが手を離すと、ロケットがある位置から他の位置に「飛び」、デスクトップ上と同じように滑らかな動きをしていないことがわかります。私は、次のコードをしましたが、誰もがよりよい解決策を提案することができ、適切キャンバス上のオブジェクトをモバイルデバイス上でスムーズに左右にx軸に移動する方法

UPDATE 2

var mc = new Hammer(htmlCanvas); 
mc.add(new Hammer.Press({ event: 'press', time:1 })); 
mc.on("press", function(ev) { 
    console.log("dsaDS"); 
    touchDown = true; 
setInterval(function(){ 
    while(touchDown) { 
     console.log("down"); 
      if (ev.center.x < player.x) 
      { 
       player.x -= Math.floor(CANVAS_WIDTH/player.width); 
      } 
      else 
      { 
       player.x += Math.floor(CANVAS_WIDTH/player.width); 
      } 

      if (ev.center.x == player.x) 
      { 
       touchDown = false; 
      } 

    } }, 1000); 
}); 

mc.on("pressup", function(ev) { 
    touchDown = false; 
    console.log("up"); 
}); 

が動作していませんか?ここではゲーム Gameのリンクがあり、ここで私のゲームの完全なコードcode

UPDATE 1である:私はそのように変更されています。それは、任意のデバイス、iOSとAndroidの

UPDATE 2で作業していませんが私は、@ Me.Nameの助けを借りて、画面

+0

これはよく書か質問ですが、まだそこにあるあるソリューションに付属しています詳細がない。どの携帯端末ですか? IOS?アンドロイド?どのバージョン?どのブラウザですか? –

+1

何も推測に基づいて、私は問題が 'while(touchdown)'だと思って、特定のスレッド(またはデバイスに実装されている)をビジー状態にしすぎて画面を更新しません。あなたは 'setInterval'(小さな間隔で)に移動を置くことができますか?それはタッチダウンで開始され、タッチアップで停止しましたか? –

+1

イベントハンドラー内でゲームロジックを行うべきではありません。 IOイベントハンドラはIOイベントを登録するためのもので、イベントは任意の速度と量で入力できます(タッチイベントは巨大な速度で入力され、プレーヤーがジャンプします)。タッチがダウンしていること、そしてメインループでその情報を使用してプレーヤーを更新する場所にフラグを立てれば、プレーヤーの移動方法とタイミングを制御できます。あなたがイベントを見逃しても問題はありません – Blindman67

答えて

0

にプレスを検出することだし、Blindman67 @私は次の

function move(touchDown) 
{ 
    if(touchDown) 
    { 
     touchMoves = setTimeout(function(){ 
      if (Math.floor(touchX) < Math.floor(player.x + player.width)) 
      { 
       if ((Math.floor(player.x + player.width) - Math.floor(touchX)) <= 10) 
       { 
        touchDown = false; 
        clearTimeout(touchMoves); 
       } 
       else 
       { 
        player.x -= Math.floor(CANVAS_WIDTH/player.width); 
       } 

      } 
      else if ((Math.floor(touchX) == Math.floor(player.x + player.width)) || (player.x == (CANVAS_WIDTH - player.width))) 
      { 

       touchDown = false; 
       clearTimeout(touchMoves); 
      } 
      else 
      { 
       if ((Math.floor(touchX) - Math.floor(player.x + player.width)) <= 10) 
       { 
        touchDown = false; 
        clearTimeout(touchMoves); 
       } 
       else 
       { 
        player.x += Math.floor(CANVAS_WIDTH/player.width); 
       } 
      } 

      if (touchDown) 
      { 
       move(touchDown); 
      } 

     }, 100); 
    } 
} 
mc.on("press", function(ev) { 
    if (gameIsActive) 
    { 
     touchDown = true; 
     touchX = ev.center.x; 
     move(touchDown); 
    } 

}); 

mc.on("pressup", function(ev) { 
    if (gameIsActive) 
    { 
     touchDown = false; 
    } 
}); 
関連する問題