• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

cocos2dx中lua实现继承详解

mysql 搞代码 4年前 (2022-01-09) 16次浏览 已收录 0个评论

环境: cocos2dx版本为2.1.4 目标: 游戏中一般有玩家和怪物,他们都有相同的动作状态,如:idle、walk、attack、defense等,我们需要抽象出玩家和怪物的代码实现中中相同的部分 方法: cocos2dx中其实已经提供了类继承的一下工具函数,在sdk中的samples/Lua

环境:

cocos2dx版本为2.1.4

目标:

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

方法:

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

--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 clsend

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

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

实现:

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

require "extern"Actor = class("Actor", function()    return CCSprite:create()end)Actor.__index = Actor-- 常量kActorStateUnkown = 0kActorStateIdle = 1kActorStateAttack = 2kActorStateDefense = 3kActorStateWalk = 4-- 属性Actor._state = kActorStateUnkownActor._idle_action = nilActor._attack_action = nilActor._defense_action = nilActor._walk_action = nil-- 方法function Actor:idle()  if self._state ~= kActorStateIdle then    self:stopAllActions()    pcall(self:runAction(self._idle_action))    self._state = kActorStateIdle  endendfunction Actor:attack()  if self._state ~= kActorStateAttack then    self:stopAllActions()    pcall(self:runAction(self._attack_action))    self._state = kActorStateAttack  endendfunction Actor:defense()  if self._state ~= kActorStateDefense then    self:stopAllActions()    pcall(self:runAction(self._defense_action))    self._state = kActorStateDefense  endendfunction Actor:walk()  if self._state ~= kActorStateWalk then    self:stopAllActions()    pcall(self:runAction(self._walk_action))    self._state = kActorStateWalk  endendfunction Actor:create()  local actor = Actor.new()  return actorend

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

1、玩家的数据单例

require "extern"PlayerData = class("PlayerData")PlayerData.__index = PlayerDataPlayerData._inited = 0PlayerData._idle_action = nilPlayerData._attack_action = nilPlayerData._defense_action = nilPlayerData._walk_action = nilfunction PlayerData:lazyInit()  if (self._inited ~= 0) then    return  end  local cache = CCSpriteFrameCache:sharedSpriteFrameCache()  cache:addSpriteFramesWithFile("pd_sprites.plist")  local frames = nil  local frame = nil  local anim = nil  -- idle  frames = CCArray:createWithCapacity(6)  for i = 0, 5 do    frame = cache:spriteFrameByName(        string.format("hero_idle_%02d.png", i))    frames:addObject(frame)  end  anim = CCAnimation:createWithSpriteFrames(frames, 1.0 / 12.0)   self._idle_action = CCRepeatForever:create(CCAnimate:create(anim))  -- attack  frames = CCArray:createWithCapacity(3)  for i = 0, 2 do    frame = cache:spriteFrameByName(        string.format("hero_attack_00_%02d.png", i))    frames:addObject(frame)  end  anim = CCAnimation:createWithSpriteFrames(frames, 1.0 / 12.0)   self._attack_action = CCRepeatForever:create(CCAnimate:create(anim))  -- defense  self._defense_action = self._idle_action  -- walk  frames = CCArray:createWithCapacity(8)  for i = 0, 7 do    frame = cache:spriteFrameByName(        string.format("hero_walk_%02d.png", i))    frames:addObject(frame)  end  anim = CCAnimation:createWithSpriteFrames(frames, 1.0 / 12.0)   self._walk_action = CCRepeatForever:create(CCAnimate:create(anim))  self._inited = 1endfunction PlayerData:getAllAction()  self:lazyInit()  return self._idle_action, self._attack_action, self._defense_action,    self._walk_actionend

2、玩家类

require "actor"require "playerdata"Player = class("Player", function()    return Actor:create()end)Player.__index = Playerfunction Player:init()  self._idle_action, self._attack_action, self._defense_action,    self._walk_action = PlayerData:getAllAction()endfunction Player:create()  local player = Player.new()  player:init()  return<i>本文来源gaodai$ma#com搞$代*码网2</i> playerend

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:cocos2dx中lua实现继承详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址