Я реализовал базовый изометрический тайловый движок, который можно исследовать, перетаскивая карту мышью. Пожалуйста, посмотрите на скрипку ниже и перетащите ее:
Разобранный код (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/