aboutsummaryrefslogtreecommitdiff
path: root/src/input.lua
blob: 5dacd81c4acc29830b16f83aa21acbdba43012a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
local lk = love.keyboard
local lm = love.mouse

local inputs = {}
local keyEvents = {}
local mouseEvents = {}

---@param triggers table pair like this {type, keycode/name}
function register_input(name, triggers)
  inputs[name] = triggers
end

function input_direction(left, right, up, down)
  return bton(is_input_pressed(right)) - bton(is_input_pressed(left)),
      bton(is_input_pressed(down)) - bton(is_input_pressed(up))
end

function is_input_just_pressed(name)
  local inp = inputs[name]
  local type
  local code

  for _, trig in ipairs(inp) do
    type = trig[1]
    code = trig[2]

    if type == "mouse" then
      if mouseEvents[code] == "Pressed" then return true end
    end
    if type == "key" then
      if keyEvents[code] == "Pressed" then return true end
    end
  end
end

function is_input_just_released(name)
  local inp = inputs[name]
  local type
  local code

  for _, trig in ipairs(inp) do
    type = trig[1]
    code = trig[2]

    if type == "mouse" then
      if mouseEvents[code] == "Released" then return true end
    end
    if type == "key" then
      if keyEvents[code] == "Released" then return true end
    end
  end
end

function is_input_pressed(name)
  local inp = inputs[name]
  local type
  local code

  for _, trig in ipairs(inp) do
    type = trig[1]
    code = trig[2]

    if type == "mouse" then
      if lm.isDown(code) then return true end
    end
    if type == "key" then
      if lk.isDown(code) then return true end
    end
  end
end

function love.keypressed(key)
  keyEvents[key] = "Pressed"
end

function love.keyreleased(key)
  keyEvents[key] = "Released"
end

function love.mousepressed(_, _, btn)
  mouseEvents[btn] = "Pressed"
  local sx, sy = love.mouse.getPosition() --get_mouse_pos()
  im.mousepressed(sx, sy, btn)
end

function love.mousereleased(_, _, btn)
  mouseEvents[btn] = "Released"
  local sx, sy = love.mouse.getPosition() --get_mouse_pos()
  im.mousereleased(sx, sy, btn)
end

function love.mousemoved(_, _, dx, dy)
  local sx, sy = love.mouse.getPosition() --get_mouse_pos()
  -- local scrw, scrh = love.graphics.getDimensions()
  -- local rdx, rdy = dx / scrw * SCR_WIDTH, dy / scrh * SCR_HEIGHT
  im.mousemoved(sx, sy, dx, dy)
end

function love.wheelmoved(...)
  im.wheelmoved(...)
end

function get_mouse_pos()
  local scrw, scrh = love.graphics.getDimensions()
  local offset_x = (scrw - SCR_WIDTH * WindowScale) / 2
  local offset_y = (scrh - SCR_HEIGHT * WindowScale) / 2

  return (lm.getX() - offset_x) / WindowScale,
      (lm.getY() - offset_y) / WindowScale
end

function input_step()
  for key in pairs(keyEvents) do
    keyEvents[key] = nil
  end
  for key in pairs(mouseEvents) do
    mouseEvents[key] = nil
  end
end