マップをマウスでドラッグして探索できる基本的なアイソメ タイル エンジンを実装しました。以下のフィドルを見て、ドラッグしてください:
分解されたコードは次のとおりです (CoffeeScript):
ドロー機能
draw = ->
requestAnimFrame draw
canvas.width = canvas.width
for row in [0..width]
for col in [0..height]
xpos = (row - col) * tileHeight + width
xpos += (canvas.width / 2) - (tileWidth / 2) + scrollPosition.x
ypos = (row + col) * (tileHeight / 2) + height + scrollPosition.y
context.drawImage(defaultTile, Math.round(xpos), Math.round(ypos), tileWidth, tileHeight)
マウスドラッグスクロールコントロール
scrollPosition =
x: 0
y: 0
dragHelper =
active: false
x: 0
y: 0
window.addEventListener 'mousedown', (e) =>
handleMouseDown(e)
, false
window.addEventListener 'mousemove', (e) =>
handleDrag(e)
, false
window.addEventListener 'mouseup', (e) =>
handleMouseUp(e)
, false
handleDrag = (e) =>
e.preventDefault()
if dragHelper.active
x = e.clientX
y = e.clientY
scrollPosition.x -= Math.round((dragHelper.x - x) / 28)
scrollPosition.y -= Math.round((dragHelper.y - y) / 28)
handleMouseUp = (e) =>
e.preventDefault()
dragHelper.active = false
handleMouseDown = (e) =>
e.preventDefault()
x = e.clientX
y = e.clientY
dragHelper.active = true
dragHelper.x = x
dragHelper.y = y
問題
フィドルからわかるように、ドラッグ操作は問題ありませんが、完全ではありません。ドラッグ操作をよりスムーズにするためにコードを変更するにはどうすればよいですか? 私が望むのは、ドラッグしている間、クリックしたマップのポイントがマウスポイントの下に留まるようにすることです。ここで行ったのと同じ: http://craftyjs.com/demos/isometric/