cocos2dx中lua实现继承详解

原文链接(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”,其中有段代码如下:

[plain]  view plain copy print ?
  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继承,根据不同的状态播放不同的动画


实现:

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

[plain]  view plain copy print ?
  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、玩家的数据单例

[plain]  view plain copy print ?
  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、玩家类

[plain]  view plain copy print ?
  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  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值