bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

Luaでメニューを調整できるようにしてみた

メニューの位置の調整と項目の追加をできるようにした。

lua_MenuPosXとlua_MenuPosYを弄るとメニューの位置が変わる。
lua_MenuTableに項目を追加するとitem="○○"の○○の項目が増える

-- menu table

-- menu position
lua_MenuPosX = 64
lua_MenuPosY = 32

-- create table
lua_MenuTable = {}

-- insert items
lua_MenuTable[1] = { item="項目1" };
lua_MenuTable[2] = { item="項目2" };
lua_MenuTable[3] = { item="項目3" };
lua_MenuTable[4] = { item="戻る" };

-- get item num in lua_MenuTable
function getTableNum()
	return table.maxn(lua_MenuTable)
end

-- get item in lua_MenuTable
-- start index is 0
function getTableItem(index)
	if index < getTableNum() then
		return lua_MenuTable[index+1].item
	else
		return nil
	end
end

C++コードだが、エラーチェックとしてない。

void cTestLuaModule::createMenuItem()
{
	lua_getglobal(m_pLuaState, "lua_MenuPosX");
	lua_isnumber(m_pLuaState, -1);
	m_PosX = lua_tointeger(m_pLuaState, -1);
	lua_pop(m_pLuaState, 1);
	
	lua_getglobal(m_pLuaState, "lua_MenuPosY");
	lua_isnumber(m_pLuaState, -1);
	m_PosY = lua_tointeger(m_pLuaState, -1);
	lua_pop(m_pLuaState, 1);

	lua_getglobal(m_pLuaState, "getTableNum");
	if(0 != lua_pcall(m_pLuaState, 0, 1, 0)) {
		perror(lua_tostring(m_pLuaState, -1));
	}
	m_MenuItemNum = 0;
	if(lua_isnumber(m_pLuaState, -1)) {
		m_MenuItemNum = lua_tointeger(m_pLuaState, -1);
		lua_pop(m_pLuaState, 1);
	}

	m_pMenuItem = new TCHAR*[m_MenuItemNum];
	int len = 0;
	int ret = 0;
	for(int i = 0; i < m_MenuItemNum; ++i) {
		lua_getglobal(m_pLuaState, "getTableItem");
		lua_pushnumber(m_pLuaState, i);
		ret = lua_pcall(m_pLuaState, 1, 1, 0);
		if(0 == ret) {
			const char* str = lua_tostring(m_pLuaState, -1);
			len = strlen(str)+1;
			m_pMenuItem[i] = new TCHAR[len];
			::MultiByteToWideChar(CP_ACP, 0, str, -1, m_pMenuItem[i], len);
			lua_pop(m_pLuaState, 1);
		}
	}
}