如下代码 :
ret = NPCDialog( "Hello bitch" )
if ret == OK then print("OK") end
对于策划而言,NPCDialog应该是阻塞的,除家操作此对话框,点击OK或者关闭,不然该函数不会返回。而对于宿主程序C++而言,如何实现这个函数呢:
static int do_npc_dialog( lua_State L )
{
const char content = lua_tostring( L, -1 );
lua_pushnumber( ret );
return 1;
}
吃鸡压枪宏。代码不全,0,ww[ee]) 0代表 X坐标左右位移,WW是 Y坐标 上下位移,EE代表 第几次执行,SLEEP指的是 延迟 MS为单位,SetMKeyState() 可以设置当前 M keys 激活状态。请注意:如果您紧接着该方法调用
下面API,用法与你图中代码"函数_复制转移文本参数"一样!LUA不懂,你自己写
版本 2
DLL命令 lstrcpynA_Text, 整数型, "kernel32", "lstrcpynA", , 取内存变量地址
参数 lpString1, 文本型, 传址
参数 lpString2, 文本型, 传址
参数 leng, 整数型
首先,需要了解 `match` 对象中是否存在数据类型的属性。如果存在,我们可以直接访问并写入文件。我将假设 `matchtype` 存在并包含了每个匹配的数据类型。如果实际情况不是这样,你需要根据实际的数据结构进行调整。
在 `stringformat` 函数中,我们可以添加另一个占位符来插入数据类型,如下所示:
local function writeToFile_contrastResult(filename, matches)
local file = ioopen(filename, "w")
for _, match in ipairs(matches) do
file:write(stringformat("偏移量: %d, 数值: %s, 类型: %s\n", matchoffset, matchvalue, matchtype))
end
file:close()
end
在这个版本的函数中,我们假设 `matchtype` 是一个可以直接转换为字符串的值。如果它是其他类型的值,例如一个枚举或者一个需要进一步解析的复杂对象,那么你可能需要使用不同的方法来获取一个可以写入文件的字符串。
Lua 中有八种基本类型: nil、boolean、number、string、function、userdata、 thread 和 table。
1Nil 是值 nil 的类型, 其主要特征就是和其它值区别开;通常用来表示一个有意义的值不存在时的状态。 Boolean 是 false 与 true 两个值的类型。 nil 和 false 都会导致条件判断为假; 而其它任何值都表示为真。 Number 代表了整数和实数(浮点数)。 String 表示一个不可变的字节序列。 Lua 对 8 位是友好的: 字符串可以容纳任意 8 位值, 其中包含零 ('\0') 。 Lua 的字符串与编码无关; 它不关心字符串中具体内容。
2number 类型有两种内部表现方式, 整数 和 浮点数。 对于何时使用哪种内部形式,Lu a 有明确的规则, 但它也按需作自动转换。 因此,程序员多数情况下可以选择忽略整数与浮点数之间的差异或者假设完全控制每个数字的内部表现方式。 标准 Lua 使用 64 位整数和双精度(64 位)浮点数, 但你也可以把 Lua 编译成使用 32 位整数和单精度(32 位)浮点数。 以 32 位表示数字对小型机器以及嵌入式系统特别合适。
3Lua 可以调用(以及操作)用 L ua 或 C 编写的函数。 这两种函数有统一类型 function。
userdata 类型允许将 C 中的数据保存在 Lua 变量中。 用户数据类型的值是一个内存块, 有两种用户数据: 完全用户数据 ,指一块由 Lua 管理的内存对应的对象; 轻量用户数据 ,则指一个简单的 C 指针。 用户数据在 Lua 中除了赋值与相等性判断之外没有其他预定义的操作。 通过使用 元表 ,程序员可以给完全用户数据定义一系列的操作 。 你只能通过 C API 而无法在 Lua 代码中创建或者修改用户数据的值, 这保证了数据仅被宿主程序所控制。
4thread 类型表示了一个独立的执行序列,被用于实现协程 。 L ua 的线程与操作系统的线程毫无关系。 Lu a 为所有的系统,包括那些不支持原生线程的系统,提供了协程支持。
table 是一个关联数组, 也就是说,这个数组不仅仅以数字做索引,除了 nil 和 NaN 之外的所有 Lua 值 都可以做索引。 (Not a Number 是一个特殊的数字,它用于表示未定义或表示不了的运算结果,比如 0/0。) 表可以是 异构 的; 也就是说,表内可以包含任何类型的值( nil 除外)。 任何键的值若为 nil 就不会被记入表结构内部。 换言之,对于表内不存在的键,都对应着值 nil 。
5表是 Lua 中唯一的数据结构, 它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。 对于记录,Lua 使用域名作为索引。 语言提供了 aname 这样的语法糖来替代 a["name"] 这种写法以方便记录这种结构的使用。 在 Lua 中有多种便利的方式创建表。
- 设置触摸模式
node:setTouchMode(ccTOUCH_MODE_ONE_BY_ONE) -- 单点触摸
-- 或者
node:setTouchMode(ccTOUCH_MODE_ALL_AT_ONCE) -- 多点触摸
-- 是否启用触摸
-- 默认值: false
node:setTouchEnabled(true)
-- 是否允许当前 node 和所有子 node 捕获触摸事件
-- 默认值: true
node:setTouchCaptureEnabled(true)
-- 如果当前 node 响应了触摸,是否吞噬触摸事件(阻止事件继续传递)
-- 默认值: true
not:setTouchSwallowEnabled(true)
-- 添加触摸事件处理函数
node:addNodeEventListener(ccNODE_TOUCH_EVENT, function(event)
-- eventphase 的值是:
-- ccNODE_TOUCH_TARGETING_PHASE
-- eventmode 的值是下列之一:
-- ccTOUCH_MODE_ONE_BY_ONE 单点触摸
-- ccTOUCH_MODE_ALL_AT_ONCE 多点触摸
-- eventname 的值是下列之一:
-- began 触摸开始
-- moved 触摸点移动
-- ended 触摸结束
-- cancelled 触摸被取消
-- 如果是单点触摸:
-- eventx, eventy 是触摸点位置
-- eventprevX, eventprevY 是触摸点之前的位置
-- 如果是多点触摸:
-- eventpoints 包含了所有触摸点的信息
-- eventpoints = {point, point, }
-- 每一个触摸点的值包含:
-- pointx, pointy 触摸点的当前位置
-- pointprevX, pointprevY 触摸点之前的位置
-- pointid 触摸点 id,用于确定触摸点的变化
if eventname == "began" then
-- 在单点触摸模式下:在触摸事件开始时,必须返回 true
-- 返回 true 表示响应本次触摸事件,并且接收后续状态更新
return true
end
end)
跨文件跳转
ctrl P
可通过fileA@functionB直接定位到fileA下的functionB函数
符号搜索
ctrl R
在subLimeText默认功能中,没有函数列表,貌似现有的插件也没有实现这个功能。但其实使用符号搜索可以基本代替函数列表,在ctrl R 调出搜索框以后会附带符号列表,列表中就是当前文件定义的各个函数
一切可修改
在subLmieText中的设置项,包括快捷键等等都可以通过修改配置表自行设置,主要有Preferences 下的Setting表跟KeyBinding表,还有插件的配置表Package Control Setting。
命令搜索
subLime中的各种设置命令,除了可以在上方Menu中通过鼠标点选设置以外,还能通过ctrl shift P调出命令搜索框,搜索想要的命令并且调用。例如像修改快捷键表,除了可以通过鼠标点击Preferences -> KeyBindings – Default以外,还可以通过命令搜索框输入key binding,搜索并直接调用该命令,无需需记住各个选项在Menu的位置,也无需鼠标操作,特别适合一些双手时刻不愿离开键盘的键盘党程序员。
文件夹列表
在subLimeText中可以把一个文件夹导入到编辑器中,并且以Project的形式去管理这些文件夹。但是在默认的情况下会把文件夹下无论是否文档的文件都扫描进来。不过利用一切可修改的特性,我们可以在Preferences下的Setting—Default表下找到”folder_exclude_patterns”、”file_exclude_patterns”、”binary_file_patterns” 这几个值修改从而剔除一些我们不需要在编辑器中关注的文件。这里有一点问题是,导入了文件夹以后,通过右键某个子文件夹Delete Folder删除子文件夹,经常失败。
字符线
在大部分脚本编码规范中,我们都会遇到一种情况是尽量避免单行超过80或120个字符这样的情况。在subLime中可以通过View -> Ruler来设置。不过这样设置只是针对当前文本的,如果希望打开每一个文件都有这条字符线,可以通过修改Preferences下的Setting—Default表的”rulers”值,来指定一个总是显示的字符线。
编译
想在subLime中集成编译Lua(或其他语言)功能,只需要在Tool->Build System -> New Build System中添加代码
{
"cmd":
["c:/Users/Administrator/AppData/Roaming/Sublime
Text 2/compileexe",
"$file"],
"file_regex":
"^(:lua:)[\t
]():([0-9]):([0-9])",
"selector":
"sourcelua"
}
然后在sublime Text文件夹路径下/Packages/ 中新建Lua文件夹,保存为Luasublime-build文件即可。
这里”c:/Users/Administrator/AppData/Roaming/Sublime Text 2/compileexe” 是lua编译器的路径,如果系统的环境变量已经配了lua键值,则可直接写”cmd”: ["lua", "$file"]
可以通过Preferences->Browse Packages打开sublime Text文件夹
在一切设置好以后,通过ctrl B 快捷键编译文件。
强大的插件
subLime开放API,有许多功能强大的插件,在安装插件前首先要安装一个插件管理器。通过ctrl `调出控制台,然后在下方输入框输入以下代码:
import
urllib2,os;pf='Package
Controlsublime-package';ipp=sublimeinstalled_packages_path();osmakedirs(ipp)
if
not ospathexists(ipp) else
None;open(ospathjoin(ipp,pf),'wb')write(urllib2urlopen('http://sublimewbondnet/' pfreplace('
',' '))read())
运行结束后就重启subLime就可以在Preferences下找到Package Control
通过Package Control 的Install 和 Remove命令可以调出可安装插件列表和已安装插件列表,搜索想要的插件进行安装(卸载)。
这里推荐几个在项目中开发lua脚本十分有用的插件。
1)FunctionName Display
这个插件安装后可以在信息栏中显示当前光标所在行是属于哪个函数的。
2)ConverToUTF8
subLimeText原生不支持中文,解析ansi编码的时候是按照western window 1252字符表解析的,中文部分会乱码。安装了这个插件以后,用ctrl shift C 设定GB2312编码格式,然后在读写文档的时候就会按照gb2312来读和保存了。(不过提示还是写保存成utf-8)
3)TortoiseSVN
安装了这个插件以后可以直接右键Folder来Commit或者Update代码,十分方便。但有一个问题就是,在TortoiseSVN面板还没关闭前,subLimeText是阻塞的,无法响应任何操作,这个有点囧。
4)cTags
cTags是一个用于从程序源代码树产生索引文件(或tag文件),从而便于文本编辑器来实现快速定位的实用工具。安装了这个插件以后,通过快捷键ctrl t,ctrl r来生成索引文件,在索引文件生成后,可以通过快捷键ctrl 鼠标左键来跳到函数定义的地方,通过ctrl 鼠标右键跳回上一次编辑的地方。这个功能在阅读代码时十分有用。
欢迎分享,转载请注明来源:表白网
评论列表(0条)