cocos2dx lua (伪)面向对象理解与实战应用
面向对象
>> 把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class)
>> 通过类的封装(encapsulation)隐藏内部细节
>> 通过继承(inheritance)实现类的特化(specialization)/泛化(generalization)
>> 通过多态(polymorphism)实现基于对象类型的动态分派(dynamic dispatch)
1.lua中的类lua中其实是没有类的,有的只是表(table),而类之间的继承也就是将父类的表连到了一起,派生类中没有找到的属性和方法就通过元表查找父类
2.lua中类的属性classA = {width =10, height=10}
classA={}
classA.width=10
classA.height=10
两种方法都可以,通过点self.width统一调用
3.类方法[cpp] view plaincopy
function Box:collsion()
– 默认第一个参 ...
溪流 WarKey 3.0 论坛预览版 发布,支持Lua脚本
昨晚搞到近 2 点,终于把相关部分搞完了,放出个预览版玩玩。这一版本将支持组合键,比如,可以分别改Q、Ctrl+Q、Alt+Q 等,也将支持所有鼠标操作。此外,增加了一个脚本系统,允许用户进行更大程度上的自定义。
猛击这里下载
脚本使用 lua 语言,格式大致为(正式版出来之前可能还会有改动):
-----------------------------------------------------------------------------
-- SampleExtension.lua
Extension =
{
Application = "xlWarKey", --请勿修改
Version = "3.0", --请勿修改
NameSpace = "http://www.streamlet.org/api/xlwarkey/3.0", --请勿修改
ExtensionName = <span style="color:#a31515">"Sampl ...
Lua模块的包管理器LuaRocks
LuaRocks是Lua模块的包管理器。它允许你创建和安装Lua模块,作为独立包名为rocks。 您可以在Unix和Windows上下载并安装LuaRocks。LuaRocks是免费软件,使用与Lua相同的许可证。
@[TOC]
官方 :https://luarocks.org/
linux系统下安装安装包列表:http://luarocks.github.io/luarocks/releases/
简单安装12345678$ wget https://luarocks.org/releases/luarocks-2.4.3.tar.gz$ tar zxpf luarocks-2.4.3.tar.gz$ cd luarocks-2.4.3$ ./configure; sudo make bootstrap$ sudo luarocks install luasocket$ luaLua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio> require "socket"
设置prefix会自动将Luarocks以 ...
nginx_lua 扩展让 nginx 拥有可编程能力
公司使用 lighttpd 的比较多, 主要是接入层的一些工作,而且增加了一些很多自己的模块防火墙等等. 后来nginx开始流行起来因为 lighttpd 和 nginx整体是实现方式比较类似(个人感觉nginx 借鉴了 lighttpd的实现方式),都使用了多进程异步非阻塞处理请求I/O和timer,对于静态文件服务使用sendfile系统调用. 作为静态文件server和接入层来说 lighttpd 已经足够的快,所以用lighttpd 和 nginx没太大区别. 简单来说nginx 相对于lighttpd 没有质的提高, 所以公司推广nginx 的动力不是太大.
nginx_lua 模块的推出使得 nginx 和 lighttpd 不在一个水平线上了. nginx_lua大大降低了nginx moudle开发的门槛,使用lua 语言可以替代以前使用c开发nginx moudle的很多场景. 可以很方便的给nginx 增加功能,这点lighttpd很难做到.
关于nginx_lua的介绍可以看看作者的一个演讲记录: 由Lua 粘合的Nginx生态环境 ,本文主要介绍lua so ...
Lua 什么是闭包函数
为路由器写脚本,顺带学了一下lua.对闭包函数做个理解笔记
普通函数内部可以直接读取全局变量。如:1234567local n = 1function f1( ... ) return nendprint(f1()) --1
但普通函数内部却无法读取一个与自己不同作用域的局部变量。如:12345678910function f1( ... ) local n = 1 return nendfunction f2( ... ) print(n)endf2() --nil
但是通过下列这种特殊的函数写法,就可以让一个函数读取一个与自己不同作用域的局部变量:1234567891011function f1( ... ) local n = 1 function f2( ... ) n = n + 1 return n end return f2endlocal result = f1()print(result()) --2
在上面的代码中,函数f2就被包括在函数f1内部,这 ...
Lua与C交互相关
C语言API总览。
C语言和Lua语言的两种交互形式:
C语言拥有控制权,而Lua语言被用作库,这种交互形式中的C代码被称为应用代码。
Lua语言拥有控制权,而C语言被用作库,此时的C代码被称为库代码。
应用代码和库代码都适用相同的API和Lua语言通信,这些API称为C API。
一个简单的独立解释器:1234567891011121314151617181920212223242526#include <string.h>#include "lua.h"#include "lauxlib.h"#include "lualib.h"int (void){ char buff[256]; int error; lua_State *L = luaL_newstate(); luaL_openlibs(L); /* 打开标准库 */ while(fgets(buuff,sizeof(buff),stdin) != NULL) { error = luaL_loadstring ...
ubuntu配置lua环境,并进行c与lua的相互调用
先查看一下apt可获取的lua版本我们选择lua5.1版本进行安装1sudo apt install lua5.1
安装完之后测试一下是否安装成功,如果可以正常使用,则lua环境已经安装完毕。
2.安装lua相关的c库lua环境安装完毕,但是此时在c中还不能对lua进行调用,或者生成供lua调用的c库,因为还没有安装lua的c库,通过下面这条命令安装相应的库文件和头文件1sudo apt-get install lua5.1-0-dev
安装完毕后,我们写代码进行测试
2.1生成c的动态库供lua调用新建一个c文件1vim addlib.c
写一个addc函数供lua调用12345678910111213141516171819202122232425262728#include <lua5.1/lualib.h>#include <lua5.1/lauxlib.h>static int (lua_State *L){ int a,b,c; a = lua_tonumber(L,1); b = lua_tonumber(L,2); c = ...
Lua 排序算法
设有一组关键字{K1, K2,…, Kn};排序开始就认为 K1 是一个有序序列;让 K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 Kn 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。
算法步骤
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复步骤 2~5
动画演示
Lua 实现
local function insertionSort(arr)
for i = 2, #arr, 1 do
local tmp = arr[i]
local j = i - 1
while j >= 1 and tmp < arr[j] do
arr[j ...
Lua笔记效率性能
本文使用对比测评的方式比较了几种Lua中代码和方式,并做了简要的总结和分析。结合其中结论,可指导写出质量更高、性能更优的脚本。本文基于Lua5.1,大部分内容也同样适用于Lua5.2和5.3。本文中引用到的Lua源代码都取自Lua 5.1.5版本。
评测方法主要有运行时间和产生GC两个指标,以下是获取运行时间和内存用量/GC的方法:
获取运行时间为了更好地做比较,使用下边的方法来记录代码的运行时间:
1234567local a, ba = os.clock()b = os.clock()print(b-a)
获取内存用量12345collectgarbage("stop")collectgarbage("collect")print(collectgarbage("count"))
上边三行代码都是调用函数collectgarbage(),配合传入的不同的参数达到不同的目的:
stop 停止自动GC
collect 执行一次完整的GC循环
count 返回当前内存用量,以k为单位
使用local保存全局变量的引用使用local ...
lua与c++的交互
1.前言Lua作为一个运行效率非常高的脚本语言,简单方便,如今很多游戏开发都会用到.今天研究下c++和lua是如何交互的~
2.c++调用lua我是在macos上实验的,过程应该和linux上类似.使用的lua版本是5.3.0.
c++调用lua原理主要是通过Lua的堆栈,一方将传递的参数以及参数个数压入栈中,另一方则在栈中取出参数,并将返回值压入栈中,由另一方取出,实现交互.这个过程和c++和汇编(如nasm)的交互过程很像.
(i).添加依赖将liblua.a添加到项目中:
设置search paths:
Header Search Paths设置为lua安装位置,用来搜索头文件.
Library Search Paths设置为项目存放.a库的目录.
(ii).代码测试1234567891011121314151617181920212223extern "C" {#include "lua.h"#include "lualib.h"#include "lauxlib.h"}using namespace std; ...