在游戏循环中执行一次功能

时间:2019-04-11 07:54:25

标签: javascript

我有一个游戏循环,每秒在以下条件下刷新〜20次,这是在功能growPlayerBlockCounterWinner()内部:

if (obstacleArray[i][2] > canvas.height) {player.size += 5;}

这意味着:如果黑色物体超出了画布区域,则播放器大小将增加5个像素。

该功能通常执行一次,但是由于将其置于游戏循环中,因此每次刷新游戏时都会执行,因此玩家不断成长。

以前我用符号'='代替od'>',但是当黑色块逐像素移动并且我希望它们移动得更快时,这种方法效果很好。

您可以在远程服务器上检查问题和完整代码:https://stacho163.000webhostapp.com/firstLevel.html

下面,我仅粘贴我的障碍物功能:

// js game script //

let obstacle = {
    size: 0,
    posX: 0,
    posY: 0,
    speed: 0
}

let obstacleArray = new Array(100);

function generateObstacle() {
    for (i = 0; i < obstacleArray.length; i++) {
        obstacle.size = Math.round((Math.random() * 100) + 50);
        obstacle.posX = Math.round((Math.random() * (canvas.width - 
obstacle.size)));
        obstacle.posY = -450 - (i * 100);
        obstacle.speed = 5;
        obstacleArray[i] = [obstacle.size, obstacle.posX, obstacle.posY, 
obstacle.speed];
    }
}

function drawObstacle() {
    for (i = 0; i < obstacleArray.length; i++) {
        ctx.fillStyle = "#000";
        ctx.fillRect(obstacleArray[i][1], obstacleArray[i][2], 
obstacleArray[i][0], obstacleArray[i][0]);
        obstacleArray[i][2] += obstacleArray[i][3];
    }
}

function growPlayerBlockCounterWinner() {
    for (i = 0; i < obstacleArray.length; i++) {
        // grow player
        if (obstacleArray[i][2] > canvas.height) {
            player.size += 5;         
        }     
    }
}

generateObstacle();

function game() {
    drawObstacle();
    growPlayerBlockCounterWinner();
    requestAnimationFrame(game);
}

requestAnimationFrame(game);

我正在寻找意见,也许我关于该陈述的逻辑不正确,或者我应该将该陈述放在其他地方。

感谢您的提示:)

1 个答案:

答案 0 :(得分:1)

由于您有定义数量的黑匣子,因此您可以存储播放器已经为之增加尺寸的黑匣子,如下所示:

let obstacle = {...};
var affectedBlackBoxes = {};

//...//

function growPlayerBlockCounterWinner() {
  for (i = 0; i < obstacleArray.length; i++) {
    // grow player
    if (obstacleArray[i][2] > canvas.height && !affectedBlackBoxes[i]) {
      player.size += 5;     
      affectedBlackBoxes[i] = true;    
    }     
  }
}