gamepadzilla
Version:
A plug-and-play gamepad frontend framework for HTML5 mobile games, supporting both virtual and physical joysticks. No scripting required.
60 lines (47 loc) • 1.98 kB
text/typescript
import { Keycode, KeycodeMap, Vector2d, Range } from "./interface"
function interpolation(num: number, input: Range, output: Range): number {
return (num - input.min) * (output.max - output.min) / (input.max - input.min) + output.min;
}
function clamp(num: number, range: Range): number {
return Math.min(Math.max(num, range.min), range.max)
}
function normalize(num: number): number {
return interpolation(clamp(num, {min: 0, max: 1}), {min: 0, max: 1}, {min: -1, max: 1})
}
function desnormalize(num: number): number {
return interpolation(clamp(num, {min: -1, max: 1}), {min: -1, max: 1}, {min: 0, max: 1})
}
function nestFinger(center: Vector2d, fingers: Array<Vector2d>): {dis: number, pos: Vector2d} {
if (fingers.length == 0) {
return {dis: 0, pos: center}
}
let shortestDistance : number = Number.MAX_SAFE_INTEGER
let closestFinger: Vector2d = fingers[0]
fingers.forEach(finger => {
const distance = Math.sqrt((finger.x - center.x) ** 2 + (finger.y - center.y) ** 2)
if (distance < shortestDistance) {
shortestDistance = distance
closestFinger = finger
}
})
return {dis: shortestDistance, pos: closestFinger}
}
function getKeyCodes(from: KeycodeMap, txt: string) {
const tokens = txt.trim().split(' ').filter(token => token in from)
const keycodes: Array<Keycode> = []
tokens.forEach(token => {
keycodes.push({
code: token,
key: from[token].key,
keyCode: from[token].keyCode,
})
})
return keycodes
}
export function tokens(attribute: string | undefined, defaultValue: string, count: number) {
const value = attribute? attribute: defaultValue
const splited = value.split(' ')
const values = splited.length === count? splited: (new Array(count)).fill(splited[0])
return values as Array<string>
}
export {nestFinger, getKeyCodes, clamp, interpolation, normalize, desnormalize}