javascript - 如何改变javascript中全局变量的值?

标签 javascript global

我一直在为一个游戏编写一些代码,并尝试向其中添加状态。我设置了一个全局变量“gameState”,并且我想在玩家选择某个事物后更改该全局变量的值。由于某种原因,当玩家做出选择时,我的全局变量不会改变。 :/

下面是我的代码的缩短版本,仅包含 Algolia 作为示例。当 Angular 色越过 Canvas 上的 Algolia 国旗并按回车键时,我想切换到状态 2。相反,什么也没有发生。代码继续运行状态1。

// The Almighty Game State
var gameState = 1;

// Creates The Canvas
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = 1200;
canvas.height = 500;
document.body.appendChild(canvas);

//-------------------------(GAME STATE 1)-------------------------//

if (gameState === 1) {

    //---------------(IMAGE RESOURCES)---------------//

    // Loads Character Image
    var characterReady = false;
    var characterImage = new Image();
    characterImage.onload = function () {
        characterReady = true;
    };
    characterImage.src = "images/character.png";

    // Loads Background Image 1
    var background1Ready = false;
    var background1Image = new Image();
    background1Image.onload = function () {
        background1Ready = true;
    };
    background1Image.src = "images/background1.png";

    // Loads Algeria Flag Image
    var falgeriaReady = false;
    var falgeriaImage = new Image();
    falgeriaImage.onload = function () {
        falgeriaReady = true;
    };
    falgeriaImage.src = "images/falgeria.png";

    //---------------(GAME OBJECTS/VARIABLES)---------------//

    var action = 0;
    var character = {
       speed: 250
    };
    var falgeriaText = 0;
    var falgeria = {};
    falgeria.x = 570;
    falgeria.y = 180;

    //---------------(GAME FUNCTIONS)---------------//

    // Resets Character To Center
    var reset = function () {
        character.x = canvas.width / 2;
        character.y = canvas.height / 2;
    };

    // Checks For Key Inputs
    var keysDown = {};

    addEventListener("keydown", function (e) {
        keysDown[e.keyCode] = true;
    }, false);

    addEventListener("keyup", function (e) {
        delete keysDown[e.keyCode];
    }, false);

    //---------------(UPDATE GAME OBJECTS)---------------//

    var update = function (modifier) {

        // Establishes Keyboard Controls
        if (38 in keysDown) { // Player Holding Up Key
        character.y -= character.speed * modifier;
        }
        if (40 in keysDown) { // Player Holding Down Key
            character.y += character.speed * modifier;
        }
        if (37 in keysDown) { // Player Holding Left Key
            character.x -= character.speed * modifier;
        }
        if (39 in keysDown) { // Player Holding Right Key
            character.x += character.speed * modifier;
        }
        if (87 in keysDown) { // Player Holding W Key
            character.y -= character.speed * modifier;
        }
        if (83 in keysDown) { // Player Holding S Key
            character.y += character.speed * modifier;
        }
        if (65 in keysDown) { // Player Holding A Key
            character.x -= character.speed * modifier;
        }
        if (68 in keysDown) { // Player Holding D Key
            character.x += character.speed * modifier;
        }
        if (13 in keysDown) { // Player Holding Enter Key
            action = 1;
        }
        else {
            action = 0;
        }

        // Creates Borders Around Canvas
        if (character.x >= canvas.width - characterImage.width) {
            character.x = canvas.width - characterImage.width;
        }
        else if (character.x <= 0) {
            character.x = 0;
        }
        if (character.y >= canvas.height - characterImage.height) {
            character.y = canvas.height - characterImage.height;
        }
        else if (character.y <= 0) {
            character.y = 0;
        }

        //Checks If Character Is Over Algeria
        if (
            character.x <= (falgeria.x + 30)
            && falgeria.x <= (character.x + 30)
            && character.y <= (falgeria.y + 30)
            && falgeria.y <= (character.y + 30)
        ) {
            falgeriaText = 1
        }
        else {
            falgeriaText = 0
        }
        if (
            character.x <= (falgeria.x + 30)
            && falgeria.x <= (character.x + 30)
            && character.y <= (falgeria.y + 30)
            && falgeria.y <= (character.y + 30)
            && action === 1
        ) {
            gameState = 2;
        }
    };

    //---------------(DRAW TO CANVAS)---------------//

    var render = function () {

        if (background1Ready) {
            ctx.drawImage(background1Image, 0, 0);
        }
        if (falgeriaText === 0) {
                ctx.font = "24px Helvetica";
                ctx.fillStyle = "rgb(0, 0, 0)";
                ctx.textAlign = "center";
                ctx.fillText("Select A Country To Grow Your Potato In", 600, 450);
        }
        if (falgeriaReady) {
            ctx.drawImage(falgeriaImage, 570, 180);
        }
        if (falgeriaText === 1) {
            ctx.fillText("Algeria  |  Press [ENTER] To Select", 600, 450);
        }
        if (characterReady) {
            ctx.drawImage(characterImage, character.x, character.y);
        }
    };

    //---------------(Loop)---------------//
    var main = function () {

            var now = Date.now();
            var delta = now - then;
            update(delta / 1000);
            render();
            then = now;
            requestAnimationFrame(main);
    };

    var w = window;
    requestAnimationFrame = 
    w.requestAnimationFrame || 
    w.webkitRequestAnimationFrame || 
    w.msRequestAnimationFrame || 
    w.mozRequestAnimationFrame;

    var then = Date.now();
    reset();
    main();
}

if (gameState === 2) {
alert("gameState Changed")
}

最佳答案

你基本上有这个:

var gameState = 0;

if(gameState === 1) {

    // never called since gameState = 0

}

if(gameState ===2) {

   // never called since gameState = 0
}

这可能不是你想要的。如果您不熟悉 Javascript 调试器,您可能需要查找有关如何使用它的教程。您会看到目前没有任何代码被调用。

即使你修改成这样:

var gameState = 1;

if(gameState === 1) {
    requestAnimationFrame(main);  // main is called after the remaining sync code has executed
}

if(gameState ===2) {
   // never called since gameState = 1
}

它仍然永远不会执行,因为在 requestAnimationFrame 回调执行任何操作之前,gameState===2 if 语句将立即执行(因为它是同步的)(因为这是异步完成的)。

关于javascript - 如何改变javascript中全局变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27372182/

相关文章:

javascript - CouchApp View 显示为空结果

javascript - 为什么在 Javascript 中创建元素全局变量是不好的?

javascript - 将DOM背景层与关键帧动画配合使用,并将Canvas层用于物理引擎

javascript - 键入时不显示 jQuery UI 自动完成

javascript - 转换 JavaScript 对象数组

javascript - JS 使用新键创建一个新的对象数组

typescript - Typescript 中的全局变量列表

C++ 全局作用域类

Swift 闭区间全局数组

javascript - 如何避免 JSDoc 在 Node JS 函数中生成全局范围文档?