如何使对象指向鼠标

时间:2014-07-14 05:18:24

标签: javascript html5 canvas

我有一个简单的剑形图像(向上绘制),处于“开放世界”的游戏设置中,因此玩家可以在世界各地移动到所有坐标。我想用剑指向鼠标。

我的问题(我认为)是世界坐标和网页坐标不匹配。例如,播放器可以位于(6000,6000)位置,而鼠标坐标仅在0到1600之间(或者屏幕的宽度是什么)。最重要的是,网页并不总是存在于同一个地方。

到目前为止的想法:

所以我需要计算鼠标相对于画布的位置,反之亦然。

我正在使用的公式。这适用于XNA的一个较旧的项目:

var xdir = mouse.x - swordcenter.x;
var ydir = mouse.y - swordcenter.y;

var theta = (Math.atan2( ydir, xdir ) - Math.PI/2.0) * (180.0/Math.PI);

我觉得解决方案应该比我想的更简单,但到目前为止还没有公式。有什么想法吗?

所以我想问的问题是为什么这不起作用?我最好的猜测是因为坐标的不同。我无法弄清楚如何将其考虑在内。

编辑:我已经想出如何将其考虑在内。通过以下代码,鼠标位置被放入游戏坐标中。因此,如果鼠标悬停在播放器上,则鼠标位置和播放器位置相等。 但是,鼠标移动时图像仍会快速旋转。

document.addEventListener('mousemove', function(e){ 

    mouse.x = e.clientX || e.pageX; 
    mouse.y = e.clientY || e.pageY; 

    var view = document.getElementById('viewport');
    var rect = view.getBoundingClientRect();

    mouse.x -=  rect.left;
    mouse.y -=  rect.top;

    var camX = clamp(x - canvas.width/2, -1000, 1000 - canvas.width);
    var camY = clamp(y - canvas.height/2, -1000, 1000 - canvas.height);

    mouse.x += camX;
    mouse.y += camY;

}, false);

编辑2:以下是我如何获得角度:

var getAngle = function() {

    var xdir = mouse.x - x;//where x and y are the sword center
    var ydir = mouse.y - y;

    var theta = Math.atan2( ydir, xdir  ) * (180.0/Math.PI);     

    return theta;
}

编辑3:以下是我绘制图片的方式:

var draw = function(ctx) {

    ctx.fillRect(x-15, y-15, 30, 30);//background player rect

    ctx.save();
    ctx.translate(x, y);//x and y is the center of the sword/player     
    ctx.rotate(getAngle());     

    //this correctly draws the sword on top of the player rect, except for rotation
    ctx.drawImage(stanceTexture, -stanceTexture.width/2, -stanceTexture.height/2);

    ctx.restore();
};

2 个答案:

答案 0 :(得分:0)

你不需要三角学。 基本矢量微积分就足够了:

const sword_length = 10;

var sword_x_start = 0; 
var sword_y_start = 0;

var mouse_x = ...;  // current mouse position
var mouse_y = ...;

var dx = (mouse_x - sword_x_start); 
var dy = (mouse_y - sword_y_start);

// sword to mouse distance 
var length = Math.sqrt( dx*dx + dy*dy );

// unit vector, see: http://en.wikipedia.org/wiki/Unit_vector 
// in sword to mouse direction: 
var unit_v_x = dx / length;
var unit_v_y = dy / length;

// and now coordinates of the sword pointing to mouse:
var sword_x_end = sword_x_start + unit_v_x * sword_length ;
var sword_y_end = sword_y_start + unit_v_y * sword_length ;

答案 1 :(得分:0)

在完成计算正确的“游戏中”鼠标位置的所有额外数学之后,事实证明我的画布上下文也需要弧度。很混乱。我发现的每一个其他帖子都会将值重新转换为度数(错误),所以我希望这可以帮助其他人。所以这是完整的答案,

document.addEventListener('mousemove', function(e){ 

    mouse.x = e.clientX || e.pageX; 
    mouse.y = e.clientY || e.pageY; 

    var view = document.getElementById('viewport');
    var rect = view.getBoundingClientRect();

    mouse.x -=  rect.left;
    mouse.y -=  rect.top;

    var camX = clamp(x - canvas.width/2, world.minX, world.maxX - canvas.width);
    var camY = clamp(y - canvas.height/2, world.minY, world.maxX - canvas.height);

    mouse.x += camX;
    mouse.y += camY;

}, false);


var getAngle = function() {

    var xdir = mouse.x - x;//where x and y are the sword center
    var ydir = mouse.y - y;

    //Note: I only subtract Math.PI/2 to flip the image 180 degrees.
    //      The value to subtract will depend on the original angle of your image
    var theta = Math.atan2( ydir, xdir  ) - Math.PI/2.0;     

    return theta;
}

var draw = function(ctx) {

    ctx.fillRect(x-15, y-15, 30, 30);//background player rect

    ctx.save();
    ctx.translate(x, y);//x and y is the center of the sword/player     
    ctx.rotate(getAngle());     

    //this correctly draws the sword on top of the player rect, except for rotation
    ctx.drawImage(stanceTexture, -stanceTexture.width/2, -stanceTexture.height/2);

    ctx.restore();
};