我正在尝试使用canvas
. 然而,我似乎误解了坐标系在画布中如何处理事件。
我创建了一个playerPaddle
类。有了这个类,我希望将桨的中心准确地绘制在鼠标悬停的位置:
// Paddle Object
function Paddle( h, w, x, y, fill) {
this.h = h;
this.w = w;
this.midH = h / 2;
this.x = x;
this.y = y;
this.fill = fill;
}
Paddle.prototype.draw = function(ctx) {
ctx.fillStyle = this.fill;
ctx.fillRect(this.x, this.y, this.w, this.h);
}
Paddle.prototype.updatePos = function(y) {
this.y = y - this.midH
}
我认为偏移桨的正确方法是使桨的中心位于mousemove
事件上,就像我在updatePos
上面的方法中所做的那样,通过从桨的新位置减去桨高度的一半来绘制矩形。
但是,这似乎无法正常工作,因为它正在将我的桨的顶部准确地绘制在mousemove
事件发生的位置。
但是,如果我this.h
从事件的 y 位置减去,这对我来说绝对没有意义。
下面是我用来实例化桨、将事件处理程序添加到canvas
元素本身的代码,以及我用来渲染所有内容的函数。
// Paddle Globals
var paddleHeight = 50,
paddleWidth = 10,
paddleOffset = 10;
var playerPaddle = new Paddle( paddleHeight, paddleWidth, paddleOffset, midY, '#FFFFFF');
// Does the actual rendering
function render() {
ctx.clearRect(0, 0, cWidth, cHeight);
playerPaddle.draw(ctx);
}
//Event Handlers
canvas.addEventListener('mousemove', function(e) {
e.preventDefault();
var position = canvas.getBoundingClientRect();
var y = e.clientY - position.top;
playerPaddle.updatePos(y);
}, false);
这里还有一个我正在描述的行为示例:http: //jsfiddle.net/u57QD/