我正在学习js和canvas。我想用小瓷砖填充地图(例如,20px×20px)到目前为止,我已经用字符填充了它,但瓷砖将是更好。我是否需要获得一组小图像,或者是否有绘制瓷砖的方法? 我想我可以在主画布内创建很多20x20画布,但我想这远远不是最佳画布。
这是我到目前为止所得到的。
var mapArray = [
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
];
function popMap() {
var canvas = document.getElementById('playground');
var ctx = canvas.getContext('2d');
ctx.font="18px Georgia";
ctx.fillStyle="white";
for (i=0;i<mapArray.length;i++) {
for (j=0;j<mapArray.length;j++) {
ctx.fillText(mapArray[i][j], i*20, j*20);
}
}
}
popMap();
顺便说一句,最后,我想制作一个简单的RPG游戏(一个用键控制的角色在地图上移动),所以请告知地图上的最佳方法。谢谢。
答案 0 :(得分:1)
一种解决方案是创建一组函数来绘制切片,每种切片类型都有一个函数。然后创建一个查找对象来保存所有这些功能。在循环中填充地图,从查找对象中找到所需的函数,并使用找到的函数绘制图块。
例如,以下代码将tile类型0绘制为浅红色方块,将tile type 1绘制为浅绿色方块...
var mapArray = [
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
];
function fillTile0(ctx, x, y, width, height) {
ctx.fillStyle = "#FF7777"
ctx.fillRect(x, y, width, height);
}
function fillTile1(ctx, x, y, width, height) {
ctx.fillStyle = "#77FF77"
ctx.fillRect(x, y, width, height);
}
var fillTileFunctions = {
"0": fillTile0,
"1": fillTile1
};
function popMap() {
var canvas = document.getElementById('playground');
var ctx = canvas.getContext('2d');
for (i=0;i<mapArray.length;i++) {
for (j=0;j<mapArray[i].length;j++) {
var fillTile = fillTileFunctions[mapArray[i][j]];
if (fillTile) {
fillTile(ctx, i*20, j*20, 20, 20);
}
}
}
}
popMap();
另一种解决方案是为每种图块类型创建单独的图像(例如png,svg等)。然后创建一个查找对象来保存这些图像。在循环中填充地图,从查找对象中找到所需的图像,并使用ctx-&gt; drawImage()函数绘制图块。
答案 1 :(得分:1)
以下是在游戏画布上绘制图块的方法。
从像这样的tile spritesheet图像开始:
左(草)图块由mapArray
值0表示。右(粘土)图块由值1表示。
然后使用drawImage
的扩展形式在游戏画布上的任意位置绘制任意一个平铺。
drawImage(
// use the spritesheet image as the image source
spritesheetImage,
// clip a portion from the spritesheet image
clipAtX, clipAtY, clipWidth, clipHeight,
// draw the clipped portion to the canvas
canvasX, canvasY, scaledWidth, scaledHeight
);
这是示例代码和演示:
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
var mapArray = [
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
];
var tw=20;
var th=20;
var spritesheet=new Image();
spritesheet.onload=function(){
canvas.width=tw*mapArray[0].length;
canvas.height=th*mapArray.length;
popMap();
}
spritesheet.src='https://dl.dropboxusercontent.com/u/139992952/multple/gametiles.png';
function popMap() {
for (i=0;i<mapArray.length;i++) {
for (j=0;j<mapArray[i].length;j++){
var tile=mapArray[i][j];
ctx.drawImage(spritesheet,
tile*20,0,tw,th,
j*20,i*20,tw,th
);
}
}
}
body{ background-color: ivory; }
#canvas{border:1px solid red; margin:0 auto; }
<canvas id="canvas" width=500 height=500></canvas>