分析cocos2d-x的lua项目中的工具方法
在创建完cocos2d-x的lua项目后。打开项目的Resources中的extern.lua文件。里面有两个用于面向对象的方法。一个是用于克隆,一个是用于继承。
代码分析例如以下
--克隆一个对象
function clone(object)
--用于存储被訪问过的对象的表
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then--假设类别不等于table。返回当前參数
return object
elseif lookup_table[object] then--假设备份表中存在该对象,则直接返回
return lookup_table[object]
end
local new_table = {}--创建一个新的表
lookup_table[object] = new_table--把即将被訪问过的表存到备份表
for key, value in pairs(object) do--遍历,赋值
new_table[_copy(key)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))--设置元表。用于继承
end
return _copy(object)
end --Create an class.
--创建类(类名。 父类)
function class(classname, super)
local superType = type(super)--获取父类的类型
local cls--定义一个变量。用来存储新创建的类的属性和函数 if superType ~= "function" and superType ~= "table" then--假设父类不是function类别或表类别。父类置空
superType = nil
super = nil
end if superType == "function" or (super and super.__ctype == 1) then--假设父类型是个function或者来自是c++的类
-- inherited from native C++ Object
print(superType)
cls = {} if superType == "table" then--来自引擎自带的c++类
-- copy fields from super
for k,v in pairs(super) do cls[k] = v end-
cls.__create = super.__create
cls.super = super
else--function
cls.__create = super
end cls.ctor = function() end--构造
cls.__cname = classname--类名
cls.__ctype = 1--指明派生与C++的类
--创建一个用于创建类的实例的方法
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--创建一个属性,指向cls
instance:ctor(...)--构造
return instance
end else
-- inherited from Lua Object
if super then--假设父类不为空
cls = clone(super)--把类克隆,放到cls中
cls.super = super--创建一个属性,指向父类
else
cls = {ctor = function() end}--否则创建一个空的构造函数
end cls.__cname = classname--创建一个属性,指明类的名称
cls.__ctype = 2 -- lua 指明继承自lua自己定义的表
cls.__index = cls --把__index指向自己,用于形成一个继承的原型链
--创建一个用于创建类的实例的方法
function cls.new(...)
local instance = setmetatable({}, cls)--创建一个空表,并设置它的元表为cls,即继承cls
instance.class = cls--创建一个属性。指向cls
instance:ctor(...)--调用构造函数
return instance
end
end return cls
end
測试用比例如以下
在hello.lua文件里增加例如以下代码
--引入extern.lua
require "extern"
--test
local function test()
local luaTable = {x=1, y=2}
local N = class("N", luaTable)
cclog("继承lua自己定义的表,訪问父类的x属性值:x="..N.x) local testSprite = function ()
return CCSprite:create("farm.jpg")
end
local M = class("M", testSprite)
local m = M:new()
m.customField = "customField"
m:setOpacity(100)
cclog("用C++本地类的方式继承。訪问父类改动后的属性:"..m:getOpacity())
cclog("訪问子类属性:"..m:getOpacity())
end
test()
执行,结果例如以下
分析cocos2d-x的lua项目中的工具方法的更多相关文章
- 关联分析FPGrowth算法在JavaWeb项目中的应用
关联分析(关联挖掘)是指在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.关联分析的一个典型例子是购物篮分析.通过发现顾客放入购物篮中不同商品之 ...
- 项目中常用js方法整理common.js
抽空把项目中常用js方法整理成了common.js,都是网上搜集而来的,大家一起分享吧. var h = {}; h.get = function (url, data, ok, error) { $ ...
- vue-cli+webpack在生成的项目中使用bootstrap方法(二)
vue-cli+webpack在生成的项目中使用bootstrap方法(一)中,是通过手动下载bootstrap库,然后手动添加到src/assets中,显然是过程太多. 当然是可以更省力些,可以通过 ...
- 秒味课堂Angular js笔记------Angular js中的工具方法
Angular js中的工具方法 angular.isArray angular.isDate angular.isDefined angular.isUndefined angular.isFunc ...
- jquery-12 jquery中的工具方法有哪些
jquery-12 jquery中的工具方法有哪些 一.总结 一句话总结:四个较常用方法.1.isArray();2.isFunction();3.isEmptyObejct();4.trim(); ...
- IntelliJ 如何找到项目中 Deprecated 的方法
在一个项目中,如果我们标记了某些元素为 Deprecated 的话,如何让我们能够快速找到? 简单来说,你可以对项目进行 Code Inspection. 选择 Analyze > Inspec ...
- npm包管理工具在一般项目中的应用方法
最近自己在有时间,在通学一些知识点,记录一下,以便以后使用方面 当我们在做项目的时候,如果需要到包管理工具,那么我们一定会经历以下流程: 1.首先在官网下载node.js,然后默认安装到C盘 检查是否 ...
- vue-cli+webpack在生成的项目中使用bootstrap方法(一)
在一个html页面中加入bootstrap是很方便,就是一般的将css和js文件通过Link和Script标签就行. 那么在一个用vue-vli生成的前端项目中如何加入?因为框架不一样了,略微要适应一 ...
- php 项目中自定义日志方法
在现在项目中之前没有定义日志的方法,每次调试起来很麻烦,经常不能输出参数,只能用写日志的方法,一直用file_put_contents很烦躁,于是用了一点时间,写了这样一个方法: <?php / ...
随机推荐
- Callable、Future、FutureTask_笔记
参考:http://blog.csdn.net/javazejian/article/details/50896505 1.Callable<V>接口 Runnable接口 public ...
- bzoj3694最短路
bzoj3694最短路 Description 给出一个n个点m条边的无向图,n个点的编号从1~n,定义源点为1.定义最短路树如下:从源点1经过边集T到任意一点i有且仅有一条路径,且这条路径是整个图1 ...
- 完美匹配(matching)
完美匹配(matching) 题目描述 给定nn个点,mm条边的无向图G=(V,E)G=(V,E),求出它的完美匹配数量对106+3106+3取模的值. 一个完美匹配可以用一个排列ϕ:V→Vϕ:V→V ...
- 人类基因(human)
题目描述 上了大学之后,小W和小Z一起报了一门三宝课,在实践课上遇到了一些问题. 一条染色体上有nn对基因,每种基因都可以用一个数ai来表示,作为标号. 现在,在其中一条染色单体上某基因发生了突变. ...
- Codeforces Round #440(Div.2)
一句话题意: A:给出两个长为\(n\),\(m\)的的数组,每个数在\(1\)到\(9\)之间,求出一个最小的数使得至少有一位出现在一个数组中,且至少有一位出现在另一个数组中.\(n,m\leq9\ ...
- 【ubuntu】配置zsh
1. 修改默认shell为zsh chsh -s /bin/zsh echo $SHELL$ 2. 下载oh-my-zsh wget https://raw.github.com/robbyrusse ...
- layer相关
关闭窗口 var index = parent.layer.getFrameIndex(window.name);parent.layer.close(index);
- 基于SSM3框架FreeMarker自定义指令(标签)实现
通过之前的Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解系列文章,我们已经成功的整合到了一起,这次大象将在此基础上对框架中的FreeMarker模板 ...
- 00深入理解C指针之--- 指针之外
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. C语言从诞生之初就非常善于和硬件打交道,经过这么多年的发展之后,其灵活性和超强的特征是 ...
- VIM使用技巧4
使移动和修改都能重复,对重复的操作能够回退比能够重复更加重要: 目的操作重复回退序号 执行修改{edit}.u1 在行内查找下一个指定字符 f{char}/t{char};,2 在行内查找上一个指定字 ...