Lua
CoderHustlion
这个作者很懒,什么都没留下…
展开
-
Lua 大小写不敏感替换
local gisub = function(s, pat, repl, n) pat = string.gsub(pat, '(%a)', function (v) return '['..string.upper(v)..string.lower(v)..']' end) if n then return string.gsub(s, pat, repl, n) else return string.gsub(s, pat, repl) e原创 2021-05-20 17:10:04 · 1138 阅读 · 0 评论 -
lua 标准库函数的实现的查找办法——以module函数为例
简介在使用 lua 语言时,有时会用到一些标准库函数,但是文档不够清楚或者搜不到官方的说明,此时就需要看一下源码、确认函数的作用。本文以 module 函数为例来说明查找的办法。查找办法首先,根据对 lua 源码的理解,我们知道 linit.c 负责内嵌库的初始化,具体是由 luaL_openlibs 函数调用来触发库的初始化。默认要加载的库是在 static const luaL_Reg loadedlibs[] 里面记录的。linit.c --> loadedlibs 数组 -原创 2021-01-18 14:03:00 · 570 阅读 · 0 评论 -
C++ 将 lua table 读取为 std::map 的一种办法
前置要求lua51.dll 及相应的头文件。可参考Windows 下编译安装 Lua 5.3.5制作。lua53.dll 也可,相应修改链接库名称即可。文件-- 此文件保存为 test.luaGroundMaterialType = { BM_NULL = 0, BM_MUD = 1, BM_SNOW = 2, BM_SAND = 3,}GroundMaterialSoundEvents = { [GroundMaterialType.BM_NULL]原创 2020-12-16 22:20:04 · 772 阅读 · 0 评论 -
Lua 报错 PANIC: unprotected error in call to Lua API (no calling environment) 解决办法
问题表现lua_State *L = lua_open(); /* opens Lua */luaopen_base(L); /* opens the basic library */luaopen_table(L); /* opens the table library */luaopen_io(L); /* opens the I/O library */ <---- 这里出错。luaopen_string(L); /* opens the string lib. */luaope原创 2020-12-14 15:49:56 · 3738 阅读 · 0 评论 -
Cocos2dx lua 版本号查找方法
找到 cocos2dx\external\lua\lua\lua.h 文件,由其中的 LUA_VERSION、LUA_RELEASE 确定。例如:#define LUA_VERSION "Lua 5.1"#define LUA_RELEASE "Lua 5.1.4"则可以确定使用的是 lua 5.1.4.原创 2020-12-14 12:01:51 · 1195 阅读 · 0 评论 -
cocos2dx 的 Repeat 函数的一种等效用法(lua 接口)
引子在使用多个 cc.RotateBy 来创建连续的旋转动画时,发现 Repeat 函数调用后,传入的参数是 3,却跑了 4 次。传 6 跑 7。传 9 跑 9。函数表现得比较奇怪,一时源码中又看不出 bug 所在。于是想到了利用 Sequence 做一个等效实现。实现办法local r = cc.RotateBy:create(0.1, 60)local xs = { r:clone...原创 2019-11-14 15:42:28 · 622 阅读 · 0 评论 -
Lua 模块热更的一种典型实现
Lua 模块热更的一种典型实现原理主要是通过重载 require,然后匹配 require 接收到的模块名,对应清理 package.loaded 与 package.preload 的内容,再重新 require 来完成热更。单体实现__old_require = __old_require or require -- 这样写是避免做成 __old_require 反复嵌套requi...原创 2019-11-12 19:08:32 · 680 阅读 · 0 评论 -
基于函数式编程 curry 概念的 Lua 函数调用暂存机制
基于函数式编程 curry 概念的 Lua 函数调用暂存机制引子客户端代码收到服务器多条消息,其中有一条主消息和多条补充修改此主消息的补充消息。但是在实际使用时,发现有些补充消息比在主消息先到达客户端。所以我们需要把这些“补充消息”先暂存起来。一种实现方式是制作一个数据缓存,约定一种数据结构把先到达的数据先存好,在主消息到达后再去按照约定的结构一项一项把数据更新到主消息中。这种方式有效...原创 2019-07-09 11:03:07 · 407 阅读 · 0 评论 -
Lua 自动属性实现
Lua 自动属性实现在 MMORPG 游戏中,玩家具有非常多的属性,有多数情况下这些属性都是从服务器获取然后不需要经过运算即可展示。在项目规范较好的情况下,不会直接取用存储的数值而是使用 getter, setter。但是这些没有额外逻辑的 getter setter 写起来很麻烦。所以笔者利用 lua 灵活的机制实现了一个简单的自动属性特性。具体如下。实现使用时将要自动生成的属性传给...原创 2019-07-09 11:59:48 · 1521 阅读 · 0 评论 -
Cocos 检查 Lua 文件是否存在
以下函数可以用 require 的路径格式来检测 lua 文件是否存在:local function isLuaModuleExist(moduleName) local convertedModuleName = moduleName:gsub('%.', '/') local path = 'src/'..convertedModuleName..'.lua' return cc...原创 2019-07-09 22:11:12 · 1437 阅读 · 0 评论 -
基于 Rx 和 curry 的延迟调用队列在 Lua 中的实现
基于 Rx 和 curry 的延迟调用队列在 Lua 中的实现简介本文是基于函数式编程 curry 概念的 Lua 函数调用暂存机制 的泛化包装,提高了通用性。此实现利用了 ReplaySubject 在 subscribe 时会把所有消息重放的特性。主要用法:-- 引用库require('delayedInvocationQueue')-- 创建对象。fn: 是否调用真正对象的判断...原创 2019-07-10 14:14:33 · 658 阅读 · 0 评论 -
Lua LINQ 快速上手
Lua LINQ 快速上手什么是 LINQLINQ (Language Integrated Query)就是语言集成查询。Lua LINQ 库选择笔者现在找到了两种实现。一种是 xanathar/lualinq,使用说明:手册另一种是 Henkoglobin/lazylualinq。小数据量情况下(10个元素), xanathar 的 lualinq 的性能好低,笔者简单测试发...原创 2019-07-10 15:23:03 · 826 阅读 · 0 评论 -
Lua 基于组件的对象系统设计与实现
Lua 基于组件的对象系统设计与实现简介MMO 中主角色属性、功能特别多。Character 类可迅速达到上万行的体量。笔者参考《饥荒:联机版》代码的角色实现,发现各种功能特性是以组件的形式添加到主体上的。使得功能组件非常清晰,复用性也很好,逻辑不会全部堆在一起,方便维护。类似以下形式:inst:AddComponent("inventoryitem")inst.components.i...原创 2019-07-18 14:43:58 · 967 阅读 · 0 评论 -
软件开发中的热更新概述
什么是热更所谓的热更新(本文中将其与热加载等同),就是运行时更新代码和资源。在主动热更新过程中,客户端向服务器发送请求询问是否有更新,若服务器告知客户端没有更新,就直接进入下一流程。但如果是告知有更新,那就会进入更新流程。按照约定下载指定的文件进行客户端内容的替换和更新。热更新也可以做成被动的,直接约定由服务器发送的某条消息触发热更流程。为什么要热更这里说的热更,包括开发时热更新以及产品...原创 2019-08-07 18:02:41 · 3961 阅读 · 1 评论 -
Cocos lua 堆栈信息中路径太长被截取问题解决办法
此方法需要修改 lua 虚拟机实现,但是只需要修改一个宏定义即可。打开 cocos2d-x-3.10/external/lua/lua/luaconf.h找到 LUA_IDSIZE 定义,将其值 60 改为需要的值,例如 200重新编译项目/运行游戏即可。说明:这个宏控制 debug 信息中的路径信息的最大字符数,所以改大一些就能显示更长的路径。...原创 2019-08-19 17:35:19 · 819 阅读 · 0 评论 -
Lua 实现函数式编程中的 Curry 特性
核心思路就是构造一个 argt 表,先把 bound 指定的位置参数填充,再把后来提供的参数填入空格。代码如下,直接保存为 curry.lua 然后 require 即可。用例见注释:--[[ summary: a simple implementation of curry functions author: Hustlion(hustlion_dev@163.com) date...原创 2019-07-08 17:23:20 · 486 阅读 · 0 评论 -
Lua busted 添加 lua 文件查找路径
使用 -lpath 参数,例:busted -o TAP -lpath=./?.lua默认是 ./src/?.lua;./src/?/?.lua;./src/?/init.lua原创 2018-12-05 10:28:47 · 711 阅读 · 0 评论 -
在 Lua 中实现类似于 Swift Extension 的机制
本文目标本文在 Lua 中实现类似于 Swift Extension 的机制,使得在不改变类继承关系、不进行重复代码实现的前提下,实现一些函数的复用。主要作用是减少代码重复。主要思路是在运行时将作为 extensionClass 的表的元素依次拷贝到目标类中。软件版本Lua 5.1.5代码遍历扩展类/表,将其中的对象依次拷贝到目标类中。具体实现如下:function extendC...原创 2018-09-25 16:31:41 · 438 阅读 · 0 评论 -
Windows 下编译安装 Lua 5.3.5
目标在 Windows 下编译安装 Lua 5.3.5。环境Microsoft Windows 10 企业版 10.0.14393 版本 14393方法推荐在 C:\ 下面建立一个 local 文件夹,用于像 linux 下 /usr/local 或者 /opt 一样来安装自定义的工具和库。下载 MinGW Distro,这是 MinGW 的一个便捷版,可以免去平常安装 MinG...原创 2018-09-28 14:43:48 · 16964 阅读 · 16 评论 -
LuaRocks安装出错 Error: Parse error processing dependency 'lua_cliargs = 3.0-1' 解决办法
出错提示luarocks install busted 提示错误:Error: Parse error processing dependency 'lua_cliargs = 3.0-1'分析在使用 LuaForWindows等提前打包好的环境时,LuaRocks 安装软件包报以上错误,主要原因应该是其中包含的 LuaRocks 版本太老,相关的 bug 需要更新 LuaRocks 解...原创 2018-10-08 10:56:43 · 1637 阅读 · 0 评论 -
Lua 发行版简单比较
简介Lua 官网的二进制分发包页面主要提到了LuaDist 和 LuaForWindows 两种分发包。也提到了 LuaRocks,但是这个严格地说属于 Lua 的包管理软件。一句话总结是,自己参照官方指南编译 Lua 最为简单好用。以下分别介绍官方分发包。LuaDistLuaDist 的特点是针对不同的 windows 版本、.NET 库版本提供了很多编译好的压缩包。优点是版本新,选择...原创 2018-10-08 11:21:36 · 1792 阅读 · 0 评论 -
Lua Busted 单元测试简介(Windows 环境)
简介本文目标是在 Windows 环境下使用 Busted 进行 Lua 单元测试。Busted 是一款 BDD 风格的 Lua 单元测试框架,支持 TAP 风格输出。环境Lua 5.3.5LuaRocks 3.0.2Microsoft Windows 10 企业版 10.0.14393 版本 14393环境配置安装 LuaRocks,参照 Windows 平台 Luaroc...原创 2018-10-08 14:22:38 · 3160 阅读 · 3 评论 -
Windows 平台 Luarocks 3.0.2 编译安装
目标完成 Windows 10 平台下的 Luarocks 3.0.2 编译安装。环境Unity 2018.1.5f1 Personal (64bit)方法安装配置 MinGW。(MinGW 快捷安装方法参见Windows 平台 MinGW 安装)编译安装 Lua。(Lua 编译安装方法参见Windows 下编译安装 Lua 5.3.5)下载 Luarocks 源码。官方列表 ...原创 2018-09-29 13:47:13 · 9593 阅读 · 24 评论 -
Lua Busted 输出乱码解决方法
简介Lua Busted 单元测试框架在笔者电脑上默认输出是有乱码的,因为默认输出格式是 utfTerminal,有一些特殊字符在普通的 Windows 命令行工具中不能显示。但是它支持多种输出模式,通过指定输出类型可以解决这一问题。解决方法默认输出使用命令:busted (与 busted -o utfTerminal 等效)输出:鈼忊椉鉁1 success / 1 failure...原创 2018-10-08 19:05:33 · 1037 阅读 · 0 评论 -
Windows下 lua busted 找不到 module 解决办法
出错提示C:\Users\gongjue\dotfiles\engineering\unit-test&gt;busted busted-simple.lua鈼忊棌鈼忊湵3 successes / 0 failures / 1 error / 0 pending : 0.0 secondsError 鈫?busted-simple.lua @ 29Busted unit testing...原创 2018-09-30 14:05:10 · 1559 阅读 · 0 评论 -
Unity 中使用 Lua 的优劣简要分析
Unity 中使用 Lua 的优劣优点:热更新程度判定:这是 Lua 的一个重要优点。Lua 主要好处就是可以热更新,因为让玩家更新一个整包的代价非常大,除了王者荣耀这样霸气的游戏,几乎没有哪个中小厂商的游戏能承受因更新整包导致的玩家流失1。另外,当出现紧急线上 bug 时,热更新能保证问题及时修复,相比之下通过iOS或者安卓商店重新提包这个流程上就不知慢多少了。缺点:执行效率较低程度判...原创 2018-10-10 17:28:00 · 9043 阅读 · 0 评论 -
Lua IDE 比较和选择
Lua IDE 选择目前 Unity + Lua 主流的开发工具有:IntelliJ IDEA + EmmyLua 插件:IDEA 有 Community 版本,免费使用。EmmyLua是基于 IDEA 的插件,开源免费,支持代码提示、语法检查、引用查找等功能。支持显示代码结构,如图右侧的 Structure 部分。图中下侧是 Find Usage 后查找到的函数引用。ZeroBrane...原创 2018-10-10 17:37:54 · 26796 阅读 · 1 评论 -
Lua 数组 append (给数组添加元素)
用 table.insert 方法:foo = {}table.insert(foo, "bar")table.insert(foo, "baz")参考:怎么给数组追加元素?Lua 数组How do I append to a table in Lua原创 2018-10-31 11:40:35 · 27065 阅读 · 0 评论 -
Lua-stdlib 中的 functional 函数式编程示例
local std = require("std");addMultiply = std.functional.compose(function (x) return x + 2 end, function (x) return x * 10 end)print(addMultiply(2)) -- 40使用 lambda 表达式:local std = require("std");...原创 2018-11-13 10:35:52 · 299 阅读 · 0 评论 -
Lua-stdlib 中的 set 数据结构使用示例
local std = require("std")local testSet = std.set {};std.set.insert(testSet, 5)std.set.insert(testSet, 5)std.set.insert(testSet, 6)for item in std.set.elems(testSet) do print(item) endprint(test...原创 2018-11-12 11:39:39 · 606 阅读 · 0 评论 -
Unity Tolua 对于带有 out 参数的函数的导出方式分析 —— 以 ColorUtility 为例
以 ColorUtility 的 TryParseHtmlString 函数为例。https://docs.unity3d.com/ScriptReference/ColorUtility.TryParseHtmlString.html在配置导出 ColorUtility 类之后,打开 UnityEngine_ColorUtilityWrap.cs,可以看到导出的函数是:[MonoPInvok...原创 2018-11-23 10:46:15 · 1707 阅读 · 0 评论 -
显示文件名与行号、多等级、多输出打印、支持循环表的 Lua 打印器模块实现
模块简介本文提供一款在 Lua 中实现的显示文件名与行号、多等级、多输出打印、支持循环表的打印器模块。此模块主要参照《饥荒:联机版》 Lua 源码改写完成,在此表示感谢。环境Lua 5.1.5模块特性支持多种输出级别,比如 Error Warning, Info支持所有 Lua 类型,包括循环表支持输出到多个目标,例如同时输出到终端及某个集合中(例如饥荒的游戏内控制台)支持显...原创 2018-09-19 10:58:22 · 994 阅读 · 0 评论