COCOS2D-X Lua 面向对象编程
来源:互联网 发布:qq网络诈骗案例分析 编辑:程序博客网 时间:2024/05/18 20:51
猴子原创,欢迎转载。转载请注明:
转载自Cocos2D开发网–Cocos2Dev.com,谢谢!
原文地址: http://www.cocos2dev.com/?p=425
上次有个同学问我,说lua太简单了,没有什么结构,也不好做面向对象编程。其实可以这样说,Lua中的table就是一个对象。
下面我一点一点介绍Lua的面向对象编程。
一、对象的方法函数:
Hero = {attack = 100} function Hero.skill(addAttack) Hero.attack = Hero.attack + addAttack end Hero.skill(20) print(Hero.attack) --> 120
上面的先创建了一个函数,并调用该函数。
仔细的同学可能发现了,调用函数的时候使用了全局Hero。我在上一篇细节介绍中提过,Lua尽量减少全局变量的使用。而且这里也有风险,一不小心修改了Hero,可能Hero就不能正常工作了。
那么联想到上一篇写到的local temA = A,有人可能想到了这样修改上面的函数调用:
oneHero = Hero; Hero = nil oneHero.skill(30) print(oneHero.attack) --> 错误,oneHero为nil
这样也是错误的。因为Hero已经为nil了。
正确的如何修改呢?我们可以使用this/self 来实现:
Hero = {attack = 100} function Hero.skill(self,addAttack) self.attack = self.attack + addAttack end oneHero = Hero; Hero = nil oneHero.skill(oneHero,30) print(oneHero.attack) --> 130
OK,这下可以了,但是self每次需要自己传,看着就麻烦,其实Lua也可以隐性调用self,我们在修改下:
Hero = {attack = 100} function Hero:skill(addAttack) self.attack = self.attack + addAttack end oneHero = Hero; Hero = nil oneHero:skill(30) print(oneHero.attack) --> 130
请注意上面 : 的使用,冒号可以在方法中添加一个额外的隐藏参数。上面其实也看到了Hero.skill() 和Hero:skill()的区别。
二、类,将table作为自己的元表
例如上面的Hero例子,我们修改下:
Hero = {} function Hero:new(o) o = o or {} setmetatable(o,self) self.__index = self return o end function Hero:skill(addAttack) self.attack = self.attack + addAttack end oneHero = Hero:new{attack = 90} oneHero:skill(10) print(oneHero.attack) -->100
创建一个新英雄的时候,oneHero将Hero设置为自己的元表,当oneHero:skill(10)的时候,在table oneHero中查找skill,没有找到后,会进一步搜索元表的__index。
所以等价于:getmetatable(oneHero).__index.skill(oneHero,10)
而getmetatable(oneHero) 是Hero,Hero.__index还是Hero
所以等价于Hero.skill(oneHero,10)
三、继承
例如:
Hero = {attack = 0} function Hero:new(o) o = o or {} setmetatable(o,self) self.__index = self return o end function Hero:skill(addAttack) self.attack = self.attack + addAttack end function Hero:injured(loseAttack) if loseAttack > self.attack then error"not engouth attack" end self.attack = self.attack - loseAttack end HumanHero = Hero:new() oneHero = HumanHero:new{attack = 100} oneHero:skill(10) print(oneHero.attack) -->110
每个对象没有的方法都会去父类中查找(这里理解为父类),所以如果某个对象需要一些新的属性方法,只需要在该对象中实现就可以了。
- COCOS2D-X Lua面向对象编程
- COCOS2D-X Lua 面向对象编程
- COCOS2D-X Lua 面向对象编程
- COCOS2D-X Lua面向对象编程
- Cocos2d-x Lua游戏开发之Lua 面向对象编程
- cocos2d-x lua 面向对象
- Cocos2d-x 脚本语言Lua中的面向对象
- Cocos2d-x 脚本语言Lua中的面向对象
- 【quick-cocos2d-x】Lua 面向对象(OOP)编程与元表元方法
- 【cocos2d-x 3.5】Lua的简单面向对象
- lua 面向对象编程
- lua 面向对象编程
- Lua面向对象编程
- Lua面向对象编程
- cocos2d-x-lua基础系列教程三(lua面向对象)
- cocos2d-x lua tolua++ 面向对象 / cocos2dx3.0 lua C++交互
- Cocos2d-x lua 面向对象封装的一个简单弹出框
- cocos2d-x 平时例子(3)和lua写成面向对象
- java 多线程
- 性能分析工具gprof介绍
- android按返回键,弹出退出提示对话框,并退出应用程序。
- TextKit学习(三)NSTextStorage,NSLayoutManager,NSTextContainer和UITextView
- 调制解调笔记
- COCOS2D-X Lua 面向对象编程
- 实例二:Ajax返回Json在Java中的实现
- 基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门(TI达芬奇双核开发资料 [ .
- 数据结构 二叉树及中序、先序和后序输出
- 如何从 appdelegate.mm helloworldlayer.mm 中调用一个方法
- LoadRunner下DLL的调用
- 如何在windows上把你的项目提交到github
- C6000系列DSP的EMIFA接口 .
- LRM-00101: unknown parameter name 'location' LRM-00101: unknown parameter name 'valid_for' 粗心引起问题一例