第9月第12天 lua_push lua_to luaL_check stack quick

1.

c代码中通过lua_push 把数据压入堆栈,lua调用c函数得到数据。luaL_check是对lua_to的封装,从堆栈中获取lua代码中函数调用的数据。

 

static int
lread(lua_State *L) {
    struct socket * s = lua_touserdata(L,1);
    if (s == NULL || s->listen_fd < 0) {
        return luaL_error(L, "start socket first");
    }
    size_t sz = 0;
    const char * welcome = luaL_checklstring(L,2,&sz);
    int fd = test(s, welcome,sz);
    if (fd >= 0) {
        char buffer[BUFFER_SIZE];
        int rd = recv(fd, buffer, BUFFER_SIZE, 0);
        if (rd <= 0) {
            s->closed = 1;
            lua_pushboolean(L, 0);
            return 1;
        }
        lua_pushlstring(L, buffer, rd);
        return 1;
    }
    return 0;
}

 

static int
lstart(lua_State *L) {
    const char * addr = luaL_checkstring(L,1);
    int port = luaL_checkinteger(L,2);

    struct socket * s = lua_newuserdata(L, sizeof(*s));
    s->listen_fd = -1;
    s->fd = -1;
    s->closed = 0;

    int lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    int reuse = 1;
    setsockopt(s->listen_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(int));

    struct sockaddr_in service;
 
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr(addr);
    service.sin_port = htons(port);

    if (bind(lfd, (const struct sockaddr *)&service, sizeof(service)) < 0) {
        closesocket(lfd);
        printf("bind() failed");
        exit(1);
    }
    if (listen(lfd, 1) < 0) {
        printf("listen(): Error");
        exit(1);
    }
    s->listen_fd = lfd;

    return 1;
}

 

function ldebug.start(host)
    local ip = (host and host.ip) or "127.0.0.1"
    local port = (host and host.port) or 6789
    socks_fd = csock.start(ip , port)
end

function readline()
    local ret = split()
    if ret then
        return ret
    end
    local data = csock.read(socks_fd, socks_prompt)
    if data then
        socks_buffer = socks_buffer .. data
        return split()
    end

    return data
end

 

2.stack

lua_pushnumber( L, 211 );
lua_pushnumber( L, 2222 );
lua_newtable( L );

 

执行代码,跟踪L的top,发现top的地址是增加的。

(StkId) top = 0x00007f9c63d01730

(StkId) top = 0x00007f9c63d01740

(StkId) top = 0x00007f9c63d01750

(StkId) top = 0x00007f9c63d01760

 

所以

那么当执行完lua_newtable之后栈上有三个元素,大致就是这样: 


table 

222 

211 



现在211是第一个元素,index为1,不过LUA也可以用负数来表示,那么现在他是多少? 

index -index value 
3 -1 table 
2 -2 222 

1 -3 211 

http://blog.csdn.net/djvc/article/details/62135945

http://www.cnblogs.com/ringofthec/archive/2010/11/05/luaClosure.html

 

http://www.cnblogs.com/dwjaissk/p/3477062.html

http://www.benmutou.com/archives/52

3.quick

 

http://cocos2d-lua.org/download/3-6-4.md

https://github.com/u0u0/Quick-Cocos2dx-Community

 

https://github.com/shenzhan168/BubbleGame

old:

https://github.com/ever-changing/quickcocos2dx

 

 17  ls /Users/temp/Downloads/quick-cocos2d-x 

   18  export

   19  export QUICK_COCOS2DX_ROOT=/Users/temp/Downloads/quick-cocos2d-x

   20  echo $(QUICK_COCOS2DX_ROOT)

   21   $(QUICK_COCOS2DX_ROOT)

   22  echo $(QUICK_COCOS2DX_ROOT)

   23  cd /Users/temp/Downloads/quick-cocos2d-x/bin 

   24   ./create_project.sh -o landscape com.Reventon.Game.testGame

   25  ./create_project.sh

   26  ./create_project.sh -h

   27   ./create_project.sh -r landscape com.Reventon.Game.testGame

   28   ./create_project.sh -r landscape -p com.Reventon.Game.testGame

   29  ls

   30  testgame/run-mac.sh 

   31  testgame/run-mac.sh 

   32  testgame/run-mac.sh 

   33  testgame/run-mac.sh 

 

ui.newTTFLabelMenuItem

 

https://github.com/search?utf8=%E2%9C%93&q=newTTFLabelMenuItem&type=Code

 

lua调用c/c++时,c/c++语言的函数参数一般只有char *,float,int等基础类型,没有字典类型。

lua代码的函数参数可以是table,function,所以一般会封装一个函数调用c/c++,这样lua代码调用lua函数传递table,lua函数内部调用c/c++。

 

function ldebug.start(host)
    local ip = (host and host.ip) or "127.0.0.1"
    local port = (host and host.port) or 6789
    socks_fd = csock.start(ip , port)
end

ldebug.start { ip = "127.0.0.1", port = 6789 }
static int
lstart(lua_State *L) {
    const char * addr = luaL_checkstring(L,1);
    int port = luaL_checkinteger(L,2);

    struct socket * s = lua_newuserdata(L, sizeof(*s));
    s->listen_fd = -1;
    s->fd = -1;
    s->closed = 0;

    int lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    int reuse = 1;
    setsockopt(s->listen_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(int));

    struct sockaddr_in service;
 
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr(addr);
    service.sin_port = htons(port);

    if (bind(lfd, (const struct sockaddr *)&service, sizeof(service)) < 0) {
        closesocket(lfd);
        printf("bind() failed");
        exit(1);
    }
    if (listen(lfd, 1) < 0) {
        printf("listen(): Error");
        exit(1);
    }
    s->listen_fd = lfd;

    return 1;
}

 

 

--[[--

使用 TTF 字体创建文字显示对象,并返回 CCLabelTTF 对象。

可用参数:

-    text: 要显示的文本
-    font: 字体名,如果是非系统自带的 TTF 字体,那么指定为字体文件名
-    size: 文字尺寸,因为是 TTF 字体,所以可以任意指定尺寸
-    color: 文字颜色(可选),用 ccc3() 指定,默认为白色
-    align: 文字的水平对齐方式(可选)
-    valign: 文字的垂直对齐方式(可选),仅在指定了 dimensions 参数时有效
-    dimensions: 文字显示对象的尺寸(可选),使用 CCSize() 指定
-    x, y: 坐标(可选)

align 和 valign 参数可用的值:

-    ui.TEXT_ALIGN_LEFT 左对齐
-    ui.TEXT_ALIGN_CENTER 水平居中对齐
-    ui.TEXT_ALIGN_RIGHT 右对齐
-    ui.TEXT_VALIGN_TOP 垂直顶部对齐
-    ui.TEXT_VALIGN_CENTER 垂直居中对齐
-    ui.TEXT_VALIGN_BOTTOM 垂直底部对齐

~~~ lua

-- 创建一个居中对齐的文字显示对象
local label = ui.newTTFLabel({
    text = "Hello, World",
    font = "Marker Felt",
    size = 64,
    align = ui.TEXT_ALIGN_CENTER -- 文字内部居中对齐
})

-- 左对齐,并且多行文字顶部对齐
local label = ui.newTTFLabel({
    text = "Hello, World\n您好,世界",
    font = "Arial",
    size = 64,
    color = ccc3(255, 0, 0), -- 使用纯红色
    align = ui.TEXT_ALIGN_LEFT,
    valign = ui.TEXT_VALIGN_TOP,
    dimensions = CCSize(400, 200)
})

~~~

@param table params 参数表格对象

@return CCLabelTTF CCLabelTTF对象

]]
function ui.newTTFLabel(params)
    assert(type(params) == "table",
           "[framework.ui] newTTFLabel() invalid params")

    local text       = tostring(params.text)
    local font       = params.font or ui.DEFAULT_TTF_FONT
    local size       = params.size or ui.DEFAULT_TTF_FONT_SIZE
    local color      = params.color or display.COLOR_WHITE
    local textAlign  = params.align or ui.TEXT_ALIGN_LEFT
    local textValign = params.valign or ui.TEXT_VALIGN_CENTER
    local x, y       = params.x, params.y
    local dimensions = params.dimensions

    assert(type(size) == "number",
           "[framework.ui] newTTFLabel() invalid params.size")

    local label
    if dimensions then
        label = CCLabelTTF:create(text, font, size, dimensions, textAlign, textValign)
    else
        label = CCLabelTTF:create(text, font, size)
    end

    if label then
        label:setColor(color)

        function label:realign(x, y)
            if textAlign == ui.TEXT_ALIGN_LEFT then
                label:setPosition(math.round(x + label:getContentSize().width / 2), y)
            elseif textAlign == ui.TEXT_ALIGN_RIGHT then
                label:setPosition(x - math.round(label:getContentSize().width / 2), y)
            else
                label:setPosition(x, y)
            end
        end

        if x and y then label:realign(x, y) end
    end

    return label
end

 

posted @ 2017-06-12 09:07  lianhuaren  阅读(520)  评论(0编辑  收藏  举报