當前位置:生活全書館 >

綜合知識

> lua怎麼寫

lua怎麼寫

1. 怎麼用Lua寫出來 新手

list = {1,,41,341,1,3,5,1,}

lua怎麼寫

outlist= {};

recordlist={}

for k,v in pairs(list) do

recordlist[v] = outlist[v] or 0;

recordlist[v] = outlist[v] + 1;

end

for k,v in pairs(recordlist) do

table.insert(outlist,{data=k,num=v});

end

table.sort(outlist,function(a,b) if a.num > b.num then return true;else return false; end end);

for k,v in ipairs(outlist) do

print(v.data..":"..v.num.."n");

end

2. lua的接口的寫法

擴展Lua的基本方法之一就是為應用程序註冊新的C函數到Lua中去。

當我們提到Lua可以調用C函數,不是指Lua可以調用任何類型的C函數(有一些包可以讓Lua調用任意的C函數,但缺乏便捷和健壯性)。正如我們前面所看到的,當C調用Lua函數的時候,必須遵循一些簡單的協議來傳遞參數和獲取返回結果。

相似的,從Lua中調用C函數,也必須遵循一些協議來傳遞參數和獲得返回結果。另外,從Lua調用C函數我們必須註冊函數,也就是説,我們必須把C函數的地址以一個適當的方式傳遞給Lua解釋器。

當Lua調用C函數的時候,使用和C調用Lua相同類型的棧來交互。C函數從棧中獲取她的參數,調用結束後將返回結果放到棧中。

為了區分返回結果和棧中的其他的值,每個C函數還會返回結果的個數(the function returns (in C) the number of results it is leaving on the stack.)。這兒有一個重要的概念:用來交互的棧不是全局變量,每一個函數都有他自己的私有棧。

當Lua調用C函數的時候,第一個參數總是在這個私有棧的index=1的位置。甚至當一個C函數調用Lua代碼(Lua代碼調用同一個C函數或者其他的C函數),每一個C函數都有自己的獨立的私有棧,並且第一個參數在index=1的位置。

26.1 C 函數先看一個簡單的例子,如何實現一個簡單的函數返回給定數值的sin值(更專業的實現應該檢查他的參數是否為一個數字):static int l_sin (lua_State *L) { double d = lua_tonumber(L, 1); /* get argument */ lua_pushnumber(L, sin(d)); /* push result */ return 1; /* number of results */}任何在Lua中註冊的函數必須有同樣的原型,這個原型聲明定義就是lua.h中的lua_CFunction:typedef int (*lua_CFunction) (lua_State *L);從C的角度來看,一個C函數接受單一的參數Lua state,返回一個表示返回值個數的數字。所以,函數在將返回值入棧之前不需要清理棧,函數返回之後,Lua自動的清除棧中返回結果下面的所有內容。

我們要想在Lua使用這個函數,還必須首先註冊這個函數。我們使用lua_pushcfunction來完成這個任務:他獲取指向C函數的指針,並在Lua中創建一個function類型的值來表示這個函數。

一個quick-and-dirty的解決方案是將這段代碼直接放到lua.c文件中,並在調用lua_open後面適當的位置加上下面兩行:lua_pushcfunction(l, l_sin);lua_setglobal(l, "mysin");第一行將類型為function的值入棧,第二行將function賦值給全局變量mysin。這樣修改之後,重新編譯Lua,你就可以在你的Lua程序中使用新的mysin函數了。

在下面一節,我們將討論以比較好的方法將新的C函數添加到Lua中去。對於稍微專業點的sin函數,我們必須檢查sin的參數的類型。

有一個輔助庫中的luaL_checknumber函數可以檢查給定的參數是否為數字:當有錯誤發生的時候,將拋出一個錯誤信息;否則返回作為參數的那個數字。將上面我們的函數稍作修改:static int l_sin (lua_State *L) { double d = luaL_checknumber(L, 1); lua_pushnumber(L, sin(d)); return 1; /* number of results */}根據上面的定義,如果你調用mysin('a'),會得到如下信息:bad argument #1 to 'mysin' (number expected, got string)注意看看luaL_checknumber是如何自動使用:參數number(1),函數名("mysin"),期望的參數類型("number"),實際的參數類型("string")來拼接最終的錯誤信息的。

下面看一個稍微複雜的例子:寫一個返回給定目錄內容的函數。Lua的標準庫並沒有提供這個函數,因為ANSI C沒有可以實現這個功能的函數。

在這兒,我們假定我們的系統符合POSIX標準。我們的dir函數接受一個代表目錄路徑的字符串作為參數,以數組的形式返回目錄的內容。

比如,調用dir("/home/lua")可能返回{".", "..", "src", "bin", "lib"}。當有錯誤發生的時候,函數返回nil加上一個描述錯誤信息的字符串。

#include #include static int l_dir (lua_State *L) { DIR *dir; struct dirent *entry; int i; const char *path = luaL_checkstring(L, 1); /* open directory */ dir = opendir(path); if (dir == NULL) { /* error opening the directory? */ lua_pushnil(L); /* return nil and 。 */ lua_pushstring(L, strerror(errno)); /* error message */ return 2; /* number of results */ } /* create result table */ lua_newtable(L); i = 1; while ((entry = readdir(dir)) != NULL) { lua_pushnumber(L, i++); /* push key */ lua_pushstring(L, entry->d_name); /* push value */ lua_settable(L, -3); } closedir(dir); return 1; /* table is already on top */}輔助庫的luaL_checkstring函數用來檢測參數是否為字符串,與luaL_checknumber類似。

(在極端情況下,上面的l_dir的實現可能會導致小的內存泄漏。調用的三個Lua函數lua_newtable、lua_pushstring和lua_settable可能由於沒有足夠的內存而失敗。

其中任何一個調用失敗都會拋出錯誤並且終止l_dir,這種情況下,不會調用closedir。正如前面我們所討論過的,對於大多數程序來説這不算個問題:如果程序導致內存不足,最好的處理方式是立即終止程序。

另外,在29章我們將看到另外一種解決方案可以避免這個問題的發生)26.2 C 函數庫一個Lua庫實際上是一個定義了一系列。

3. 怎麼用LUA語言寫一個定時器

原生lua是不提供定時的

因為定時的話 其實就等於引入多線程 而原生lua只支持單線程的

所以可以考慮引入第3方庫

比較現成的 socket的timeout 或自己寫一個

如果 一定要在lua裏實現 可以考慮寫個無窮迴圈 但是這非常消耗cpu

local t = os.time()

while true do

local time = os.time()

if time - t >= 10 then

t = time

print(t)

end

end

4. Lua 怎麼編寫輸入框

相關的接口有

CCTextFieldTTF:attachWithIME() return type: bool

CCTextFieldTTF:detachWithIME() return type: bool

CCTextFieldTTF:getCharCount() return type: int

CCTextFieldTTF:setColorSpaceHolder(ccColor3B val) return type: void

CCTextFieldTTF:getColorSpaceHolder() return type: ccColor3B

CCTextFieldTTF:setString(const char* text) return type: void

CCTextFieldTTF:getString() return type: const char*

CCTextFieldTTF:setPlaceHolder(const char* text) return type: void

CCTextFieldTTF:getPlaceHolder() return type: const char*

CCTextFieldTTF:textFieldWithPlaceHolder(const char* placeholder, CCSize dimensions, CCTextAlignment alignment, const char* fontName, float fontSize) return type: CCTextFieldTTF

CCTextFieldTTF:textFieldWithPlaceHolder(const char* placeholder, const char* fontName, float fontSize) return type: CCTextFieldTTF製作一個edit控件,首先要用textFieldWithPlaceHolder 創建一個textField

然後要設置setPosition

最後要關聯上輸入法attachWithIME()

我前一陣子也在用cocos2d做這些東西 但發現cc提供的腳本的接口還是太少

有些功能還是得在CPP下寫

比如這個edit也就只能提供輸入,連光標都沒有的

標籤: lua
  • 文章版權屬於文章作者所有,轉載請註明 https://shqsg.com/zh-mo/zonghezhishi/y4zky1.html