Add Lua 5.4 scripting integration for dynamic game loading
- Integrated Lua 5.4 engine (32-bit mode for embedded ARM) - Created LuaGame wrapper class implementing Game interface - Added C++ bindings exposing renderer, game state, and input to Lua - Implemented SD card loader for automatic .lua game discovery - Updated GameLauncher to support std::function for lambda captures - Made Game class members public for Lua bindings access - Added example Lua games: counter, snake, bouncing ball - Included comprehensive API documentation Games can now be written as .lua text files on SD card and loaded without recompilation. Build size: 747KB UF2, Lua VM uses ~50-80KB RAM.
This commit is contained in:
81
games/lua_examples/ball.lua
Normal file
81
games/lua_examples/ball.lua
Normal file
@@ -0,0 +1,81 @@
|
||||
-- NAME: Bouncing Ball
|
||||
-- DESC: Physics demo with state management
|
||||
|
||||
-- States
|
||||
local STATE_PAUSED = 0
|
||||
local STATE_RUNNING = 1
|
||||
|
||||
function init()
|
||||
game.vars.state = STATE_PAUSED
|
||||
game.vars.ball_x = game.width() / 2
|
||||
game.vars.ball_y = game.height() / 2
|
||||
game.vars.vel_x = 3
|
||||
game.vars.vel_y = 2
|
||||
game.vars.radius = 10
|
||||
game.vars.frame_count = 0
|
||||
|
||||
print("Bouncing Ball initialized")
|
||||
end
|
||||
|
||||
function update(event)
|
||||
-- Toggle pause on tap
|
||||
if event.type == INPUT.TOUCH_DOWN or event.type == INPUT.BUTTON_0 or event.type == INPUT.BUTTON_1 then
|
||||
if game.vars.state == STATE_PAUSED then
|
||||
game.vars.state = STATE_RUNNING
|
||||
else
|
||||
game.vars.state = STATE_PAUSED
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
-- Update physics if running
|
||||
if game.vars.state == STATE_RUNNING then
|
||||
-- Move ball
|
||||
game.vars.ball_x = game.vars.ball_x + game.vars.vel_x
|
||||
game.vars.ball_y = game.vars.ball_y + game.vars.vel_y
|
||||
|
||||
-- Bounce off walls
|
||||
if game.vars.ball_x - game.vars.radius < 0 or game.vars.ball_x + game.vars.radius > game.width() then
|
||||
game.vars.vel_x = -game.vars.vel_x
|
||||
game.vars.ball_x = math.max(game.vars.radius, math.min(game.width() - game.vars.radius, game.vars.ball_x))
|
||||
end
|
||||
|
||||
if game.vars.ball_y - game.vars.radius < 0 or game.vars.ball_y + game.vars.radius > game.height() then
|
||||
game.vars.vel_y = -game.vars.vel_y
|
||||
game.vars.ball_y = math.max(game.vars.radius, math.min(game.height() - game.vars.radius, game.vars.ball_y))
|
||||
end
|
||||
|
||||
game.vars.frame_count = game.vars.frame_count + 1
|
||||
return true -- Always redraw when running
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function draw()
|
||||
renderer.clear(false)
|
||||
|
||||
-- Draw ball
|
||||
renderer.circle(game.vars.ball_x, game.vars.ball_y, game.vars.radius, true, true)
|
||||
|
||||
-- Draw trail (previous positions)
|
||||
local trail_radius = game.vars.radius - 2
|
||||
if trail_radius > 2 then
|
||||
renderer.circle(game.vars.ball_x - game.vars.vel_x,
|
||||
game.vars.ball_y - game.vars.vel_y,
|
||||
trail_radius, true, false)
|
||||
end
|
||||
|
||||
-- Draw status
|
||||
if game.vars.state == STATE_PAUSED then
|
||||
renderer.text(10, 10, "PAUSED - Tap to start", true)
|
||||
else
|
||||
renderer.text(10, 10, "Frames: " .. tostring(game.vars.frame_count), true)
|
||||
renderer.text(10, 25, "Tap to pause", true)
|
||||
end
|
||||
|
||||
-- Draw velocity vector
|
||||
local arrow_x = game.vars.ball_x + game.vars.vel_x * 3
|
||||
local arrow_y = game.vars.ball_y + game.vars.vel_y * 3
|
||||
renderer.line(game.vars.ball_x, game.vars.ball_y, arrow_x, arrow_y, true, 2)
|
||||
end
|
||||
Reference in New Issue
Block a user