0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

enchant.jsのキー入力「離したとき」を認識したい

Last updated at Posted at 2019-06-29

なぜクマは連続ジャンプするの?

「クマをクリック(タップ)」または「上矢印のをキーを入力」でクマが1回ジャンプするようにしたいのに、クリックの時はうまくいくのに、キー入力では4,5回連続ジャンプしてしまいます。

code9leapのサンプルプロジェクト(Chromeで実行してください)
http://code.9leap.net/codes/show/164401

enchant.jsで「キーを離したとき」イベントが認識できない

enchant.jsは「キーを押したとき」はgame.inputをチェックすることで認識できます。
ただこの方法の問題は、1秒間に数十回「押してるかどうか」判定が行われるため、ユーザーは一回キーを押しただけのつもりでも、連打したことになってしまいます。

「キーを離したとき」のイベントを使いたい

クリック(またはタップ)については、「離したとき」イベントが取得できるため、こういった問題は起きません。


     // クマをクリック
     kuma.addEventListener('touchend',function(e){
         kuma.tl.moveBy(0,-120,12).tl.moveBy(0,120,12);
     });

そこで、「キーを離したとき」のタイミングで処理を行いたいのですが、enchant.jsではこの「キーを離したとき」のイベントを取得する方法が実装されていないようなので、今回はJavaScriptのonkeyupイベントを使った方法をテストしました。

今回はシンプルにテストするために、キーは上矢印しか使われない前提です。
どのキーが押されたか(離されたか)を管理することで、より複雑な操作にも対応できると思います。


// キー入力対策
window.focus();

// グローバル変数
// ① 変数gameをグローバル化 ここでnewはできないので注意
var game;

// ② enchant.jsで定義されてないキー入力処理を追加する。
document.onkeyup = function (e) {
    game.keyflg = false;    // gameオブジェクトにオリジナルのメンバ変数keyflgを追加
    console.log("keyup!!"); // キーが離された確認用console.log
    return true;
};

// enchant.jsを利用するときには必ず最初に書く
enchant();

// ページが読み込まれたときに実行される処理
window.onload = function()
{
    /*var */game = new Game(320, 320);  // ③ varを消す
    game.keyflg = false;    // ④初期値をtrueにするとキー入力の一回目に反応しない
        
    game.fps = 15;
    game.preload('bg1.png','bg2.png','chara1.png');
    
    // ゲームの処理
    game.onload = function()
    {
        // 背景用の画像を表示する
        var bgA = new Sprite(320,320);
        bgA.image = game.assets['bg1.png'];
        game.rootScene.addChild(bgA);
        
        var kuma=new Sprite(32,32);
        kuma.image=game.assets['chara1.png'];
        kuma.frame=1;
        kuma.x=60;
        kuma.y=230;
        game.rootScene.addChild(kuma);
        

        // 定期処理 背景スクロール
        game.rootScene.addEventListener('enterframe', function()
        {    
            if(game.input.right)
            {
               kuma.x+=2;
            }
            if(game.input.left)
            {
               kuma.x-=2;
            }
            if(game.input.up)
            {
                // ⑤上向き矢印が入力されかつgame.keyflgがfalseのとき
                if(!game.keyflg)
                {
                   kuma.tl.moveBy(0,-120,12).moveBy(0,120,12);
                   // ⑥game.keyflgをtrueに戻しておく
                   game.keyflg = true;
                }
            }
        });
        
        // クマをクリック
        kuma.addEventListener('touchend',function(e){
            kuma.tl.moveBy(0,-120,12).moveBy(0,120,12);
        });
    };
        
    // ゲームの処理をスタート
    game.start();
  
};

code9leapのサンプルプロジェクト(Chromeで実行してください)
http://code.9leap.net/codes/show/164402

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?