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

    比较简单不赘述。

  • 相关阅读:
    nginx-1.8.1的安装
    ElasticSearch 在3节点集群的启动
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
    LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
    LeetCode 437. Path Sum III (路径之和之三)
    LeetCode 404. Sum of Left Leaves (左子叶之和)
    LeetCode 257. Binary Tree Paths (二叉树路径)
    LeetCode Questions List (LeetCode 问题列表)- Java Solutions
    LeetCode 561. Array Partition I (数组分隔之一)
  • 原文地址:https://www.cnblogs.com/sanjin/p/3578518.html
Copyright © 2011-2022 走看看