すでに何かがあるかどうかはわかりませんが、Lua を C アプリケーションに埋め込み、カスタム関数で拡張するのは非常に簡単です (C を知っている場合)。グラフィックについては、SDLとSDL_gfxをお勧めします。
編集
申し訳ありませんが、Linux は何を使用しているのかわかりません。また、SDL_gfx は行の幅をサポートしていません...
apt-get install libsdl-gfx1.2-dev liblua5.1-0-dev
メイクファイル:
CC = gcc
CFLAGS = -Wall -O2
CFLAGS += $(shell pkg-config SDL_gfx --cflags)
LIBS += $(shell pkg-config SDL_gfx --libs)
CFLAGS += $(shell pkg-config lua5.1 --cflags)
LIBS += $(shell pkg-config lua5.1 --libs)
all: test
test.o: test.c
$(CC) $(CFLAGS) -c -o $@ $<
test: test.o
$(CC) -o $@ $< $(LIBS)
.PHONY: clean
clean:
-rm -f test *.o
test.c:
#include <SDL.h>
#include <SDL_gfxPrimitives.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#define lua_toUINT(L,i) ((unsigned int)lua_tointeger(L,(i)))
static SDL_Surface *out;
/* draw_circle(x, y, radius, color) */
static int draw_circle(lua_State *L) {
unsigned int x, y, r, color;
x = lua_toUINT(L, 1);
y = lua_toUINT(L, 2);
r = lua_toUINT(L, 3);
color = (lua_toUINT(L, 4) << 8) | 0xff;
circleColor(out, x, y, r, color);
return 0;
}
/* draw_line(x1, y1, x2, y2, width, color) */
static int draw_line(lua_State *L) {
unsigned int x1, y1, x2, y2, color;
x1 = lua_toUINT(L, 1);
y1 = lua_toUINT(L, 2);
x2 = lua_toUINT(L, 3);
y2 = lua_toUINT(L, 4);
/* width ignored SDL_gfx have not such thing */
color = (lua_toUINT(L, 6) << 8) | 0xff;
lineColor(out, x1, y1, x2, y2, color);
return 0;
}
int main (int argc, char *argv[]) {
SDL_Event event;
int over = 0;
lua_State *L;
L = lua_open();
luaL_openlibs(L);
lua_register(L, "draw_circle", draw_circle);
lua_register(L, "draw_line", draw_line);
SDL_Init(SDL_INIT_VIDEO);
out = SDL_SetVideoMode(640, 480, 0, 0);
(void)luaL_dofile(L,"script.lua");
SDL_UpdateRect(out, 0, 0, 0, 0);
while (!over) {
if (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT)
over = 1;
}
}
SDL_Quit();
lua_close(L);
return 0;
}
そして、ここにあります...