检查画布中迷宫游戏的碰撞
问题描述:
我正试图在画布中开发迷宫游戏。我手工绘制了迷宫,如检查画布中迷宫游戏的碰撞
context.moveTo(100,700);
context.lineTo(100,600);
context.lineTo(200,600);
context.lineTo(200,500);
还有更多。我想通过这些线移动物体而不移过这些边界。
为此,我曾尝试下面的代码:
function right() {
context.clearRect(0, 0, canvas.width, canvas.height);
art();
myImage11.src = "Point.png";
x += 20;
if ((x + 20 < 50)) {
context.clearRect(0, 0, canvas.width, canvas.height);
checkcollision();
if (collision == 1) {
x -= 20;
collision = 0;
}
context.drawImage(myImage11, x, y, 50, 50);
}
我checkcollision功能确实
function checkcollision() {
var myImage11 = context.getImageData(x, y, 10, 10);
var pix = myImage11.data;
for (var i = 0; n = pix.length, i < n; i += 4) {
if (pix[i] == 0) {
collision = 1;
}
}
}
但它不工作。请帮忙解决这个问题! 在此先感谢
答
这是难以推断当前场景的精确运作,如碰撞仅选中时x + 20 < 50
,但问题可能是从中获得getImageData面积:x和的y位置'avatar',宽度为10(context.getImageData(x, y, 10, 10);
)这将检查newavatar位置的左侧是否有碰撞,但不是右侧移动的方向。为此,应该检查x + avatarWidth- XMovement和XMovement的宽度。
也许与您当前的设置不完全相符,但是制作了模拟运动的fiddle。在其中,整个化身目标位置被检查以进行更快速的设置,但是如果需要的话可以被优化以使用新的重叠。
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var x = 100, y = 200;
var imgWidth = 50, imgHeight = 50;
var checkcollision = function(){ //checks collision of the entire 'avatar' rectangle. This can be done more efficiently by only checking the moved to area, but that would require different parameters per direction.
var data = context.getImageData(x , y, imgWidth, imgHeight).data;
return data.some(function(p){ return p != 0;});
}
function right() {
context.clearRect(0,0, canvas.width, canvas.height);
art(); //draw maze
//myImage11.src = "Point.png";
var curx= x;
x+=20;
while(checkcollision() && x > curx){ //while collision decrease x (note, this could be more efficient by just checking the new position overlap)
x--;
}
drawAvatar();
}
function art(){
context.moveTo(100,400); //decreased y a bit to keep it easier viewable while testing
context.lineTo(100,300);
context.lineTo(200,300);
context.lineTo(200,200);
context.stroke();
}
function drawAvatar(){
//context.drawImage(myImage11, x, y, imgWidth, imgHeight);
context.fillRect(x,y,imgWidth,imgHeight);
}
art();drawAvatar();
答
图像数据都做了一些奇怪的东西 有时你画的颜色是关闭了一点。 检查Y = 98,99,100 http://jsfiddle.net/15wsszw4/
公式得到x处像素的红色值差异性之探源,Y
console.log('R:'+imgData.data[y*4*c.width+x*4])
什么是你的'checkcollision'功能吗? – nils
函数checkcollision(){ \t \t \t var myImage11 = context.getImageData(x,y,50,50); \t \t \t var pix = myImage11.data; \t \t \t为(VAR I = 0; N = pix.length,I
Andrew
每个像素应该是阵列中的4(RGBA)条目(所以10×10 = 400 ARRAYSIZE),http://www.w3schools.com/tags/tryit.asp? filename = tryhtml5_canvas_getimagedata2 – dwana