-1

このリンクをクリックすると、約 2 秒後に何隻かの船がこちらに向かってくるのが見えます。ここで、15 ~ 20 秒間、別のウィンドウに移動します。その後戻ってくると、敵の巨大な壁があなたに向かってくるのが見えます。明らかにこれは、キャンバスがループを継続しているが、単にループを継続させていないためですか?

これはゲームプレイ中の問題ではないことはわかっていますが、誰かが窓から外に出ると、物事が台無しになります...

これらのリスナーを追加して、これを解決しようとしました:

       window.onblur = function() {
            // Add logic to pause the game here...
            stopLoop();
        };

        window.onfocus = function() {
            // Add logic to pause the game here...
            startLoop();
        };

しかし、それは問題を解決しません...

実際のループ:

function init()
{

isPlaying = true;
drawBackground();
drawBars();
setUpListeners();
startLoop();

}

その後...

function Loop()
{
if (isPlaying == true)
{
Player1.draw();
requestAnimFrame(Loop);
 drawAllEnemies();

}

}

function startLoop()
{

isPlaying = true;
Loop();
startSpawningEnemies();

}

function stopLoop()
{
isPlaying = false;
stopSpawningEnemies();
}

function spawnEnemy(n) //total enemies starts at 0 and every-time you add to array
{
  for (var x = 0; x < n; x++)
   {

     enemies[totalEnemies] = new Enemy();
     totalEnemies++; 
   }

}

function drawAllEnemies()
{

  ClearEnemyCanvas();
  for(var i = 0; i < enemies.length; i++)
   {
      enemies[i].draw();

   }
}

function startSpawningEnemies()
{
  stopSpawningEnemies();

  spawnInterval = setInterval(function() {spawnEnemy(spawnAmount);}, spawnRate); //this calls spawnEnemy every spawnRate
  /////////spawn 'spawnAmount' enemies every 2 seconds




}


function stopSpawningEnemies()
{

clearInterval(spawnInterval);
}

敵の実際の方法:

function Enemy()  //Object
{

//////Your ships values
this.EnemyHullMax = 1000;
this.EnemyHull = 1000;
this.EnemyShieldMax = 1000;
this.EnemyShield = 347;
this.SpaceCrystalReward = 2684;
this.EnemySpeed = 2; //should be around 6 pixels every-time draw is called by interval, directly linked to the fps global variable
////////////



////Pick Ship
this.type = "Hover";
this.srcX = EnemySrcXPicker(this.type);
this.srcY = EnemySrcYPicker(this.type);

this.enemyWidth = EnemyWidthPicker(this.type);
this.enemyHeight = EnemyHeightPicker(this.type);

this.drawX = EnemydrawXPicker(this.type);
this.drawY = EnemydrawYPicker(this.type);
////


}

Enemy.prototype.draw = function()
{

this.drawX -= this.EnemySpeed;
ctxEnemy.globalAlpha=1;
ctxEnemy.drawImage(spriteImage,this.srcX,this.srcY,this.enemyWidth,this.enemyHeight,this.drawX,this.drawY,this.enemyWidth,this.enemyHeight);

}


function EnemySrcXPicker(type)
{
if (type == "Hover")

    {

        return 906;
      }
}

function EnemySrcYPicker(type)
{
if (type == "Hover")

   {
        return 616;
     }
}

function EnemydrawXPicker(type)
{
if (type == "Hover")

     {
        return Math.floor(Math.random() *  1000) + canvasWidthEnemy;
     }
}

function EnemydrawYPicker(type)
{
if (type== "Hover")

     {
        return Math.floor(Math.random() * (canvasHeightEnemy - 72));
     }
}


function EnemyWidthPicker(type)
{
if (type == "Hover")

     {
        return 90;
     }
}

function EnemyHeightPicker(type)
{
if (type == "Hover")

     {

        return 72;
     }
}
4

1 に答える 1

4

ループによります。

setTimeOut または setInterval を使用する場合は、はい。ウィンドウがフォーカスを失っても、ループは継続します。

requestFrameAnimation を使用する場合、いいえ、ウィンドウがフォーカスを失うとループが停止します。

requestFrameAnimation は、このような問題を解決するために作成されました。アクティブでないもののために PC に CPU サイクルを消費させるのはばかげています。

于 2013-06-04T20:16:44.187 に答える