その関数で使用しているmouseXプロパティとmouseYプロパティは、他の場所で定義されているようです。つまり、この関数の外部で変数が更新されると、drawXとdrawYの更新に使用している数値も変更されます。
あなたがする必要があるのは、作成時にmouseXとmouseYのローカルコピーを追跡することです。コードの残りの部分がどのように見えるかはわかりませんが、推測します。
function Bullet(x, y) {
this.srcX = x;
this.srcY = y;
// keep track of original mouse coordinates
this.mouseX = mouseX;
this.mouseY = mouseY;
}
Bullet.prototype.draw = function() {
this.drawX += (this.mouseX - this.drawX) * 0.01;
this.drawY += (this.mouseY - this.drawY) * 0.01;
ctxbullet.drawImage(
imgSprite,
this.srcX, this.srcY,
this.width, this.height,
this.drawX, this.drawY,
10, 8
);
};
これにより、弾丸が作成されたときに常にマウス座標に向かって移動するようになりますが、すぐに別の問題が発生します。速度はそれらのマウス座標からの弾丸の距離に相対的であるため(これが一貫性のない速度を経験している理由です)、弾丸はマウス座標で停止するまで遅くなります。
あなたがする必要があるのは、srcポイントからマウスポイントまでのベクトルを希望の速度で作成することです。これにより、弾丸は無限大のベクトルに従うことができます(ただし、実際には無限大ではなく、範囲外になったら削除することをお勧めします)。
function Bullet(x, y) {
var dX = mouseX - x,
dY = mouseY - y,
dist = Math.sqrt(dX * dX + dY * dY)
;
// we want our deltas to be proportions of the total distance
this.dX = dX / dist;
this.dY = dY / dist;
this.speed = 5; // arbitrary number
}
Bullet.prototype.draw = function() {
// I didn't test this, but I think it works
this.drawX += this.dX * this.speed;
this.drawY += this.dY * this.speed;
ctxbullet.drawImage(
imgSprite,
this.srcX, this.srcY,
this.width, this.height,
this.drawX, this.drawY,
10, 8
);
}