4

Three.jsでゲームを作成していますが、ユーザー入力を取得する必要があります。2つのハンドラー関数があります。

function press(evt) 
{
    console.log(evt);

    //evt = window.event;
    var code = evt.which || evt.keyCode;

    switch(code) 
    {
        case KEY.W: input.up = true; break;
        case KEY.A: input.left = true; break;
        case KEY.S: input.down = true; break;
        case KEY.D: input.right = true; break;
        case KEY.E: input.e = true; break;
        case KEY.Z: input.z = true; break;
        case KEY.ONE: input.one = true; break;
        case KEY.CTRL: input.ctrl = true; break;
        case KEY.P: input.plus = true; break;
        case KEY.M: input.minus = true; break;
        case KEY.SH: input.shift = true; break;
    }
}

function release(evt)
{
    console.log(evt);

    //evt = window.event;
    var code = evt.which || evt.keyCode;

    switch(code) 
    {
        case KEY.W: input.up = false; break;
        case KEY.A: input.left = false; break;
        case KEY.S: input.down = false; break;
        case KEY.D: input.right = false; break;        
        case KEY.E: input.e = false; break;
        case KEY.Z: input.z = false; break;
        case KEY.ONE: input.one = false; break;
        case KEY.CTRL: input.ctrl = false; break;
        case KEY.P: input.plus = false; break;
        case KEY.M: input.minus = false; break;
        case KEY.SH: input.shift = false; break;
    }
}

どちらも他のプロジェクトで使用していますが、問題なく動作します。これは私がイベントリスナーをアタッチする方法です:

document.addEventListener("keydown", press, false);
document.addEventListener("keyup", release, false);

これは、サイトが通常ロードされている場合は機能しますが、サイトが全画面表示になる場合は機能しません。

これは、init()でのwhileセットアップです。onloadボディイベントで呼び出される関数:

        var init = function()
        {
            started = false;
            isFullscreen = false;

            changeFSState = function()
            {
                if (isFullscreen == true)
                {
                    isFullscreen = false;

                    game.stop(); //lol
                }
                else
                {
                    isFullscreen = true;
                }
            }

            container = document.getElementById("container");
            document.body.appendChild(container);

            document.addEventListener("keydown", press, false);
            document.addEventListener("keyup", release, false);

            document.addEventListener("webkitfullscreenchange", changeFSState, false);
            document.addEventListener("mozfullscreenchange", changeFSState, false);

            game = new Game(container);
        }

playボタンがクリックされると、これが発生します。

    THREEx.FullScreen.request(self.container);  
    self.renderer.setSize(screen.width, screen.height);

さて、私が言ったように、playボタン(実際にはリンク)をクリックするまで入力のキャッチは機能し、その後、コンソールはイベントが発生していないかのように、イベントのログ記録を停止します。

4

1 に答える 1

4

THREEx.FullScreenは次のコードを使用しているようです:

element.webkitRequestFullScreen();

そして、あなたが必要とするのはこれです:

element.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);

ただし、これはChromeのみのようです。

于 2012-05-25T16:51:13.567 に答える