0

0

cocos2dx中lua实现继承详解

php中文网

php中文网

发布时间:2016-06-07 15:37:37

|

1607人浏览过

|

来源于php中文网

原创

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

环境:

cocos2dx版本为2.1.4


Catimind
Catimind

专为行业应用打造的AI生产力工具

下载

目标:

游戏中一般有玩家和怪物,他们都有相同的动作状态,如: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 cls
end

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


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


实现:

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

require "extern"

Actor = class("Actor", function()
    return CCSprite:create()
end)

Actor.__index = Actor

-- 常量
kActorStateUnkown = 0
kActorStateIdle = 1
kActorStateAttack = 2
kActorStateDefense = 3
kActorStateWalk = 4

-- 属性
Actor._state = kActorStateUnkown
Actor._idle_action = nil
Actor._attack_action = nil
Actor._defense_action = nil
Actor._walk_action = nil

-- 方法
function Actor:idle()
  if self._state ~= kActorStateIdle then
    self:stopAllActions()
    pcall(self:runAction(self._idle_action))
    self._state = kActorStateIdle
  end
end

function Actor:attack()
  if self._state ~= kActorStateAttack then
    self:stopAllActions()
    pcall(self:runAction(self._attack_action))
    self._state = kActorStateAttack
  end
end

function Actor:defense()
  if self._state ~= kActorStateDefense then
    self:stopAllActions()
    pcall(self:runAction(self._defense_action))
    self._state = kActorStateDefense
  end
end

function Actor:walk()
  if self._state ~= kActorStateWalk then
    self:stopAllActions()
    pcall(self:runAction(self._walk_action))
    self._state = kActorStateWalk
  end
end

function Actor:create()
  local actor = Actor.new()
  return actor
end

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


1、玩家的数据单例

require "extern"

PlayerData = class("PlayerData")

PlayerData.__index = PlayerData

PlayerData._inited = 0
PlayerData._idle_action = nil
PlayerData._attack_action = nil
PlayerData._defense_action = nil
PlayerData._walk_action = nil

function 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 = 1
end

function PlayerData:getAllAction()
  self:lazyInit()
  return self._idle_action, self._attack_action, self._defense_action,
    self._walk_action
end


 2、玩家类

require "actor"
require "playerdata"

Player = class("Player", function()
    return Actor:create()
end)

Player.__index = Player

function Player:init()
  self._idle_action, self._attack_action, self._defense_action,
    self._walk_action = PlayerData:getAllAction()
end

function Player:create()
  local player = Player.new()
  player:init()
  return player
end


热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 序列化
Python 序列化

本专题整合了python序列化、反序列化相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.02

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

91

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

27

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

11

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

5

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

5

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

55

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

27

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Lua 5.3 中文开发手册
Lua 5.3 中文开发手册

共0课时 | 0人学习

Lua参考手册
Lua参考手册

共0课时 | 0人学习

Lua教程
Lua教程

共22课时 | 17.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号