javascript - 为什么每次 Sprite 移动时我的 map 都会消失?

标签 javascript html canvas

尝试在这个周末制作我的第一款游戏。我终于让我的矩形与我的 map 同时出现。我的矩形可以移动!但当我点击按钮移动它时, map 就消失了。这是我需要进行某种游戏循环以在每次单击按钮时不断更新 map 或在其上设置计时器的地方吗?或者我有其他类型的错误?谢谢大家!

   var canvas = <HTMLCanvasElement>document.getElementById('myCanvas');
var context = canvas.getContext("2d");
var img = new Image();
img.onload = function () {
    context.drawImage(img, 0, 0);
}
img.src = "";



var mapArray =
       ["############################",
        "#      #    #      o      ##",
        "#                          #",
        "#   ####   #####    ##     #",
        "##         #   #    ##     #",
        "###           ##     #     #",
        "#           ###      #     #",
        "#   ####          ###      #",
        "#   ##    #  o             #",
        "# o  #    #    o ###   ### #",
        "#    #    #                #",
        "############################"];

//need to add wall.scource =  and grass.source =
var wall = new Image();
var grass = new Image();
grass.src = "http://vignette2.wikia.nocookie.net/tibia/images/6/60/Grass_(Tile).gif/revision/latest?cb=20080817072800&path-prefix=en";
wall.src = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJyofLT0tMSw3QTo6LC87RD84Nzc5OjcBCgoKBQUFDgUFDisZExkrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK//AABEIACAAIAMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAACAwQFAP/EACkQAAEDAwIDCQEAAAAAAAAAAAECAxEABCESEyMxURQyM0Fhc4GT0QX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8Au/oXDzT2ltZSJxAHKp27242yC5nPxQ3Qm5dVqzOMelI7vNMdYoKm718Jw4c85ApN5cXIbWvdUTtk48qBKkGcgEdaFRT2e4AIPCVQaF+1tvuawAVEQKlVBM8ulHfPoXeunfaKQqJ1ilrW0UnjNfYP2gVoCoURIpdwhoMuhKTG2ZNODiJI3miPcFddvMm1cSHGvDIEKBJoP//Z";


var posX = 0;
var posY = 0;




//for loops set images at given coordinates according to position on mapArray
for (var y = 0; y < mapArray.length; y++) {
    for (var x = 0; x < mapArray[0].length; x++) {

        if (mapArray[y][x] == "") {
            context.drawImage(grass, (32 * x), (32 * y), 32, 32)//last two are size of image )
        }
        if (mapArray[y][x] == "#") {
            context.drawImage(wall, (32 * x), (32 * y), 32, 32)//last two are size of image )
        }
 }
}

context.rect(posX, posY, 32, 32)
context.stroke();//traces path, might not need this


//moves character
function move(e) {//next five lines are newly added. Final line of function is drawimage function that is new as well
    var ctx = canvas.getContext('2d');// create backing canvas
    var backCanvas = document.createElement('canvas');
    backCanvas.width = canvas.width;
    backCanvas.height = canvas.height;
    var backCtx = backCanvas.getContext('2d');

    //alert(e.keyCode);//gives feedback to what each keyCode is
    if (e.keyCode == 39) {
        posX += 5;
    }
    if (e.keyCode == 37) {
        posX -= 5;
    }
    if (e.keyCode == 40) {
        posY += 5;
    }
    if (e.keyCode == 38) {
        posY -= 5;

    }
    canvas.width = canvas.width;//clears the board after each move
    context.rect(posX, posY, 32, 32)
    context.stroke();
    ctx.drawImage(backCanvas, 0, 0);
}    
document.onkeydown = move;

最佳答案

jsFiddle:https://jsfiddle.net/j353agny/3/

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext("2d");

var mapArray = ["############################",
    "#      #    #      o      ##",
    "#                          #",
    "#   ####   #####    ##     #",
    "##         #   #    ##     #",
    "###           ##     #     #",
    "#           ###      #     #",
    "#   ####          ###      #",
    "#   ##    #  o             #",
    "# o  #    #    o ###   ### #",
    "#    #    #                #",
    "############################"];

//need to add wall.scource =  and grass.source =
var wall = new Image();
var grass = new Image();
grass.src = "http://vignette2.wikia.nocookie.net/tibia/images/6/60/Grass_(Tile).gif/revision/latest?cb=20080817072800&path-prefix=en";
wall.src = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJyofLT0tMSw3QTo6LC87RD84Nzc5OjcBCgoKBQUFDgUFDisZExkrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK//AABEIACAAIAMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAACAwQFAP/EACkQAAEDAwIDCQEAAAAAAAAAAAECAxEABCESEyMxURQyM0Fhc4GT0QX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8Au/oXDzT2ltZSJxAHKp27242yC5nPxQ3Qm5dVqzOMelI7vNMdYoKm718Jw4c85ApN5cXIbWvdUTtk48qBKkGcgEdaFRT2e4AIPCVQaF+1tvuawAVEQKlVBM8ulHfPoXeunfaKQqJ1ilrW0UnjNfYP2gVoCoURIpdwhoMuhKTG2ZNODiJI3miPcFddvMm1cSHGvDIEKBJoP//Z";

// Player position

var posX = 0;
var posY = 0;

//moves character
function move(e) {

    //alert(e.keyCode);//gives feedback to what each keyCode is
    if (e.keyCode == 39) {
        posX += 5;
    }
    if (e.keyCode == 37) {
        posX -= 5;
    }
    if (e.keyCode == 40) {
        posY += 5;
    }
    if (e.keyCode == 38) {
        posY -= 5;

    }
}

document.onkeydown = move;

// every 3 miliseconds re-draw the stage with the player
setInterval(function () {
    console.log("REDRAW");
    // Clear the canvas and redraw
    context.fillStyle = "#FFF";
    context.fillRect(0,0,800,600);

    //for loops set images at given coordinates according to position on mapArray
    for (var y = 0; y < mapArray.length; y++) {
        for (var x = 0; x < mapArray[0].length; x++) {

            if (mapArray[y][x] == "") {
                context.drawImage(grass, (32 * x), (32 * y), 32, 32) //last two are size of image )
            }
            if (mapArray[y][x] == "#") {
                context.drawImage(wall, (32 * x), (32 * y), 32, 32) //last two are size of image )
            }
        }
    }
    context.fillStyle = "#00F";
    context.fillRect(posX, posY, 32, 32)
}, 3);

你能做的就是使用一个 setInterval ,它每 3 毫秒运行一次。基本上每 3 毫秒我就会让 Canvas 重绘你的墙壁,然后重绘你的玩家。这将阻止您遇到的任何奇怪的绘图问题。

附注您可以使用 requestAnimationFrame 而不是 setInterval 只是为了让您知道

关于javascript - 为什么每次 Sprite 移动时我的 map 都会消失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33718240/

相关文章:

android - 有效地绘制位于 fragment 内部的 imageView 以响应触摸事件

javascript - 在不影响阴影的情况下设置 alpha?

javascript - HTML5 : Canvas Context fillText/strokeText does not draw

javascript - 使用 Angularjs 在嵌套数组中动态添加子项

html - 是否可以避免 CSS3-Pretag?

javascript - 将\n 替换为 JSON 字符串中的 <br>

css - 如何在不使用父 div 的情况下垂直放置布局 div

javascript - jQuery UI 日期选择器中的错误 : getDate returns incorrect date

javascript - 将页面标题设为粗体

javascript - 是否可以制作一个自动将文本颜色更改为背景对比度的 Javascript 程序?