@benev/nubs
Version:
user-input system for web games
98 lines (83 loc) • 2.61 kB
text/typescript
import {Query} from "../types.js"
function setTranslate(xPos: string | number, yPos: string | number, el: HTMLElement) {
el.style.transform = "translate3d(" + xPos + "px, " + yPos + "px, 0)"
}
export function prepDraggableContainerEvents(query: Query) {
const {element} = query()
let active = false
let currentX: number
let currentY: number
let initialX: number
let initialY: number
let xOffset = 0
let yOffset = 0
function pointerup(e: MouseEvent) {
// boundaries
const element = query().element
if (element.getBoundingClientRect().x <= 0) {
const resetX = currentX += Math.abs(element.getBoundingClientRect().x)
setTranslate(resetX, currentY, element)
}
if (element.getBoundingClientRect().y <= 0) {
const resetY = currentY += Math.abs(element.getBoundingClientRect().y)
setTranslate(currentX, resetY, element)
}
if (element.getBoundingClientRect().y + element.clientHeight >= window.innerHeight) {
const calculated = (element.getBoundingClientRect().y + element.clientHeight) - window.innerHeight
const resetY = currentY -= calculated
setTranslate(currentX, resetY, element)
}
if (element.getBoundingClientRect().x + element.clientWidth >= window.innerWidth) {
const calculated = (element.getBoundingClientRect().x + element.clientWidth) - window.innerWidth
const resetX = currentX -= calculated
setTranslate(resetX, currentY, element)
}
//
initialX = currentX
initialY = currentY
currentX = initialX
currentY = initialY
xOffset = currentX
yOffset = currentY
active = false
}
document.addEventListener('pointerup', pointerup)
return {
touchstart: (e: TouchEvent) => {
const draggableItem = query().draggableItem
initialX = e.touches[0].clientX - xOffset
initialY = e.touches[0].clientY - yOffset
if (e.target === draggableItem) {
active = true
}
},
touchmove: (e: TouchEvent) => {
if (active) {
e.preventDefault()
currentX = e.touches[0].clientX - initialX
currentY = e.touches[0].clientY - initialY
xOffset = currentX
yOffset = currentY
setTranslate(currentX, currentY, element)
}
},
mousedown: (e: MouseEvent) => {
const draggableItem = query().draggableItem
initialX = e.clientX - xOffset
initialY = e.clientY - yOffset
if (e.target === draggableItem) {
active = true
}
},
mousemove: (e: MouseEvent) => {
if (active) {
e.preventDefault()
currentX = e.clientX - initialX
currentY = e.clientY - initialY
xOffset = currentX
yOffset = currentY
setTranslate(currentX, currentY, element)
}
}
}
}