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脚本编程基础

    Linux实验4 shell脚本编程基础

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

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

    Unity 3D脚本编程与游戏开发【4.0】

    7.2.3 DOTween插件使⽤⽅法简介 缓动动画既是⼀种编程技术,也是⼀种动画的设计思路。从设计⾓度来看,可以有以下描述。 ①事先设计很多基本的动画样式,如移动、缩放、旋转、变⾊和弹跳等。但这些动画都以抽象⽅式表⽰,⼀般封装为程序函数。 ②动画的参数可以在使⽤

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

    Unity 3D脚本编程与游戏开发【3.7】

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

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

    Unity 3D脚本编程与游戏开发(2.8)

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

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

    Unity 3D脚本编程与游戏开发(3.2)

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

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

    Unity 3D脚本编程与游戏开发(3.5)

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

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

    Unity 3D脚本编程与游戏开发(3.4)

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

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

    Unity 3D脚本编程与游戏开发(2.6)

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

    2024年02月03日
    浏览(13)
  • Unity 3D脚本编程与游戏开发【4.1】

    Unity 3D脚本编程与游戏开发【4.1】

    7.2.5 后期处理举例 Post Processing(后期处理)并不属于特效,但现代的特效表现离不开后期处理的⽀持。本⼩节以眩光(Bloom)为例,展⽰⼀种明亮的激光的制作⽅法,其效果如图7-13所⽰。 1. 安装后期处理扩展包         较新的Unity版本(如2018.4版本)已经内置了新版的后

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

    Unity 3D脚本编程与游戏开发【4.2】

    8.2.3 ⾳频管理器         在实际游戏开发中,⾳效既是⼀个相对独⽴的部分,⼜与其他游戏逻辑密切关联。也就是说,与⾳效相关的代码会插⼊很多细节代码中。         ⽽且在⾳效⾮常丰富的情况下,如果每⼀个游戏模块都单独播放⾳效,那么可能会带来⼀些问题。

    2024年04月24日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包