如何让我的角色沿对角线移动
How can I make my character move diagonally?
我正在尝试使用HTML5 Canvas和Javascript创建一款游戏,我无法弄清楚如何(正确地)使角色在用鼠标点击画布后对角线移动。我确实设法让角色沿对角线移动,但我无法设置一个速度,以便无论距离如何,它都会以相同的速度移动……你点击得越远,它移动得越快,你点击得越近,它移动得越慢。我想要的速度是相同的,无论你点击哪里。
下面是我到目前为止的内容:http://pastebin.com/hUJBiQHq
如何在画布上对角线移动字符?
我实际上做了一些改变。
我做的第一件事是删除了很多setTimout
调用。移动和渲染并不需要单独的一个。我还让它在实际加载后停止检查游戏是否已加载。现在,一旦游戏被加载,它将开始渲染。
您还在超时内设置了onclick
事件,这是不需要的。我把它搬到了外面。一个更好的方法和未来阅读的主题是使用addEventListener
,这里解释得很好
我在顶部添加的另一件事是requestAnimationFrame
的垫片,它在setTimeout
上使用它要好得多,如果你注意到它在不支持动画帧的浏览器上运行,它将在超时时退回。这里解释了使用它的许多好处。
现在讨论手头的问题!
var tx = newX - posX,
ty = newY - posY,
tx
和ty
分别是目标x和目标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
的值,直到你得到你想要的。
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- 正在SharePoint 2013母版页中添加JQuery移动文件
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 如何使用phaser使html5游戏在移动设备浏览器上运行
- FabricJs-限制主对象内添加对象的移动区域
- 如何从画布上的某个移动事件中获取X和Y
- 触摸移动时切换到新元素
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 停止jQuery UI滑块移动超过给定值
- 谷歌地图API v3不适用于移动浏览器或PhoneGap
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- JQuery移动动态分区页面
- XMLHttpRequest在移动设备上的chrome上不起作用
- 画布对角线移动
- Javascript动画沿对角线和反向移动
- 如何用javascript对角线移动精灵
- 从按键检测对角线移动- Javascript
- 移动背景图像对角线在屏幕上
- 如何沿对角线和锯齿形移动对象
- 如何让我的角色沿对角线移动