【COCOS2DX-LUA 脚本开发之五】LUA 使用OOP(面对对象思想编程),免BINDING创建自定义LUA类

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 
转载自【黑米GameDev街区】 原文链接: 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 ,如下图:

 

     在这个示例中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

 

比较简单不赘述。

测试Lua代码:

1

2

3

4

5

6

7

       local fontT = CCLabelTTF:create("在Lua中使用OOP思想创建自定义lua类 -by Himi", "Verdana-BoldItalic", 20)

        fontT:setPosition( ccp(240,200))

        mainLayer:addChild(fontT)

 

        local sp = MySprite:createMS("Icon.png",1)

        sp:setPosition( ccp(100,100))

        mainLayer:addChild( sp)

 

运行截图如下:

 

OK,本篇就到这里。

 

时间: 2024-10-18 07:58:16

【COCOS2DX-LUA 脚本开发之五】LUA 使用OOP(面对对象思想编程),免BINDING创建自定义LUA类的相关文章

《iOS 6核心开发手册(第4版)》——1.12节创建自定义的姿势识别器

1.12 创建自定义的姿势识别器 iOS 6核心开发手册(第4版) 只需做少量的工作即可把秘诀1-10中所示的代码转换成自定义的识别器,如秘诀1-11中所介绍的那样.子类化UIGestureRecognizer将使你能够构建自己的圆形识别器,并把它添加到应用程序中的视图中. 首先把UIGestureRecognizerSubclass.h导入新类中.该文件声明了识别器子类重写或自定义所需的一切内容.对于重写的每个方法,都要确保调用该方法的原始版本,这需要在激活新代码前调用超类方法. 姿势分为两类

《Cocos2d 跨平台游戏开发指南(第2版)》一1.7 创建自定义精灵类

1.7 创建自定义精灵类 前面我们只是考虑如何把一个精灵添加到场景中,然而,以后可能想要一个单独的精灵类,以便你能为它添加自己的行为.在这一部分,我们将讨论如何通过扩展基本的CCSprite类来创建自定义的精灵类. 1.7.1 准备工作 让我们一起看一下如何创建一个自定义精灵类,它拥有自己的运动,并且更新函数. 为此,我们要先创建新文件. 1.在菜单栏中,依次选择File-New-File,在iOS的Source下,选择Cocoa Touch Class,单击Next按钮,如图1-19所示. 2

《Lua游戏AI开发指南》一2.9 创建智能体Lua脚本

2.9 创建智能体Lua脚本 为了创建一个新的智能体,我们需要创建另一个Lua脚本并实现Agent_Cleanup. Agent_HandleEvent. Agent_Initialize和Agent_Update函数. 创建一个Lua文件如下: src/my_sandbox/script/Agent.lua Agent.lua: function Agent_Cleanup(agent) end function Agent_HandleEvent(agent, event) end func

阿里云Redis LUA脚本功能上线——轻量嵌入,极速扩展,业务轻松跨平台

    阿里云Redis云数据库,全面支持LUA脚本功能,助力企业轻松迁移自建Redis数据库的业务逻辑,实现业务的跨平台复用,快速驱动业务上云.LUA语言作为目前最流行的轻量级嵌入式脚本语言,凭借其语法简单.高效稳定.支持复杂数据结构以及自动内存管理等特点,已经在众多著名的游戏程序中大量被使用,如:愤怒的小鸟.星际争霸.魔兽世界等. 了解Redis详细配置及价格>> Redis支持LUA脚本的主要优势      LUA脚本的融合将使Redis数据库产生更多的使用场景,迸发更多新的优势: 高效

redis4.0之Lua脚本新姿势

前言 Redis内嵌了Lua环境来支持用户扩展功能,但是出于数据一致性考虑,要求脚本必须是纯函数的形式,也就是说对于一段Lua脚本给定相同的参数,写入Redis的数据也必须是相同的,对于随机性的写入Redis是拒绝的. 从Redis 3.2开始Lua脚本支持随机性写入,最近在总结4.0的新特性,索性就都归到4.0里,方便查阅. Redis中的Lua脚本 1. Lua脚本简介 在Redis中使用Lua脚本不可避免的要用到以下三个命令:EVAL.EVALSHA和SCRIPT,下面我们来简单介绍一下:

【COCOS2DX-LUA 脚本开发之十三】解决COCOS2DX-LUA编译到ANDROID找不到CCLUAENGINE、HELLOWORLD或出现GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1368.html 对于跨平台整合,Himi已经写了1.x 与 2.x 的了,还不知道如何整合的请移步到 [Cocos2d-X(2.x) 游戏开发系列之二]cocos2dx最新2.x版本跨平台整合NDK+Xcode,Xcode编写&编译代码,Android导入打包运行即可!) 本篇只是解决在整合cocos2dx-lua项目会

【COCOS2DX-LUA 脚本开发之一】LUA语言基础在COCOS2DX游戏中使用LUA脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/681.html 对于游戏公司而言,采用游戏脚本lua.python等进行开发也很常见,但是很多童鞋对脚本并没有很熟悉的概念,本篇则向大家简单介绍脚本的用途以及在Cocos2dx基础用法: Lua和python这些详细介绍的话,请不太熟悉的童鞋自行百度百科哈,那么对于lua和python则是两个常用的脚本语言,

【COCOS2DX(2.X)_LUA开发之三】在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/985.html 本篇做起来比较累,大家请参考最新篇[COCOS2DX-LUA 脚本开发之四]使用tolua++编译pkg,从而创建自定义类让Lua脚本使用 此篇可能会在最新的cocos2dx版本中出现如下问题: 1 2 LUA ERROR: ...24F82-1230-41FE-8A04-C445FB7D1BAB/mtet

【COCOS2DX-LUA 脚本开发之八】使用QUICK-COCOS2D-X或COCOS2DX-LUAPROXY的LUA框架实现LUA-HTTP网络交互!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1314.html      利用 cocos2dx-LuaProxy 也可以来实现lua版http功能,具体请移步到:[COCOS2DX-LUA 脚本开发之九]使用cocos2dx-LuaProxy便捷Lua项目快速使用cocos2dx引擎extensions扩展包   Cocos2dx 为我们封装了在cocos2dx中h