Lua面向对象
Lua面向对象和C++不同,类和对象都是表
在表中定义函数
调用表中定义的函数(. :)
定义一个类
产生一个对象
类的抽象
cocos2dx与Lua的关系
使用Lua编写的cocos2dx程序,由三部分组成,一部分是C++部分编译的cocos2dx引擎库,一部分是Lua解析器,一部分是Lua脚本
C++与Lua之间的相互调用
#include <lua.h>
#include <lualib.h>
#include <luaxlib.h>
int cppFunctionForLua(lua_State* lua)
{
int n = lua_gettop(lua);
for(int i=1; i<=n; ++i)
{
printf(“arg %d is %s\n”, i, lua_tostring(lua, i));
}
lua_pushnumber(lua, “this is return result”);
return 1;
}
void callLuaFunc(lua_State* lua, int x, int y)
{
lua_getglobal(lua, “luaFunction”);
lua_pushnumber(lua, x);
lua_pushnumber(lua, y);
lua_call(lua, 2, 1);
int ret = (int)lua_tonumber(lua, -1);
lua_pop(lua, 1);
}
int main(int argc, char* argv[])
{
lua_State* lua = lua_open();
luaL_openlibs(lua);
lua_register(lua, “cppFunctionForLua”, cppFunctionForLua);
luaL_dofile(lua, “luaScript.lua”);
callLuaFunc();
lua_close(lua);
return 0;
}
cocos2dx的Lua接口
-
创建节点对象
node = cc.Node:create() -
格式化字符串
string.format(“hero_%d.png”, i);
或者直接连接
a = “hero_” .. i .. “.png" -
枚举常量,类似只举例一个
cc.ResolutionPolicy.EXACT_FIT
屏幕适配
cc.KeyCode.KEY_A
键盘
cc.CONTROL_EVENTTYPE_TOUCH_DOWN
Control的EventType
cc.CONTROL_STATE_NORMAL
Control的控件状态
cc.EDITBOX_INPUT_MODE_ANY
EditBox的输入模式
cc.EDITBOX_INPUT_FLAG_PASSWORD
EditBox的文本框类型
cc.EDITBOX_RETURNTYPE_GO
EditBox的Return显示
cc.SCROLLVIEW_DIRECTION_BOTH
ScrollView的滚动方向
cc.TABLEVIEW_FILL_TOPDOWN
TableView的列表视图排列方式
cc.PROGRESS_TIMER_TYPE_BAR
ProgressTimer的类型
cc.POSITION_TYPE_FREE
粒子位置模式
cc.PARTICLE_MODE_RADIUS
粒子发射器类型
cc.TRANSITION_ORIENTATION_UP_OVER
场景切换方向
cc.VERTICAL_TEXT_ALIGNMENT_TOP
文本竖直对齐方式
cc.TEXT_ALIGNMENT_LEFT
文本水平对齐方式
- callFunc
local function callback(node, tab) — tab是一个表
end
local sprite = cc.Sprite:create();
local call = cc.CallFunc:create(callback, {x=1, y=2})
sprite:runAction(call)
- schedule
local timerEntry = nil
local scheduler = nil
local function update(dt)
scheduler:unscheduleScriptEntry(timerEntry)
end
scheduler = cc.Director:getInstance():getScheduler()
timerEntry = scheduler:scheduleScriptFunc(update, 0, false)
- MenuItem
local menu = nil
local normal = nil
local hard = nil
local function menuCallback(tag, menuItem)
end
normal = cc.MenuItemImage(“normal.png”, “normal.png”)
normal:setTag(1)
hard = cc.MenuItemImage(“hard.png”, “hard.png”)
hard:setTag(2)
menu = cc.Menu:create(normal, hard) — 没有nil结尾
normal:registerScriptTapHandler(menuCallback)
hard:registerScriptTapHandler(menuCallback)
- Control
local function btnCallback(node, type)
if type == cc.CONTROL_EVENTTYPE_TOUCH_DOWN then
--do something;
end
end
local label = cc.Label:createWithSystemFont(“button”, “Arial”, 30)
local sprite = cc.Scale9Sprite(“normal.png”)
local btn = cc.ControlButton:create(label, sprite)
btn:registerControlEventHandler(btnCallback, cc.CONTROL_EVENTTYPE_TOUCH_DOWN)
btn:registerControlEventHandler(btnCallback, cc.CONTROL_EVENTTYPE_DRAG_INSIDE)
- EventListener
local function onTouchBegan(touch, event)
print(“Touch began”)
local pos = touch:getLocation()
print(pos.x .. “,” .. pos.y)
return true
end
local function onTouchMoved(touch, event)
end
local function onTouchEnded(touch, event)
end
local dispatcher = cc.Director:getInstance():getEventDispatcher()
local listener = cc.EventListenerTouchOneByOne:create()
listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN)
listener:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED)
listener:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED)
dispathcher:addEventListenerWithSceneGraphPriority(listener, node)
-
Point, Size, Rect
cc.p(x, y)
cc.size(width, height)
cc.rect(x, y, width, height) -
坐标运算
cc.pIsSegmentIntersect(ptA, ptB, ptC, ptD)
cc.pIsLineIntersect(ptA, ptB, ptC, ptD, float, float)
cc.pAdd(pt1, pt2)
cc.pSub(pt1, pt2)
cc.pMidPoint(pt1, pt2)
cc.pNormalize(p1)
cc.pGetClampPoint(minPt, maxPt, p)
cc.pForAngle(angle) — return cc.p(cos(angle), sin(angle))
cc.pPerp(p) — return (-y, x)
cc.rPerp(p) —return (y, -x)
cc.pGetIntersectPoint(pA, pB, pC, pD) — 获取相交点 -
矩形运算
cc.rectGetMinX(rect)
cc.rectGetMidX(rect)
cc.rectGetMaxX(rect)
cc.rectGetMinY(rect)
cc.rectGetMidY(rect)
cc.rectGetMaxY(rect)
cc.rectEqualRect(rect1, rect2)
cc.rectContainsPoint(rect, point)
cc.rectIntersectsRect(rect1, rect2)
cc.rectUnion(rect1, rect2) -
Color
cc.c3b(r, g, b)
cc.c4b(r, g, b, a) — r, g, b, in [0, 255]
cc.c4f(r, g, b, a) — r, g, b, a in [0, 1]
- onEnter onExit
local function onEnter()
end
local function onExit()
end
local function nodeEvent(event)
if event == “exit” then
onExit()
elseif event == “onter” then
onEnter()
end
end
node:registerScriptHandler(nodeEvent)