本站文章均为[ 李华明Himi ](http://www.himigame.com/about-himi)原创,转载务必在明显处注明:
转载自[【黑米GameDev街区】](http://www.himigame.com/) 原文链接: [http://www.himigame.com/lua-2/985.html](http://www.himigame.com/lua-2/985.html "【Cocos2dX(2.x)_Lua开发之一】★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解")
[☞ 点击订阅 ☜](http://list.qq.com/cgi-bin/qf_invite?id=acfc24e272cc4a26debf3b3866edb626a9ea3fc80fd8893c) 本博客最新动态!及时将最新博文通知您!
本篇做起来比较累,大家请参考最新篇[【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pkg,从而创建自定义类让Lua脚本使用](http://www.himigame.com/lua1/1259.html)
此篇可能会在最新的cocos2dx版本中出现如下问题:
~~~
LUA ERROR: ...24F82-1230-41FE-8A04-C445FB7D1BAB/mtet.app/hello.lua:35:
error in function 'addChild'. argument #2 is 'MySprite'; 'CCNode' expected.
~~~
最近Himi都没有更新博文了,其实也是犹豫写本cocos2d(x)引擎书籍在做准备,目录的草稿都写好了,目录中包含的大家最感兴趣的cocos2d/x动作编辑器的详细制作流程与源码! 但是遗憾的是Himi还是腾不出时间去写;
放弃去写的另外一个原因就是因为支持我的童鞋门,在7月份就说过要为大家奉上关于cocos2dx-lua的系列教程,但是一直由于时间等问题一再拖到现在,如果Himi真要准备写书估计半年内都基本很难有时间更新博客的,当然也考虑到公司项目,最终放弃;(暂时放弃,以后有可能的话还是会写的 )![](image/56fcaa6a58e7f.gif)
顺便说一句,关于Himi9个技术群,不论是cocos2d-iphone、cocos2dx、android还是以后陆续公布的Unity3D群,周期性的Himi和管理员们会定期清理(一切都是为了更多想学习的新童鞋考虑),希望大家进群冒泡,积极讨论。好了,废话就不多说了,从今天开始Himi为童鞋们出cocos2dx-lua的系列开发教程,希望大家还一如既往得支持;3Q
Himi 当前开发工具等版本如下:
mac: 10.8 xcode:4.4.1 cocos2dx :cocos2d-2.0-rc2-x-2.0.1
本篇介绍两个知识点:
1\. Lua基础
2.在lua脚本中使用我们自定义的精灵类
### 一:lua基础
关于Lua的其实很早前Himi写过一篇关于cocos2dx-Lua 的基础博文了,但是是cocos2dx 1.x版本的,对于不是很熟悉的童鞋,Himi还是建议去看一看,连接:[【iOS-cocos2d-X 游戏开发之八】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!](http://www.himigame.com/iphone-cocos2dx/681.html) Himi以后更新的Lua系列都是基于Cocos2dx 2.x版本的了。
###二:在lua脚本中使用我们自定义的精灵类
首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite
HSprite.h:
~~~
//
// HSprite.h
// cocos2dx_lua_tests_by_Himi
//
// Created by Himi on 12-8-30.
//
//
#ifndef cocos2dx_lua_tests_by_Himi_HSprite_h
#define cocos2dx_lua_tests_by_Himi_HSprite_h
#include "cocos2d.h"
using namespace cocos2d;
class HSprite : public cocos2d::CCSprite{
public:
static HSprite* createHSprite(const char* _name);
void hspriteInit();
};
#endif
~~~
HSprite.cpp:
~~~
//
// HSprite.cpp
// cocos2dx_lua_tests_by_Himi
//
// Created by Himi on 12-8-30.
//
//
#import "HSprite.h"
HSprite* HSprite::createHSprite(const char* _name){
HSprite* sp = new HSprite();
if(sp && sp->initWithFile(_name)){
sp->hspriteInit();
sp->autorelease();
return sp;
}
CC_SAFE_DELETE(sp);
return NULL;
}
void HSprite::hspriteInit(){
CCMessageBox("create HSprite success", "Himi_Lua");
}
~~~
以上代码不做解释了,很简单,继承CCSprite,添加一个自动释放的创建函数(createHSprite)以及一个自定义初始化函数(hspriteInit)
下面我们打开LuaCocos2d.cpp 类,这个类在项目的 libs/lua/cocos2dx_support目录下,如下图:
![](https://box.kancloud.cn/2016-03-31_56fcd0275416b.png)
然后开始添加我们自定义精灵类,让Lua脚本能认识它;
步骤分为3步:
1\. 注册我们的自定义类:
在LuaCocos2d.cpp类中搜索“tolua_reg_types”这个函数,然后在其中进行注册:
~~~
tolua_usertype(tolua_S,"HSprite");
~~~
如下图所示:
![](https://box.kancloud.cn/2016-03-31_56fcd0276f911.png)
第二步:声明我们自定义类的函数:
搜索“tolua_Cocos2d_open”这个函数,然后在其中添加如下代码:
~~~
tolua_cclass(tolua_S, "HSprite", "HSprite", "CCSprite", NULL);
tolua_beginmodule(tolua_S,"HSprite");
tolua_function(tolua_S,"createHSprite",tolua_Himi_HSprite_createHSrpite00);
tolua_endmodule(tolua_S);
~~~
如下图:
![](https://box.kancloud.cn/2016-03-31_56fcd0279f71b.png)
这里开始解释:
首先定义能让脚本认识的类函数,遵循如下:
a) tolua_cclass(tolua_S, “HSprite”, “HSprite”, “CCSprite”, NULL);
tolua_cclass声明哪个类函数,第一个状态值默认:tolua_S
后两个参数:是自定义类类名
再往后是继承的父类类名
b)添加参数开始声明:
tolua_beginmodule(tolua_S,”HSprite”);
c) 添加自定类函数:
tolua_function(tolua_S,”createHSprite”,tolua_Himi_HSprite_createHSrpite00);
第一个参数默认,第二个参数自定义类名,第三个:实现脚本与自定义类之间的转换实现函数
注意,这里有多个函数,可以继续写;
d) 结束自定义函数:
tolua_endmodule(tolua_S);
第三步:实现我们的脚本之间转换函数 tolua_Himi_HSprite_createHSrpite00
实现如下:
~~~
/* method: create of class HSprite */
#ifndef TOLUA_DISABLE_tolua_Himi_HSprite_createHSrpite00
static int tolua_Himi_HSprite_createHSrpite00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertable(tolua_S,1,"HSprite",0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const char* pszFileName = ((const char*) tolua_tostring(tolua_S,2,0));
{
HSprite* tolua_ret = (HSprite*) HSprite::createHSprite(pszFileName);
int nID = (tolua_ret) ? tolua_ret->m_uID : -1;
int* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL;
tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"HSprite");
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'create'.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
~~~
如下图所示:
[![](https://box.kancloud.cn/2016-03-31_56fcd027c5e60.jpg)](http://www.himigame.com/wp-content/uploads/2012/08/32.jpg)
这里Himi解释下:
童鞋们可以从第 384行的 #endif 把这个实现函数分为两部分来看,
首先是375~384之间的代码:
~~~
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertable(tolua_S,1,"HSprite",0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
~~~
这里是对参数类型的判断:
tolua_isusertable 是否为”第三个参数”自定义类型
tolua_isstring 是否为字符串类型
tolua_isnoobj 结束(没有参数的判断)
然后是386~392之间的代码段:
~~~
const char* pszFileName = ((const char*) tolua_tostring(tolua_S,2,0));
{
HSprite* tolua_ret = (HSprite*) HSprite::createHSprite(pszFileName);
int nID = (tolua_ret) ? tolua_ret->m_uID : -1;
int* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL;
tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"HSprite");
}
~~~
这里是对脚本代码的解析从而调用的自定义创建的函数
最后我们修改 hello2.lua 脚本中的代码:(创建cocos2dx-lua项目默认Resources下自带的文件)
在脚本最后”– run”下代码修改如下:
~~~
-- run
local sceneGame = CCScene:create()
-- sceneGame:addChild(createLayerFram())
-- sceneGame:addChild(createLayerMenu())
sceneGame:addChild(createHimiLayer())
CCDirector:sharedDirector():runWithScene(sceneGame)
~~~
这里Himi注视了另个layer的添加,添加了自己的Layer
~~~
sceneGame:addChild(createHimiLayer())
~~~
然后将Himi自定义方法添加在脚本中,代码如下:
~~~
local function createHimiLayer()
local layerH = CCLayer:create()
local _font = CCLabelTTF:create("Himi_(cocos2dx-Lua)教程","Arial",33)
_font:setPosition(230,280)
layerH:addChild(_font)
--创建自定义类型精灵
local hsprite = HSprite:createHSprite("himi.png")
hsprite:setPosition(100,100)
hsprite:setScale(1.5)
hsprite:setRotation(45)
layerH:addChild(hsprite)
return layerH
end
~~~
创建自己定义的精灵,然后进行调用缩放,旋转,设置坐标函数。
ok,运行后的接图如下:
![](https://box.kancloud.cn/2016-03-31_56fcd027ec0e1.png)
好了,本篇就到这里,童鞋们感觉本站好的文章记得分享,转播散播哦
- 前言
- 【Iphone 游戏开发】游戏引擎剖析
- [Object-C语言随笔之一]Mac os 下搭建iOS开发环境
- [Object-C语言随笔之二] 《NSLog》常用的打印调试语句与自动排版
- [Object-C语言随笔之三] 类的创建和实例化以及函数的添加和调用!
- [Object-C语言随笔之四]创建视图并绘制简单图形
- 【iOS-Cocos2d游戏开发之一】搭建cocos2d游戏引擎环境HelloWorld!
- 【iOS-Cocos2d游戏开发之二】Cocos2D 游戏开发资源贴(教程以及源码)
- 【iOS-Cocos2d游戏开发之三】CCScene切换的所有特效(28种)以及设置屏幕横竖屏!
- 【iOS-Cocos2d游戏开发之四】独自收集Cocos2d提供的字体!共57种(有对照的字体图)
- 【iOS-Cocos2d游戏开发之五】多触点与触屏事件详解(单一监听、事件分发)【11月28日更新】
- 【iOS-Cocos2d游戏开发之六】对触屏事件追加讲解,解决无法触发ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戏开发之七】在cocos2d中添加/删除系统组件,并解决View设置透明会影响View中的其他组件的问题!【11月28日更新解决添加组件Cocos2d动画停止播放的BUG】
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【iOS-Cocos2d游戏开发之十三】CCSprite利用Bezier(贝塞尔)做抛物线动作并让CCSprite同时播放两个Action动作!
- 【iOS-Cocos2d游戏开发之十四】音频/音效/视频播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d进行视频播放!)
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!
- 【iOS-Cocos2d游戏开发之十六】添加本地通知(UILocalNotification)以及添加系统组件滚动视图(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戏开发之十七】灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint),并结合可视区域与锚点制作进度条!
- 【iOS开发必备指南合集】申请企业级IDP、真机调试、游戏接入GameCenter 指南(实现仿官方的成就提示)、游戏接入OpenFeint指南;
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】
- 【iOS-cocos2d-X 游戏开发之一】在Mac下结合Xcode搭建Cocos2d-X开发环境!
- 【iOS-cocos2d-X 游戏开发之二】【必看篇】总结阐述Cocos2d-X与Cocos2d-iphone区别;
- 【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3
- 【iOS-Cocos2d游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排z轴等)以及利用CCSprite与CCLayerColor制作简单遮盖层!
- 【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧(指定开始帧)以及扩展Cocos2d源码的CCAnimation简化动画创建!
- 【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现CCAnimate动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)!
- 【iOS-cocos2d-X 游戏开发之三】Mac下配置Android NDK环境并搭建Cocos2d-x环境并Eclipse正常编译运行Cocos2dX自带TestsDemo项目!
- 【iOS-cocos2d-X 游戏开发之四】Cocos2dX创建Android NDK新项目并编译导入Eclipse中正常运行!
- 【iOS-cocos2d-X 游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;
- 【iOS-cocos2d-X 游戏开发之六】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码!
- 【iOS-cocos2d-X 游戏开发之七】整合Cocos2dX的Android项目到Xcode项目中,Xcode编写&编译代码,Android导入打包运行即可!
- 【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手!【2012年5月2日更新防护iap Free的方法】
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
- 【iOS-cocos2d-X 游戏开发之十】自定义CCSprite/Layer/CCNode及静态类模版&自定义类细节说明&Cocos2dx触屏事件讲解
- 【iOS-cocos2d-X 游戏开发之十一】New CCSprite()带来的错误&使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戏开发之十二】自定义Cocos2dx摇杆(增强Joystick),增加摇杆跟随用户触点作为摇杆坐标,让摇杆不再死板!
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 【iOS-cocos2d-X 游戏开发之十四】Xcode中c++&Object-C混编,详细介绍如何在cocos2dx中访问object函数以及Apple Api
- 【iOS-cocos2d-X 游戏开发之十五】Cocos2dx中响应Android的Back(返回)与Menu(小房子)事件&&Cocos2dx自动释放粒子内存函数!
- 【iOS-cocos2d-X 游戏开发之十六】配置你的Cocos2dx项目编译后的Android自动使用(-hd)高清图&设置Android自适应屏幕、缩放比例方法!
- 【Cocoa(mac) Application 开发系列之四】动作编辑器(Cocos2dx)制作流程详解及附上响应鼠标滚轴事件、反转坐标系、导入/创建资源目录等知识点代码!
- 【Cocos2d-X(2.x) 游戏开发系列之一】cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解!在2.x版CCFileData类被去除等
- 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2.0.1版本跨平台整合NDK+Xcode,Xcode编写&编译代码,Android导入打包运行即可!
- 【Cocos2dX(2.x)_Lua开发之三】★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d­2.0­x­2.0.2使用新资源加载策略!不再沿用-hd、-ipad、-ipadhd添加后缀方式
- 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
- 【Cocos2d-X(1.x 2.x) 】iOS6与iphone5适相关设置随笔(解决第三方类库无法通过armv7s编译的方法、添加Default-568h@2x.png)