我正在尝试使用 HTML5 Canvas 和 Javascript 创建游戏,但在用鼠标单击画布后,我无法弄清楚如何(正确地)使角色沿对角线移动。我确实设法使角色沿对角线移动,但我无法设置速度,以便无论距离多远,它都会以相同的速度移动......你点击得越远,它移动得越快,你点击得越近,它移动得越慢。无论您单击何处,我都希望速度相同。
这是我到目前为止所拥有的:http: //pastebin.com/hUJBiQHq
如何在画布上沿对角线移动角色?
我正在尝试使用 HTML5 Canvas 和 Javascript 创建游戏,但在用鼠标单击画布后,我无法弄清楚如何(正确地)使角色沿对角线移动。我确实设法使角色沿对角线移动,但我无法设置速度,以便无论距离多远,它都会以相同的速度移动......你点击得越远,它移动得越快,你点击得越近,它移动得越慢。无论您单击何处,我都希望速度相同。
这是我到目前为止所拥有的:http: //pastebin.com/hUJBiQHq
如何在画布上沿对角线移动角色?
我实际上做了很多改变。我会试着检查每一个。
我做的第一件事是删除了很多setTimout
电话。你真的不需要一个单独的移动和渲染。我还让它停止检查游戏是否在实际加载后加载。现在,一旦游戏加载完毕,它将开始渲染。
您还可以在onclick
不需要的超时时间内完成您的事件。我把它移到了外面。更好的方法和未来阅读的主题将在addEventListener
这里很好地解释
我在顶部添加的另一件事是 shim,因为requestAnimationFrame
使用它会更好setTimeout
,如果您注意到它是否在不支持动画帧的浏览器上运行,它将在超时时回退。使用它有很多好处这里解释。
现在讨论手头的问题!
var tx = newX - posX,
ty = newY - posY,
tx
是目标 x和ty
目标 y。它们是从玩家坐标中减去的鼠标坐标。然后你可以使用这些来执行距离检查,像这样,
dist = Math.sqrt(tx * tx + ty * ty);
接下来我检查距离是否大于速度,如果是我们需要靠近我们的位置。
if (dist >= speed) {
下一部分计算所需的速度。我们取目标 x 和目标 y,然后将它们除以距离,这将使用我们需要行进的像素数量才能到达目标。然后我们将这个数字乘以速度,得到每刻移动的距离。然后,您将这些速度添加到玩家位置以移动玩家(需要更好的解释......我在解释任何数学概念时都很糟糕:?)
velX = (tx / dist) * speed;
velY = (ty / dist) * speed;
posX += velX;
posY += velY;
完整代码
(function () {
var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
window.requestAnimationFrame = requestAnimationFrame;
})();
var canvas = document.getElementById('game');
var context = canvas.getContext('2d');
canvas.width = canvas.height = 500;
var gameReady = true;
var players = [];
var posX = 350;
var posY = 200;
var newX = 350;
var newY = 200;
// new vars needed for movement
var velX = 0;
var velY = 0;
var speed = 5;
function movePlayer() {
var tx = newX - posX,
ty = newY - posY,
dist = Math.sqrt(tx * tx + ty * ty);
if (dist >= speed) {
velX = (tx / dist) * speed;
velY = (ty / dist) * speed;
posX += velX;
posY += velY;
}
}
function isGameReady() {
if (gameReady) {
drawCanvas();
} else {
setTimeout(isGameReady, 100);
}
}
canvas.onmousedown = function (e) {
newX = e.offsetX; // -33;
newY = e.offsetY; // - 55.25;
}
function drawCanvas() {
movePlayer();
context.clearRect(0, 0, canvas.width, canvas.height);
context.fillRect(posX, posY, 10, 10);
requestAnimationFrame(drawCanvas);
}
isGameReady();
您应该测量从起点到终点的距离,然后据此计算出移动的持续时间。
距离测量:
function lineDistance( point1, point2 )
{
var xs = 0;
var ys = 0;
xs = point2.x - point1.x;
xs = xs * xs;
ys = point2.y - point1.y;
ys = ys * ys;
return Math.sqrt( xs + ys );
}
动画的时间是结果*速度。试验speed
价值,直到你得到你想要的。