を使用して pong クローンを作成しようとしてい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
ただし、イベントが発生している場所にパドルの上部を正確に描画しているため、これは正しく機能していないようです。
ただし、イベントの y 位置から差し引くとうまくいきますがthis.h
、これはまったく意味がありません。
以下は、パドルをインスタンス化し、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/