Newer
Older
kotlin-webgl-test / src / main / kotlin / com / persesgames / input / Keys.kt
package com.persesgames.input

import com.persesgames.game.Game
import org.w3c.dom.events.Event
import org.w3c.dom.events.KeyboardEvent
import org.w3c.dom.events.MouseEvent
import kotlin.browser.document
import kotlin.js.Date

/**
 * User: rnentjes
 * Date: 18-5-16
 * Time: 12:18
 */

enum class KeyCode(val keyCode: Int) {
    LEFT(37),
    UP(38),
    DOWN(40),
    RIGHT(39),
    SPACE(32),
    MINUS(109),
    PLUS(107),
}

interface InputProcessor {

    fun keyPressed(charCode: Int)

    fun keyDown(keyCode: Int)

    fun keyUp(keyCode: Int)

    fun pointerClick(pointer: Int, x: Float, y: Float)

}

open class EmptyInputProcessor : InputProcessor {

    override fun pointerClick(pointer: Int, x: Float, y: Float) { }

    override fun keyDown(keyCode: Int) { }

    override fun keyPressed(charCode: Int) { }

    override fun keyUp(keyCode: Int) { }
}

object Keys {

    private val keys: MutableMap<Int, Double> = HashMap()
    private var inputProcesser: InputProcessor = EmptyInputProcessor()

    init {
        val body = document.body
        if (body != null) {
            body.onkeydown = {
                Keys.keyDown(it)
            }

            body.onkeyup = {
                Keys.keyUp(it)
            }

            body.onkeypress = {
                Keys.keyPress(it)
            }

            body.onclick = {
                Keys.mouseClick(it)
            }

            body.onmousedown = {
                Keys.mouseMove(it)
            }

            body.onmouseup = {
                Keys.mouseMove(it)
            }

            body.onmousemove = {
                Keys.mouseMove(it)
            }
        } else {
            console.log("Can't register key events, document.body is null!?")
        }
    }

    fun setInputProcessor(processor: InputProcessor) {
        this.inputProcesser = processor
    }

    private fun keyDown(key: Event) {
        if (key is KeyboardEvent) {
            keys.put(key.keyCode, Date().getTime())

            inputProcesser.keyDown(key.keyCode)
        }
    }

    private fun keyUp(key: Event) {
        if (key is KeyboardEvent) {
            inputProcesser.keyUp(key.keyCode)

            keys.remove(key.keyCode)
        }
    }

    private fun keyPress(key: Event) {
        if (key is KeyboardEvent) {
            inputProcesser.keyPressed(key.charCode)
        }
    }

    private fun mouseClick(event: Event) {
        if (event is MouseEvent) {
            val vx: Float = Game.view.screenToGameCoordX(event.clientX.toFloat())
            val vy: Float = Game.view.screenToGameCoordY(event.clientY.toFloat())

            inputProcesser.pointerClick(event.button.toInt(), vx, vy)
        }
    }

    private fun mouseMove(event: Event) {
        if (event is MouseEvent) {
            val vx: Float = Game.view.screenToGameCoordX(event.clientX.toFloat())
            val vy: Float = Game.view.screenToGameCoordY(event.clientY.toFloat())


        }
    }

    fun isDown(keyCode: Int) = keys.containsKey(keyCode)

    fun isDown(keyCode: KeyCode) = keys.containsKey(keyCode.keyCode)

    fun wasPressed(keyCode: Int, delta: Double): Boolean {
        val time = keys[keyCode]

        return (time != null && time > (Date().getTime() - delta))
    }

}