From f398d62af272ec3e4c2aed64baac8f3daa73157e Mon Sep 17 00:00:00 2001 From: Adolfo Reyna Date: Thu, 12 Feb 2026 21:31:15 -0500 Subject: [PATCH] Add renderer.text_scaled() Lua binding lua_bindings.cpp: - Added new lua_renderer_text_scaled() function - Wraps renderer->draw_string_scaled() with proper scale support - Registered as renderer.text_scaled(x, y, text, on, scale) - Scale parameter defaults to 1 if omitted Updated all 4 games to use text_scaled(): - simon_says.lua: All text now uses text_scaled with scale=2 - tic_tac_toe.lua: All text now uses text_scaled with scale=2 - memory_match.lua: All text now uses text_scaled with scale=2 - 2048.lua: All text now uses text_scaled with scale=2 This properly uses the C++ renderer's scaled text rendering instead of workarounds in Lua, providing better performance and consistency. --- games/lua_bindings.cpp | 21 +++++++++++++++++++++ games/lua_examples/2048.lua | 22 +++++++++++----------- games/lua_examples/memory_match.lua | 16 ++++++++-------- games/lua_examples/simon_says.lua | 16 ++++++++-------- games/lua_examples/tic_tac_toe.lua | 14 +++++++------- 5 files changed, 55 insertions(+), 34 deletions(-) diff --git a/games/lua_bindings.cpp b/games/lua_bindings.cpp index 538982a..d9e9f61 100644 --- a/games/lua_bindings.cpp +++ b/games/lua_bindings.cpp @@ -125,6 +125,23 @@ static int lua_renderer_text(lua_State* L) { return 0; } +// renderer.text_scaled(x, y, text, on, scale) +static int lua_renderer_text_scaled(lua_State* L) { + LuaGame* game = get_game(L); + if (!game) return 0; + + int x = luaL_checkinteger(L, 1); + int y = luaL_checkinteger(L, 2); + const char* text = luaL_checkstring(L, 3); + bool on = lua_toboolean(L, 4); + int scale = lua_isnone(L, 5) ? 1 : luaL_checkinteger(L, 5); + + game->renderer->set_text_color(on); + game->renderer->draw_string_scaled(x, y, text, scale, 1); + + return 0; +} + // renderer.triangle(x0, y0, x1, y1, x2, y2, on, filled) static int lua_renderer_triangle(lua_State* L) { LuaGame* game = get_game(L); @@ -281,6 +298,10 @@ void lua_bindings_register(lua_State* L, LuaGame* game) { lua_pushcfunction(L, lua_renderer_text); lua_settable(L, -3); + lua_pushstring(L, "text_scaled"); + lua_pushcfunction(L, lua_renderer_text_scaled); + lua_settable(L, -3); + lua_pushstring(L, "triangle"); lua_pushcfunction(L, lua_renderer_triangle); lua_settable(L, -3); diff --git a/games/lua_examples/2048.lua b/games/lua_examples/2048.lua index d7d0644..89da5fd 100644 --- a/games/lua_examples/2048.lua +++ b/games/lua_examples/2048.lua @@ -122,8 +122,8 @@ function draw() local start_y = get_grid_start_y() if state == STATE_MENU then - renderer.text(game.width() / 2 - 15, game.height() / 2 - 30, "2048", true, 2) - renderer.text(game.width() / 2 - 50, game.height() / 2, "Tap to Start", true, 2) + renderer.text_scaled(game.width() / 2 - 15, game.height() / 2 - 30, "2048", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() / 2, "Tap to Start", true, 2) elseif state == STATE_PLAYING or state == STATE_WIN or state == STATE_GAME_OVER then -- Draw grid @@ -143,27 +143,27 @@ function draw() -- Draw value (simplified) local text = tostring(value) if string.len(text) <= 2 then - renderer.text(tile_x + 2, tile_y + 2, text, false, 2) + renderer.text_scaled(tile_x + 2, tile_y + 2, text, false, 2) else - renderer.text(tile_x + 1, tile_y + 2, text, false, 2) + renderer.text_scaled(tile_x + 1, tile_y + 2, text, false, 2) end end end end -- Draw score - renderer.text(10, 10, "Score: " .. tostring(game.vars.score), true, 2) + renderer.text_scaled(10, 10, "Score: " .. tostring(game.vars.score), true, 2) if state == STATE_WIN then - renderer.text(game.width() / 2 - 30, game.height() / 2 - 20, "YOU WIN!", true, 2) - renderer.text(game.width() / 2 - 60, game.height() / 2, "Tap up: Continue", true, 2) - renderer.text(game.width() / 2 - 50, game.height() / 2 + 15, "Tap down: Menu", true, 2) + renderer.text_scaled(game.width() / 2 - 30, game.height() / 2 - 20, "YOU WIN!", true, 2) + renderer.text_scaled(game.width() / 2 - 60, game.height() / 2, "Tap up: Continue", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() / 2 + 15, "Tap down: Menu", true, 2) end if state == STATE_GAME_OVER then - renderer.text(game.width() / 2 - 40, game.height() / 2, "GAME OVER", true, 2) - renderer.text(game.width() / 2 - 30, game.height() / 2 + 15, "Score: " .. tostring(game.vars.score), true, 2) - renderer.text(game.width() / 2 - 60, game.height() / 2 + 30, "Tap to Menu", true, 2) + renderer.text_scaled(game.width() / 2 - 40, game.height() / 2, "GAME OVER", true, 2) + renderer.text_scaled(game.width() / 2 - 30, game.height() / 2 + 15, "Score: " .. tostring(game.vars.score), true, 2) + renderer.text_scaled(game.width() / 2 - 60, game.height() / 2 + 30, "Tap to Menu", true, 2) end end end diff --git a/games/lua_examples/memory_match.lua b/games/lua_examples/memory_match.lua index 51af1eb..cde0f26 100644 --- a/games/lua_examples/memory_match.lua +++ b/games/lua_examples/memory_match.lua @@ -134,9 +134,9 @@ function draw() local start_y = get_grid_start_y() if state == STATE_MENU then - renderer.text(game.width() / 2 - 40, game.height() / 2 - 40, "MEMORY MATCH", true, 2) - renderer.text(game.width() / 2 - 50, game.height() / 2 - 10, "Find all pairs", true, 2) - renderer.text(game.width() / 2 - 50, game.height() / 2 + 20, "Tap to Start", true, 2) + renderer.text_scaled(game.width() / 2 - 40, game.height() / 2 - 40, "MEMORY MATCH", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() / 2 - 10, "Find all pairs", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() / 2 + 20, "Tap to Start", true, 2) elseif state == STATE_PLAYING or state == STATE_GAME_OVER then -- Draw grid @@ -151,7 +151,7 @@ function draw() -- Show card value renderer.rect(x, y, card_size, card_size, true, true) local text = tostring(card.id) - renderer.text(x + math.floor(card_size / 2 - 2), y + math.floor(card_size / 2 - 2), text, false, 2) + renderer.text_scaled(x + math.floor(card_size / 2 - 2), y + math.floor(card_size / 2 - 2), text, false, 2) else -- Face down (outline) renderer.rect(x, y, card_size, card_size, true, false) @@ -160,12 +160,12 @@ function draw() end -- Draw stats - renderer.text(10, 10, "Pairs: " .. tostring(game.vars.score) .. "/" .. tostring((GRID_COLS * GRID_ROWS) / 2), true, 2) - renderer.text(10, 25, "Moves: " .. tostring(game.vars.moves), true, 2) + renderer.text_scaled(10, 10, "Pairs: " .. tostring(game.vars.score) .. "/" .. tostring((GRID_COLS * GRID_ROWS) / 2), true, 2) + renderer.text_scaled(10, 25, "Moves: " .. tostring(game.vars.moves), true, 2) if state == STATE_GAME_OVER then - renderer.text(game.width() / 2 - 40, 5, "YOU WIN!", true, 2) - renderer.text(game.width() / 2 - 50, game.height() - 20, "Tap to Menu", true, 2) + renderer.text_scaled(game.width() / 2 - 40, 5, "YOU WIN!", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() - 20, "Tap to Menu", true, 2) end end end diff --git a/games/lua_examples/simon_says.lua b/games/lua_examples/simon_says.lua index f7ef9a5..6b8bfa5 100644 --- a/games/lua_examples/simon_says.lua +++ b/games/lua_examples/simon_says.lua @@ -148,9 +148,9 @@ function draw() local buttons = get_buttons() if state == STATE_MENU then - renderer.text(game.width() / 2 - 40, game.height() / 2 - 40, "SIMON SAYS", true, 2) - renderer.text(game.width() / 2 - 50, game.height() / 2 - 10, "Repeat the sequence", true, 2) - renderer.text(game.width() / 2 - 50, game.height() / 2 + 20, "Tap to Start", true, 2) + renderer.text_scaled(game.width() / 2 - 40, game.height() / 2 - 40, "SIMON SAYS", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() / 2 - 10, "Repeat the sequence", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() / 2 + 20, "Tap to Start", true, 2) else -- Draw buttons with highlight @@ -161,16 +161,16 @@ function draw() end -- Draw score - renderer.text(10, 10, "Level: " .. tostring(game.vars.score + 1), true, 2) + renderer.text_scaled(10, 10, "Level: " .. tostring(game.vars.score + 1), true, 2) if state == STATE_PLAYING and game.vars.waiting_for_input then - renderer.text(game.width() / 2 - 40, game.height() - 20, "Your turn!", true, 2) + renderer.text_scaled(game.width() / 2 - 40, game.height() - 20, "Your turn!", true, 2) end if state == STATE_GAME_OVER then - renderer.text(game.width() / 2 - 40, game.height() / 2 - 20, "GAME OVER", true, 2) - renderer.text(game.width() / 2 - 30, game.height() / 2, "Level: " .. tostring(game.vars.score + 1), true, 2) - renderer.text(game.width() / 2 - 60, game.height() / 2 + 20, "Tap to Restart", true, 2) + renderer.text_scaled(game.width() / 2 - 40, game.height() / 2 - 20, "GAME OVER", true, 2) + renderer.text_scaled(game.width() / 2 - 30, game.height() / 2, "Level: " .. tostring(game.vars.score + 1), true, 2) + renderer.text_scaled(game.width() / 2 - 60, game.height() / 2 + 20, "Tap to Restart", true, 2) end end end diff --git a/games/lua_examples/tic_tac_toe.lua b/games/lua_examples/tic_tac_toe.lua index c7a0d2f..1a4958f 100644 --- a/games/lua_examples/tic_tac_toe.lua +++ b/games/lua_examples/tic_tac_toe.lua @@ -128,9 +128,9 @@ function draw() local cell_spacing = 2 if state == STATE_MENU then - renderer.text(game.width() / 2 - 50, game.height() / 2 - 30, "TIC-TAC-TOE", true, 2) - renderer.text(game.width() / 2 - 50, game.height() / 2, "Play vs AI", true, 2) - renderer.text(game.width() / 2 - 50, game.height() / 2 + 20, "Tap to Start", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() / 2 - 30, "TIC-TAC-TOE", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() / 2, "Play vs AI", true, 2) + renderer.text_scaled(game.width() / 2 - 50, game.height() / 2 + 20, "Tap to Start", true, 2) elseif state == STATE_PLAYING or state == STATE_GAME_OVER then -- Draw grid @@ -158,14 +158,14 @@ function draw() if state == STATE_GAME_OVER then if game.vars.winner == 1 then - renderer.text(game.width() / 2 - 30, 10, "YOU WIN!", true, 2) + renderer.text_scaled(game.width() / 2 - 30, 10, "YOU WIN!", true, 2) elseif game.vars.winner == 2 then - renderer.text(game.width() / 2 - 30, 10, "AI WINS!", true, 2) + renderer.text_scaled(game.width() / 2 - 30, 10, "AI WINS!", true, 2) else - renderer.text(game.width() / 2 - 20, 10, "DRAW!", true, 2) + renderer.text_scaled(game.width() / 2 - 20, 10, "DRAW!", true, 2) end - renderer.text(game.width() / 2 - 60, game.height() - 15, "Tap to Menu", true, 2) + renderer.text_scaled(game.width() / 2 - 60, game.height() - 15, "Tap to Menu", true, 2) end end end