zoukankan      html  css  js  c++  java
  • cocos2dx -lua 面向对象-转

    转自:http://www.himigame.com/lua-game/1282.html

    上一篇中,向童鞋们介绍了如何自定义类binding到Lua中供给使用的教程,那么本篇将介绍利用OOP思想在在Lua中进行创建一个自定义类。

       首先Himi来向大家讲解如何在Lua中不binding来自定义lua类,其实这种方式在Cocos2dx的Lua Samples已经为我们做好了例子,就看童鞋们是否认真阅读了。此示例路径在你解压cocos2dx引擎包下的cocos2d-2.1rc0-x-2.1.2/samples/Lua/TestLua 中的 TouchesTest ,如下图:

     QQ20130408-1

         在这个示例中Ball.lua 与 Paddle.lua 分别作为对象进行的Lua编写,还没有看到过的童鞋请自行看下吧。

    闲言少叙,下面详细介绍使用Lua来自定义lua类的步骤:

     第一步:

         我们到Cocos2dx引擎目录下的 samples/Lua/TestLua/Resources/luaScript  下找到“extern.lua” 文件,其内容如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    --Create an class.
    function class(classname, super)
        local superType = type(super)
        local cls
     
        if superType ~= "function" and superType ~= "table" then
            superType = nil
            super = nil
        end
     
        if superType == "function" or (super and super.__ctype == 1) then
            -- inherited from native C++ Object
            cls = {}
     
            if superType == "table" then
                -- copy fields from super
                for k,v in pairs(super) do cls[k] = v end
                cls.__create = super.__create
                cls.super    = super
            else
                cls.__create = super
            end
     
            cls.ctor    = function() end
            cls.__cname = classname
            cls.__ctype = 1
     
            function cls.new(...)
                local instance = cls.__create(...)
                -- copy fields from class to native object
                for k,v in pairs(cls) do instance[k] = v end
                instance.class = cls
                instance:ctor(...)
                return instance
            end
     
        else
            -- inherited from Lua Object
            if super then
                cls = clone(super)
                cls.super = super
            else
                cls = {ctor = function() end}
            end
     
            cls.__cname = classname
            cls.__ctype = 2 -- lua
            cls.__index = cls
     
            function cls.new(...)
                local instance = setmetatable({}, cls)
                instance.class = cls
                instance:ctor(...)
                return instance
            end
        end
     
        return cls
    end
     
    function schedule(node, callback, delay)
        local delay = CCDelayTime:create(delay)
        local callfunc = CCCallFunc:create(callback)
        local sequence = CCSequence:createWithTwoActions(delay, callfunc)
        local action = CCRepeatForever:create(sequence)
        node:runAction(action)
        return action
    end
     
    function performWithDelay(node, callback, delay)
        local delay = CCDelayTime:create(delay)
        local callfunc = CCCallFunc:create(callback)
        local sequence = CCSequence:createWithTwoActions(delay, callfunc)
        node:runAction(sequence)
        return sequence
    end

    这个Lua中提供了3个方法: 第二个函数与第三个函数分别是更新函数与序列动作函数,很easy 不多说。

    我们主要关注的是 第一个函数:

           class(classname,super)   ,  此函数可以用于创建我们自定义lua类

     第一个参数:自定义类名

           第二个参数: 自定义类所继承的父类

    至于其中的实现,大家需要掌握Lua的语言与程序设计,比较容易理解的。

    第二步:我们自定义一个精灵类,且继承CCSprite,其文件名Himi这里随便起的是“MySprite.lua” ,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    require "extern"   --导入模板,作用调用其class函数
     
    MySprite = class("MySprite",
        function(fileName)
            return CCSprite:create(fileName)
        end
    )
     
    MySprite.__index = MySprite   -- 用于访问
     
    MySprite.type = 0    -- 自定义属性
     
    function MySprite:createMS(fileName,_type)      --自定义构造函数
        local mySprite = MySprite.new(fileName)
        mySprite:myInit(_type)
        return mySprite
    end
     
    function MySprite:myInit(_type)    --自定义函数
        self.type =_type
    end

    比较简单不赘述。

  • 相关阅读:
    转:SQL Case when 的使用方法
    转:性能测试知多少
    转:如何让LoadRunner实现多个场景运行?
    转:Loadrunner学习知多少--脚本录制下载操作
    1.3 本章小结
    1.2.5 内部元数据
    1.2.4 创建图像查看应用程序
    1.2.3 使用MediaStore检索图像
    1.2.2 更新CameraActivity以使用MediaStore存储图像和关联元数据
    1.2.1 获得图像的Uri
  • 原文地址:https://www.cnblogs.com/sanjin/p/3578518.html
Copyright © 2011-2022 走看看