Lua脚本编程基础

这篇具有很好参考价值的文章主要介绍了Lua脚本编程基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 数据类型

①基本类型

1. nil类型

2. boolean类型

3. numbers类型

4. string类型

②高级类型

1. table类型

2. function类型

3. userdata类型

4. thread类型

 二 . 脚本示例

-- main.lua
print("hello lua")
-- lua的四种基本数据类型:nil,boolean,numbers,string
-- 全局变量,可以直接在其他脚本文件中访问。慎用
-- 该变量为数字类型,数字类型是以double类型存储的
print("initialize g_var="..g_var)
g_var = 10
dofile("test.lua")
-- 局部变量,离开作用域会自动释放
--  该变量为nil类型
-- 将全局变量设为nil,则该变量将会被lua回收。因此申请了全局变量,在不用的时候
-- 需要设为nil,进行资源释放
local b=nil
print(type(b))

-- bool类型变量
local c = true
print(type(c))


-- 字符串类型
local html = [[<html>
<body>hello html</body>
</html>]]
print(type(html))
-- ..用于字符串拼接
html = "<header info>" .. html .. "</header info>"

print(html)
print("html length=" .. string.len(html))
print("sub string = ".. string.sub(html,1,5))
-- 字符串查找,支持正则匹配
local bb,ee = string.find(html,"body");
print("find string = ".. string.sub(html,bb,ee))
-- 字符串替换,支持正则匹配
local re = string.gsub(html,"body","Body")
print("replace result ="..re)


-- lua 的高级数据类型

local tab1 = {"001","002","003"}
tab2 = {id=123,age=20,name="Tom"};
tab2["country"] = "china"
print("======= Table1=======")
for i,v in ipairs(tab1) do
    print("key="..i..", value="..v)
end
print("======= insert to certain position =======")
table.insert(tab1,3,"002-2")
for i,v in ipairs(tab1) do
    print("key="..i..", value="..v)
end

print("======= remove certain element =======")
table.remove(tab1,3)
for i,v in ipairs(tab1) do
    print("key="..i..", value="..v)
end
print("======= Table2=======")
for i,v in pairs(tab2) do
    print("key="..i..", value="..v)
end

tab2["id"]=nil
print("======= remove certain element =======")
for i,v in pairs(tab2) do
    print("key="..i..", value="..v)
end
-- test.lua
print(g_var)
local b = tonumber("1000")
print(b*g_var)
-- functions.lua

function callback(info,param)
    print("in callback function:"..info)
    print("key="..param.key1)
    return {status=true,msg=info}
    -- return true,info
end

function test(...)
    local argCnt=table.getn(arg)
    print("arg count is "..argCnt)
    for i=1,argCnt do
        print("arg"..i.."="..type(arg[i]))
        if(type(arg[i]) == "function") then
            arg[i]("test function",{key1="p1",key2="p2"})
        end
    end
end

local lambdalua=function(para1,para2)
    print("para1="..para1..",para2="..para2)
end

-- test(123,"hello",callback)
-- lambdalua("hello","lua")

三. lua与c/c++的互操作文章来源地址https://www.toymoban.com/news/detail-528887.html

// CppLua.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<thread>
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
int main()
{
    std::cout << "lua begin" << std::endl;
    lua_State* L = lua_open();
    luaopen_base(L);
    luaopen_string(L);
    luaopen_table(L);
    if (luaL_loadfile(L, "functions.lua") != 0)
    {
        const char* error = lua_tostring(L,-1);
        printf("lua load error: %s",error);
        return -1;
    }
    //在脚本运行前,设一些初始值给lua脚本
    lua_pushinteger(L, 100);
    lua_setglobal(L,"g_var");//会自行pop栈顶元素
    lua_pcall(L,0,0,0);
   // std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    lua_getglobal(L,"g_var");//会向栈顶压栈g_var的值
    int gv = lua_tonumber(L,-1);
    lua_pop(L, 1);//出栈一个元素,恢复栈
    printf("lua global varable=%d\n",gv);

    //lua_getglobal(L,"tab2");
    //lua_getfield(L,-1,"age");
    //printf("tab2: age=%f\n",lua_tonumber(L,-1));
    //lua_pop(L, 1);
   // lua_getfield(L, -1, "country");
    //printf("tab2: country=%s\n", lua_tostring(L, -1));
    //lua_pop(L,1);

    printf("before call, stack top is =%d\n", lua_gettop(L));
    lua_getglobal(L, "callback");
    lua_pushstring(L,"C++ call info");
    lua_newtable(L);
    lua_pushstring(L,"key1");
    lua_pushnumber(L,double(1));
    lua_settable(L,-3);

    if (lua_pcall(L, 2, 1, 0) != 0)//步骤1. 出栈所有参数;步骤2.运行栈顶的可调用对象,并出栈;步骤3.将返回值或者错误码压栈
    {
        const char* error = lua_tostring(L, -1);
        printf("callback error: %s", error);
        return -1;
    }
    else
    {
        /* return more than one result*/
       //printf("res1=%s\n", lua_tostring(L, -1));
       //lua_pop(L, 1);
      // printf("res2=%d\n", lua_toboolean(L, -1));
      // lua_pop(L,1);

        /*return a table*/
       lua_getfield(L,-1,"status");
       printf("callback result code=%d\n", lua_toboolean(L, -1));
       lua_pop(L, 1);
       lua_getfield(L, -1, "msg");
       printf("callback result code=%s\n", lua_tostring(L, -1));
       lua_pop(L, 2);
    }
    printf("after call, stack top is =%d\n", lua_gettop(L));
    lua_close(L);
    std::cout << "lua end" << std::endl;
    return 0;
}

到了这里,关于Lua脚本编程基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux实验4 shell脚本编程基础

    1.假设在/tmp下有以当前用户的帐号命名的目录,请在命令行中临时修改环境变量PATH的值,要求该目录的路径附加到该变量的最后。 2.请在命令行中临时设置命令输入提示行格式为:“当前系统时间-用户#”。 3.在命令行定义一个字符串变量str,并且赋值为“test for shell”,然

    2024年04月17日
    浏览(52)
  • Unity 3D脚本编程与游戏开发(2.8)

    5.1.2 矩形变换(Rect Transform)组件         如果选中界⾯上的控件,读者会发现每个物体并不带有基本的Transform组件,取⽽代之的是Rect Transform(矩形变换)组件。其实Rect Transform组件是Transform组件的⼦类,因此并不违反“每个物体必须有且只有⼀个Transform组件”的规定。

    2024年02月03日
    浏览(38)
  • Unity 3D脚本编程与游戏开发(3.4)

    6.2.3 动画的制作步骤         接下来为⾓⾊配上动画,整体思路分以下3个部分。⼀是准备好单个的动画素材,包含站⽴、跑和跳等动作。也就是说,把原始素材中的图⽚串联起来,形成⼏个单独的动画。⼆是⽤Animator把这些单独的动作有机地组合起来,形成⼀张状态转移

    2024年04月26日
    浏览(37)
  • Unity 3D脚本编程与游戏开发(2.2)

    3.2.7 修改物理材质         每个物体都有着不同的摩擦⼒。光滑的冰⾯摩擦⼒很⼩,⽽地毯表⾯的摩擦⼒则很⼤。另外每种材料也有着不同的弹性,橡⽪表⾯的弹性⼤,硬质地⾯的弹性⼩。在Unity中这些现象都符合⽇常的理念。         虽然从原理上讲,物体的摩擦⼒

    2024年02月04日
    浏览(41)
  • Unity 3D脚本编程与游戏开发(3.5)

    6.2.8 总结和拓展         本节利⽤Unity官⽅素材,以有限的篇幅解释了动画状态机的原理,以及动画制作中最基本但最重要的步骤。总的来看,⽬前的动画只做了4种状态——站⽴、⾛、跑和跳跃,还缺少下蹲、下蹲移动和落地缓冲等动作。好在这些动作只是对现有动作的

    2024年04月10日
    浏览(52)
  • Unity 3D脚本编程与游戏开发【3.8】

    6.4.5 动画层         图6-42显⽰了动画层设置窗⼝。在动画状态机⾥可以添加很多层,层之间可以是覆盖关系也可以是叠加关系,当然也可以随时屏蔽⼀些层、启⽤另⼀些层。 每⼀个动画层可以有单独的设置,其选项解释如下。 ①Weight(权重),本层对总体动画效果的影

    2024年04月16日
    浏览(48)
  • Unity 3D脚本编程与游戏开发【3.7】

            在这个⾓⾊控制脚本中,可以看到很多新奇的写法。关键是,为什么要把移动量转化为转⾝量和前进量呢?要理解这个问题,⼀定要多进⾏游戏测试,体会转⾝与输⼊的关系。         当⾓⾊⾯朝前,输⼊朝后时,⾓⾊的前进量为0,转⾝量达到最⼤;⽽当⾓⾊

    2024年04月15日
    浏览(40)
  • Unity 3D脚本编程与游戏开发(2.6)

    4.5.2 四元数的概念         四元数包含⼀个标量分量和⼀个三维向量分量,四元数Q可以记作Q=[w,(x,y,z)]         在3D数学中使⽤单位四元数表⽰旋转,下⾯给出四元数的公式定义。对于三维空间中旋转轴为n,旋转⾓度为a的旋转,如果⽤四元数表⽰,则4个分量分别为

    2024年02月03日
    浏览(51)
  • Unity 3D脚本编程与游戏开发(3.2)

    5.3.4 制作背包界⾯         背包界⾯是此实例中的重点,因为它的屏幕适配⽐较有代表性。当屏幕⽐较“瘦⾼”时,道具列表中能显⽰更多道具项,⽽屏幕⽐较“矮胖”时,显⽰的道具项会变少。但这些都不影响玩家通过下拉滑动查看所有道具,如图5-37所⽰。       

    2024年04月12日
    浏览(63)
  • Unity 3D脚本编程与游戏开发(2.5)

    4.3.4 向量的点积         两个向量的点积是⼀个标量,其数值为两者⻓度相乘,再乘以两者夹⾓的余弦: a·b=|a|·|b|cosθ⽤坐标表⽰,公式为 (x1,y1,z1)·(x2,y2,z2)=x1x2+y1y2+z1z2         注意到,两个向量的点积是⼀个数(标量),只有⼤⼩,没有⽅向。⽽且点乘满⾜交换律,

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包