cocos2dx中lua实现继承详解

转载 2013年12月01日 20:46:17

原文链接(http://blog.csdn.net/kibaamor/article/details/12838897)


环境:

cocos2dx版本为2.1.4


目标:

游戏中一般有玩家和怪物,他们都有相同的动作状态,如:idle、walk、attack、defense等,我们需要抽象出玩家和怪物的代码实现中中相同的部分


方法:

cocos2dx中其实已经提供了类继承的一下工具函数,在sdk中的samples/Lua/TestLua/Resources/luaScript目录下有一个名为“extern.lua”,其中有段代码如下:

  1. --Create an class.  
  2. function class(classname, super)  
  3.     local superType = type(super)  
  4.     local cls  
  5.    
  6.     if superType ~= "function" and superType ~= "table" then  
  7.         superType = nil  
  8.         super = nil  
  9.     end  
  10.    
  11.     if superType == "function" or (super and super.__ctype == 1) then  
  12.         -- inherited from native C++ Object  
  13.         cls = {}  
  14.    
  15.         if superType == "table" then  
  16.             -- copy fields from super  
  17.             for k,v in pairs(super) do cls[k] = v end  
  18.             cls.__create = super.__create  
  19.             cls.super    = super  
  20.         else  
  21.             cls.__create = super  
  22.         end  
  23.    
  24.         cls.ctor    = function() end  
  25.         cls.__cname = classname  
  26.         cls.__ctype = 1  
  27.    
  28.         function cls.new(...)  
  29.             local instance = cls.__create(...)  
  30.             -- copy fields from class to native object  
  31.             for k,v in pairs(cls) do instance[k] = v end  
  32.             instance.class = cls  
  33.             instance:ctor(...)  
  34.             return instance  
  35.         end  
  36.    
  37.     else  
  38.         -- inherited from Lua Object  
  39.         if super then  
  40.             cls = clone(super)  
  41.             cls.super = super  
  42.         else  
  43.             cls = {ctor = function() end}  
  44.         end  
  45.    
  46.         cls.__cname = classname  
  47.         cls.__ctype = 2 -- lua  
  48.         cls.__index = cls  
  49.    
  50.         function cls.new(...)  
  51.             local instance = setmetatable({}, cls)  
  52.             instance.class = cls  
  53.             instance:ctor(...)  
  54.             return instance  
  55.         end  
  56.     end  
  57.    
  58.     return cls  
  59. end  

函数class的第一个参数就是我们要实现的类的名称,可以不传第二个参数或者给第二参数传一个function或者table。


我们从cocos2dx中的CCSprite继承,根据不同的状态播放不同的动画


实现:

玩家和怪物的基类可如下实现:

  1. require "extern"  
  2.   
  3. Actor = class("Actor", function()  
  4.     return CCSprite:create()  
  5. end)  
  6.   
  7. Actor.__index = Actor  
  8.   
  9. -- 常量  
  10. kActorStateUnkown = 0  
  11. kActorStateIdle = 1  
  12. kActorStateAttack = 2  
  13. kActorStateDefense = 3  
  14. kActorStateWalk = 4  
  15.   
  16. -- 属性  
  17. Actor._state = kActorStateUnkown  
  18. Actor._idle_action = nil  
  19. Actor._attack_action = nil  
  20. Actor._defense_action = nil  
  21. Actor._walk_action = nil  
  22.   
  23. -- 方法  
  24. function Actor:idle()  
  25.   if self._state ~= kActorStateIdle then  
  26.     self:stopAllActions()  
  27.     pcall(self:runAction(self._idle_action))  
  28.     self._state = kActorStateIdle  
  29.   end  
  30. end  
  31.   
  32. function Actor:attack()  
  33.   if self._state ~= kActorStateAttack then  
  34.     self:stopAllActions()  
  35.     pcall(self:runAction(self._attack_action))  
  36.     self._state = kActorStateAttack  
  37.   end  
  38. end  
  39.   
  40. function Actor:defense()  
  41.   if self._state ~= kActorStateDefense then  
  42.     self:stopAllActions()  
  43.     pcall(self:runAction(self._defense_action))  
  44.     self._state = kActorStateDefense  
  45.   end  
  46. end  
  47.   
  48. function Actor:walk()  
  49.   if self._state ~= kActorStateWalk then  
  50.     self:stopAllActions()  
  51.     pcall(self:runAction(self._walk_action))  
  52.     self._state = kActorStateWalk  
  53.   end  
  54. end  
  55.   
  56. function Actor:create()  
  57.   local actor = Actor.new()  
  58.   return actor  
  59. end  

有了基类后,玩家的的实现可以如下:


1、玩家的数据单例

  1. require "extern"  
  2.   
  3. PlayerData = class("PlayerData")  
  4.   
  5. PlayerData.__index = PlayerData  
  6.   
  7. PlayerData._inited = 0  
  8. PlayerData._idle_action = nil  
  9. PlayerData._attack_action = nil  
  10. PlayerData._defense_action = nil  
  11. PlayerData._walk_action = nil  
  12.   
  13. function PlayerData:lazyInit()  
  14.   if (self._inited ~= 0) then  
  15.     return  
  16.   end  
  17.   
  18.   local cache = CCSpriteFrameCache:sharedSpriteFrameCache()  
  19.   cache:addSpriteFramesWithFile("pd_sprites.plist")  
  20.   
  21.   local frames = nil  
  22.   local frame = nil  
  23.   local anim = nil  
  24.   
  25.   -- idle  
  26.   frames = CCArray:createWithCapacity(6)  
  27.   for i = 0, 5 do  
  28.     frame = cache:spriteFrameByName(  
  29.         string.format("hero_idle_%02d.png", i))  
  30.     frames:addObject(frame)  
  31.   end  
  32.   anim = CCAnimation:createWithSpriteFrames(frames, 1.0 / 12.0)   
  33.   self._idle_action = CCRepeatForever:create(CCAnimate:create(anim))  
  34.   
  35.   -- attack  
  36.   frames = CCArray:createWithCapacity(3)  
  37.   for i = 0, 2 do  
  38.     frame = cache:spriteFrameByName(  
  39.         string.format("hero_attack_00_%02d.png", i))  
  40.     frames:addObject(frame)  
  41.   end  
  42.   anim = CCAnimation:createWithSpriteFrames(frames, 1.0 / 12.0)   
  43.   self._attack_action = CCRepeatForever:create(CCAnimate:create(anim))  
  44.   
  45.   -- defense  
  46.   self._defense_action = self._idle_action  
  47.   
  48.   -- walk  
  49.   frames = CCArray:createWithCapacity(8)  
  50.   for i = 0, 7 do  
  51.     frame = cache:spriteFrameByName(  
  52.         string.format("hero_walk_%02d.png", i))  
  53.     frames:addObject(frame)  
  54.   end  
  55.   anim = CCAnimation:createWithSpriteFrames(frames, 1.0 / 12.0)   
  56.   self._walk_action = CCRepeatForever:create(CCAnimate:create(anim))  
  57.   
  58.   self._inited = 1  
  59. end  
  60.   
  61. function PlayerData:getAllAction()  
  62.   self:lazyInit()  
  63.   return self._idle_action, self._attack_action, self._defense_action,  
  64.     self._walk_action  
  65. end  


 2、玩家类

  1. require "actor"  
  2. require "playerdata"  
  3.   
  4. Player = class("Player", function()  
  5.     return Actor:create()  
  6. end)  
  7.   
  8. Player.__index = Player  
  9.   
  10. function Player:init()  
  11.   self._idle_action, self._attack_action, self._defense_action,  
  12.     self._walk_action = PlayerData:getAllAction()  
  13. end  
  14.   
  15. function Player:create()  
  16.   local player = Player.new()  
  17.   player:init()  
  18.   return player  
  19. end  

相关文章推荐

cocos2dx中lua实现继承详解

环境: cocos2dx版本为2.1.4 目标: 游戏中一般有玩家和怪物,他们都有相同的动作状态,如:idle、walk、attack、defense等,我们需要抽象出玩家和怪物的代码实...

cocos2dx lua中使用class实现继承api中的类

直接上代码,代码中有解释

cocos2dx-lua中实现面向对象的封装继承

class函数是在"cocos2d-x-3.2/cocos/scripting/lua-bindings/script/extern.lua"中定义的。 -- Cre...

cocos2dx lua XXTEA来加密解密实现详解

cocos2dx lua已经集成了对lua脚本的加解密,见AppDelegate.cpp     LuaStack* stack = engine->getLuaStack();     s...

cocos2dx开发中的lua继承与覆盖C++方法

cocos2dx开发中的lua继承与覆盖C++方法 2013年9月23日发表评论阅读评论 前段时间开始学习cocos2d-x,后面会陆续写一些cocos2d-x方面的东西。由于...

cocos2dx lua继承C++类

这段时间用lua在做一个项目,用cocos2dx为基础来开发,采用lua脚本语言为核心语言。但是对lua几乎零基础的我,处处碰壁。首先了解到lua一般是用面向过程的方式来写脚本,并且看到cocos2d...

quick cocos2dx基础(一):lua类及继承,class解析

学习quick cocos2dx,首先必须要掌握基本的lua知识,在quick中,大量出现了类,继承以及class...
  • sq2108
  • sq2108
  • 2014年10月21日 10:18
  • 1708

cocos2dx+lua注册事件函数详解

coocs2dx 版本 3.1.1 registerScriptTouchHandler 注册触屏事件 registerScriptTapHandler 注册点击事件 registe...

cocos2dx开发中的lua继承与覆盖C++方法

前段时间开始学习cocos2d-x,后面会陆续写一些cocos2d-x方面的东西。由于cocos2d-x支持lua脚本绑定,所以我们的项目是C++与lua混用,要求运行时效率高及内存占用少的部分使用C...

关于cocos2dx虚拟摇杆的lua实现

看到网上不少虚拟摇杆的代码,但是都是在c++里面实现,非常不方便,所以我自己把c++的代码移植到lua里面 local VitrualController = class("VitrualC...
  • xlbboy
  • xlbboy
  • 2016年07月25日 18:14
  • 646
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2dx中lua实现继承详解
举报原因:
原因补充:

(最多只允许输入30个字)