Files
basic1/games/lua_game.h
Adolfo Reyna 2a472fc29f Add frame tick system for continuous animation
- Added INPUT_FRAME_TICK event type to input_event.h
- Added wants_frame_updates() virtual method to Game base class
- Implemented frame tick logic in main loop (basic1.cpp and emulator/main.cpp)
- Added Lua bindings: game.set_frame_updates(bool) and INPUT.FRAME_TICK
- Updated LuaGame to support frame updates via registry flag
- Updated ball.lua to use continuous frame updates for smooth animation
- Both hardware and emulator now support continuous animation for physics/games
2026-02-07 13:20:10 -05:00

116 lines
3.2 KiB
C++

// ============================================================================
// LUA GAME WRAPPER - HEADER
// ============================================================================
// Allows Lua scripts to implement the Game interface
#ifndef LUA_GAME_H
#define LUA_GAME_H
#include "game.h"
#include <string>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/**
* @brief Game implementation that runs Lua scripts
*
* Loads a .lua file from SD card and calls its init(), update(), and draw()
* functions. The Lua script has access to drawing primitives, input events,
* and persistent state variables.
*/
class LuaGame : public Game {
public:
/**
* @brief Construct a new Lua Game
* @param script_path Path to .lua file on SD card (e.g., "/games/pong.lua")
* @param width Display width in pixels
* @param height Display height in pixels
* @param renderer Pointer to low-level rendering interface
* @param gui Pointer to GUI drawing primitives
* @param input_manager Pointer to input manager
*/
LuaGame(const char* script_path, uint16_t width, uint16_t height,
LowLevelRenderer* renderer, LowLevelGUI* gui, InputManager* input_manager);
/**
* @brief Destructor - clean up Lua state
*/
~LuaGame() override;
/**
* @brief Initialize game - calls Lua init() function
*/
void init() override;
/**
* @brief Update game logic - calls Lua update(event) function
* @param event Input event from InputManager
* @return true if screen redraw is needed
*/
bool update(const InputEvent& event) override;
/**
* @brief Draw the game - calls Lua draw() function
*/
void draw() override;
/**
* @brief Check if game wants to exit
* @return true if Lua script requested exit
*/
bool wants_to_exit() const override;
/**
* @brief Check if game wants continuous frame updates
* @return true if Lua script set __wants_frame_updates flag
*/
bool wants_frame_updates() const override;
/**
* @brief Get Lua state for bindings access
*/
lua_State* get_lua_state() { return L; }
/**
* @brief Check if Lua script loaded successfully
*/
bool is_loaded() const { return loaded; }
/**
* @brief Get last error message if load failed
*/
const char* get_error() const { return error_message.c_str(); }
private:
lua_State* L;
std::string script_path;
std::string error_message;
bool loaded;
/**
* @brief Load and execute Lua script file from SD card
* @return true if successful, false on error
*/
bool load_script();
/**
* @brief Call a Lua function safely with error handling
* @param func_name Name of Lua function to call
* @param nargs Number of arguments on stack
* @param nresults Number of expected return values
* @return true if successful, false on error
*/
bool call_lua_function(const char* func_name, int nargs = 0, int nresults = 0);
/**
* @brief Report Lua error to console and store message
*/
void report_error(const char* context);
};
#endif // LUA_GAME_H