我怎样才能让我的角色对角移动?

Posted

技术标签:

【中文标题】我怎样才能让我的角色对角移动?【英文标题】:How can I make my character move diagonally? 【发布时间】:2012-12-20 04:03:16 【问题描述】:

我正在尝试使用 html5 Canvas 和 javascript 创建游戏,但在用鼠标单击画布后,我无法弄清楚如何(正确地)使角色沿对角线移动。我确实设法使角色沿对角线移动,但我无法设置速度,以便无论距离多远,它都会以相同的速度移动......你点击得越远,它移动得越快,你点击得越近,它移动得越慢。我希望无论你点击哪里,速度都一样。

这是我目前所拥有的:http://pastebin.com/hUJBiQHq

如何在画布上沿对角线移动角色?

【问题讨论】:

当然速度取决于您点击的位置,因为您是这样编程的。您在点击处理程序中设置 speedX 和 speedY。 这就是我能想到的让它沿对角线移动...我不是数学人,所以我不知道该怎么做。 如果您不想更改速度,请不要更改它。我想我不明白你想要实现什么,以及为什么你有点击事件处理程序。 【参考方案1】:

我实际上做了很多改变。我会试着把每一个都看一遍。

我做的第一件事是删除很多setTimout 调用。你真的不需要一个单独的用于运动渲染。我还让它停止检查游戏是否在实际加载后加载。现在,一旦游戏加载完毕,它将开始渲染。

您的onclick 事件也在超时内,这是不需要的。我把它移到了外面。更好的方法和未来阅读的主题是使用addEventListenerexplained nicely here

我在顶部添加的另一件事是requestAnimationFrame 的垫片,在setTimeout 上使用它要好得多,如果您注意到它是否在不支持动画帧的浏览器上运行,它将回退到超时。 There are many benefits to using it explained here.

现在谈谈手头的问题!

 var tx = newX - posX,
     ty = newY - posY,

txty 是目标 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;

Live Demo of it all working

完整代码

(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();

【讨论】:

没问题,如果它似乎没有在鼠标光标处停止 right 玩这个有点if (dist >= speed) 如果你使用if (dist >= 2) 等你可能会得到一些更好结果。【参考方案2】:

您应该测量从起点到终点的距离,然后据此计算移动的持续时间。

测距:

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 值,直到你得到你想要的。

【讨论】:

以上是关于我怎样才能让我的角色对角移动?的主要内容,如果未能解决你的问题,请参考以下文章

关于Unity3D中角色跟随移动的机关同时移动的问题

Discord.py:我怎样才能获得机器人角色并改变他的颜色?

我怎样才能找到空间的角色?

角色移动、加速 C# Unity

游戏角色在不同的屏幕尺寸,libGDX中移动不同的速度

我怎样才能允许人们使用 discord.py 只踢低于其角色的成员?