move repeatedly in direction

This commit is contained in:
Your Name 2026-08-07 02:01:39 -04:00
parent e065ab83de
commit f8e3d78332
5 changed files with 126 additions and 62 deletions

View file

@ -3,8 +3,48 @@ Input = {}
Input.playermovekeys = { up = "up", down = "down", left = "left", right = "right" }
Input.playerswitchkeys = { ["1"] = "1", ["2"] = "2", ["3"] = "3"}
Input.colorfromkey = {"red", "green", "blue"}
Input.moveRepeatDelay = .28
Input.moveRepeatInterval = .09
Input.heldMoveKey = nil
Input.moveRepeatElapsed = 0
Input.moveRepeatStarted = false
function Input:handler(dt)
local key = self.heldMoveKey
if key and not love.keyboard.isDown(key) then
key = nil
for _, candidate in ipairs({"up", "down", "left", "right"}) do
if love.keyboard.isDown(candidate) then key = candidate; break end
end
self.heldMoveKey = key
self.moveRepeatElapsed = 0
self.moveRepeatStarted = false
end
if not key then return nil end
self.moveRepeatElapsed = self.moveRepeatElapsed + dt
if not self.moveRepeatStarted then
if self.moveRepeatElapsed >= self.moveRepeatDelay then
self.moveRepeatElapsed = 0
self.moveRepeatStarted = true
return key
end
elseif self.moveRepeatElapsed >= self.moveRepeatInterval then
self.moveRepeatElapsed = 0
return key
end
end
function Input:beginMove(key)
self.heldMoveKey = key
self.moveRepeatElapsed = 0
self.moveRepeatStarted = false
end
function Input:stopMoveRepeat()
self.heldMoveKey = nil
self.moveRepeatElapsed = 0
self.moveRepeatStarted = false
end
@ -24,4 +64,4 @@ end
function Input.playerColor(key)
return Input.colorfromkey[tonumber(key)]
end
end

View file

@ -41,7 +41,12 @@ function love.load()
end
function love.update(dt)
Input:handler(dt)
if editorView == "world" then
Input:stopMoveRepeat()
else
local repeatedMove = Input:handler(dt)
if repeatedMove then currentRoom:movePlayer(repeatedMove) end
end
currentRoom:update(dt)
-- if love.keyboard.isDown("w") then worldSha = worldSha + 1 end
@ -94,6 +99,7 @@ end
function love.keypressed(key)
if editorView ~= "world" and Input.isPlayerMove(key) then
Input:beginMove(key)
currentRoom:movePlayer(key)
elseif editorView ~= "world" and Input.isPlayerSwitch(key) then
local c = Input.playerColor(key)

View file

@ -489,7 +489,10 @@ function Room:switchCheck()
local onSwitches = {}
for _, switch in pairs(switchArray) do
local targetCell = self:getCellInMatrix(self.collidableMatrices[color], switch:getGridPos())
if targetCell then
local player = self.player[color]
-- Players are not stored in collidableMatrices, but a colour copy
-- standing on its matching switch presses it just like a block does.
if targetCell or (player and player:occupiesCell(switch:getGridPos())) then
--switch is on
switch:activate()
table.insert(onSwitches, switch) --doesn't rly matter what we put here as long as it's true-y

10
rooms/room_11_09.sav Normal file
View file

@ -0,0 +1,10 @@
{
objects={
{
y=1,
class="player",
color="red",
x=1
}
}
}

View file

@ -1,146 +1,151 @@
{
width=18,
height=18,
rooms={
{
y=11,
x=9,
name="start"
name="start",
x=9
},
{
y=10,
x=10,
name="3"
name="3",
x=10
},
{
y=10,
x=11,
name="4"
name="4",
x=11
},
{
y=10,
x=12,
name="5"
name="5",
x=12
},
{
y=9,
x=12,
name="village_1"
name="village_1",
x=12
},
{
y=8,
x=12,
name="village_2"
name="village_2",
x=12
},
{
y=8,
x=13,
name="village_3"
name="village_3",
x=13
},
{
y=8,
x=11,
name="village_4"
name="village_4",
x=11
},
{
y=7,
x=11,
name="yellow_1"
name="yellow_1",
x=11
},
{
y=6,
x=11,
name="yellow_3"
name="yellow_3",
x=11
},
{
y=7,
x=12,
name="yellow_2"
name="yellow_2",
x=12
},
{
y=5,
x=11,
name="yellow_4"
name="yellow_4",
x=11
},
{
y=4,
x=11,
name="yellow_5"
name="yellow_5",
x=11
},
{
y=5,
x=10,
name="yellow_6"
name="yellow_6",
x=10
},
{
y=1,
x=1,
name="default"
name="default",
x=1
},
{
y=1,
x=3,
name="old_yellow_3"
name="old_yellow_3",
x=3
},
{
y=1,
x=5,
name="test_patt"
name="test_patt",
x=5
},
{
y=1,
x=7,
name="test_patt_update"
name="test_patt_update",
x=7
},
{
y=1,
x=9,
name="white_asymmetrical"
name="white_asymmetrical",
x=9
},
{
y=1,
x=11,
name="white_ok"
name="white_ok",
x=11
},
{
y=1,
x=13,
name="white_primary"
name="white_primary",
x=13
},
{
y=1,
x=15,
name="yellow_arches"
name="yellow_arches",
x=15
},
{
y=1,
x=17,
name="yellow_asymmetrical"
name="yellow_asymmetrical",
x=17
},
{
y=3,
x=1,
name="yellow_cc_moustache"
name="yellow_cc_moustache",
x=1
},
{
y=3,
x=3,
name="yellow_color_changing_levvel_1"
name="yellow_color_changing_levvel_1",
x=3
},
{
y=3,
x=5,
name="yellow_skull"
name="yellow_skull",
x=5
},
{
y=3,
x=7,
name="yellow_smile"
name="yellow_smile",
x=7
},
{
y=10,
x=9,
name="2"
name="2",
x=9
},
{
y=9,
name="room_11_09",
x=11
}
}
},
width=18,
height=18
}