画布不会隐藏?

时间:2014-02-22 08:17:34

标签: javascript jquery html5 canvas

我的HTML5 Canvas元素似乎无法隐藏。

我创建了一个计时器,当计时器达到0时应该隐藏元素,我用一个警告标志测试了它,并且工作正常。

问题:

if (TotalSeconds <= 0)
{
    ctx.clearRect(0, 0, canvas.width, canvas.height)
}

整个代码:

// Create the canvas
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = 512;
canvas.height = 480;
document.body.appendChild(canvas);

// Background image
var bgReady = false;
var bgImage = new Image();
bgImage.onload = function () {
    bgReady = true;
};
bgImage.src = "images/background.png";

// Hero image
var heroReady = false;
var heroImage = new Image();
heroImage.onload = function () {
    heroReady = true;
};
heroImage.src = "images/hero.png";

// Monster image
var monsterReady = false;
var monsterImage = new Image();
monsterImage.onload = function () {
    monsterReady = true;
};
monsterImage.src = "images/flamingo.png";

// Game objects
var hero = {
    speed: 256 // movement in pixels per second
};
var monster = {};
var monstersCaught = 0;

// Handle keyboard controls
var keysDown = {};

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

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

// Reset the game when the player catches a monster
var reset = function () {
    hero.x = canvas.width / 2;
    hero.y = canvas.height / 2;

    // Throw the monster somewhere on the screen randomly
    monster.x = 32 + (Math.random() * (canvas.width - 64));
    monster.y = 32 + (Math.random() * (canvas.height - 64));
};

// Update game objects
var update = function (modifier) {
    if (38 in keysDown) { // Player holding up
        hero.y -= hero.speed * modifier;
    }
    if (40 in keysDown) { // Player holding down
        hero.y += hero.speed * modifier;
    }
    if (37 in keysDown) { // Player holding left
        hero.x -= hero.speed * modifier;
    }
    if (39 in keysDown) { // Player holding right
        hero.x += hero.speed * modifier;
    }

    // Are they touching?
    if (
        hero.x <= (monster.x + 32)
        && monster.x <= (hero.x + 32)
        && hero.y <= (monster.y + 32)
        && monster.y <= (hero.y + 32)
    ) 
    {
        ++monstersCaught;
        reset();
    }
    if (hero.x <= 0)
    {
        hero.x = 510
    }
    if (hero.y <= 0)
    {
        hero.y = 478
    }

};
CreateTimer(5);
var Timer;
var TotalSeconds;


function CreateTimer(Time) {
Timer = $("#timer").text();
TotalSeconds = Time;

UpdateTimer()
window.setTimeout("Tick()", 1000);
}

function Tick() {
TotalSeconds -= 1;
UpdateTimer()
window.setTimeout("Tick()", 1000);
}

function UpdateTimer() {
$("#timer").text(TotalSeconds);

if (TotalSeconds <= 0)
{
    ctx.clearRect(0, 0, canvas.width, canvas.height)
}
}

// Draw everything
var render = function () {
    if (bgReady) {
        ctx.drawImage(bgImage, 0, 0);
    }

    if (heroReady) {
        ctx.drawImage(heroImage, hero.x, hero.y);
    }

    if (monsterReady) {
        ctx.drawImage(monsterImage, monster.x, monster.y);
    }

    // Score
    ctx.fillStyle = "rgb(250, 250, 250)";
    ctx.font = "24px Helvetica";
    ctx.textAlign = "left";
    ctx.textBaseline = "top";
    ctx.fillText("Flamingos slaughtered: " + monstersCaught, 32, 32);
    ctx.textAlign = "right";
    ctx.textBaseline = "bottom";
    ctx.fillText("Time left: " + TotalSeconds, 150,32);
};

// The main game loop
var main = function () {
    var now = Date.now();
    var delta = now - then;

    update(delta / 1000);
    render();

    then = now;
};

// Let's play this game!
reset();
var then = Date.now();
setInterval(main, 1); // Execute as fast as possible

html只是<canvas></canvas>

对此很新,所以任何帮助都会受到赞赏。

谢谢!

2 个答案:

答案 0 :(得分:0)

这不会隐藏画布但会清除上下文,这意味着画布上的绘制形状很清晰

ctx.clearRect(0, 0, canvas.width, canvas.height);

答案 1 :(得分:0)

您可以通过为其应用CSS样式来隐藏它:

if (TotalSeconds <= 0) {
    ctx.canvas.style.display = 'none';
}

再次显示它,只需使用blockinline-block代替none

如果你想隐藏它但保留其空间,你可以使用:

ctx.canvas.style.visibility = 'hidden';

您还可以使用以下命令从DOM树中完全删除它:

parent.removeChild(canvasElement);

其中parent是容器元素(例如您现在使用的document.body)而canvasElement是引用是您的画布。

所有这一切 - 如果您只想清除画布,那么您需要停止运行的循环。您可以使用例如标志来执行此操作:

function Tick() {
    TotalSeconds--;
    UpdateTimer();
    if (TotalSeconds > 0) setTimeout(Tick, 1000); // only loop if sec > 0
}

然后按照你已经做的那样清除它。

希望这有帮助!