Lua面向对象

12 篇文章 0 订阅
4 篇文章 0 订阅

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua 中,可以使用“似有字段”(Pseudo-Fields)来模拟面向对象编程中的成员变量。所谓“似有字段”,指的是在表中使用函数来表示一个字段,使得它看起来像一个变量,但实际上是一个函数调用。下面是一个使用“似有字段”实现面向对象的示例: ```lua -- 定义一个类 local MyClass = {} -- 定义一个似有字段 name MyClass.name = function(self, value) if value then self._name = value else return self._name end end -- 定义一个方法 function MyClass:hello() print("Hello, my name is " .. self:name() .. "!") end -- 创建一个实例 local obj = {} setmetatable(obj, { __index = MyClass }) -- 使用 name 字段 obj:name("Jack") print(obj:name()) -- 输出 "Jack" -- 调用方法 obj:hello() -- 输出 "Hello, my name is Jack!" ``` 在上面的示例中,我们定义了一个类 `MyClass`,并在其中使用了一个似有字段 `name`。这个似有字段实际上是一个函数,可以用来设置和获取对象的名称。 然后,我们在类中定义了一个方法 `hello`,用来输出对象的名称。在方法中,我们调用了 `self:name()` 来获取对象的名称,实际上是调用了 `MyClass.name(self)` 函数来获取值。 最后,我们创建了一个实例 `obj`,并使用 `obj:name()` 来设置和获取对象的名称,以及调用 `obj:hello()` 方法来输出对象的名称。 通过使用“似有字段”,我们可以模拟面向对象编程中的成员变量,并在方法中使用它们。需要注意的是,在 Lua 中没有真正的私有变量,所以使用“似有字段”时需要注意保护对象的数据,以避免被外部直接修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值