cocos2d-x 流程和一些类的使用总结


昨天写的一篇博客没有保存丢掉了,太可惜了,回头重新写吧。


明天要去面试,今天准备下关于cocos2d-x的一些东西。


首先说下流程吧。


我们都知道cocos2d-x有一个全局的类:CCDirector,他是个单例,通过CCDirector获取其对象(CCDirector::shareDirector())


一个游戏分为多个场景(scene),每个场景又分为多个图层(Layer),图层中又有很多的精灵Sprite.


游戏通常都是从菜单进入的,菜单就是一个Scene,事实上,Scene并不提供渲染,或者说他只是个舞台,他什么都没有只是个架子,


如果需要展示,需要layer对其填充,当我们创建一个精灵后,需要放入到layer中,layer 的addChild(xx,yy)方法提供了这个功能,其中xx表示放入


layer中的精灵(Sprite),yy表示zorder,叫z轴或渲染深度,这个值决定了精灵之间的相互掩盖的关系,值越大越靠上,上面的精灵在和下面的精灵


重合的时候会覆盖掉下面的。既然说到了渲染,那就好好介绍下这个吧。渲染这个词听起来有些唬人,其实说绘制更好。说到渲染就不得不说CCNode类,


因为渲染说到底都是node对象的渲染,这点可以从主循环mainLoop()函数中看出来,当所有的节点都添加到了layer上,而layer又通过scene类对象的


addChild方法添加,对layer中包含的所有的精灵采用了深度优先遍历的算法遍历每一个精灵,每一个精灵的visit()方法代表绘制自己,也就是渲染自己,


当然在渲染自己的时候还会经过一些矩阵的运算(cocos2d采用了PVM就是工程模型视图,先保留当前的矩阵,得到转换矩阵后,两个矩阵相乘)。



还有一些类需要说些。


CCMenuItemImage 其使用create方法创建,参数中menu_selector方法中填写点击时触发的方法。如果参数中放置两个图片,代表点击切换效果


//预加载背景音乐

SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("background.mp3") );
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("background.mp3")).c_str(), true);


CCTargetedTouchDelegate

对这个类进行继承,既可以实现对屏幕滑动的响应

其中:

onEnter()  精灵第一次进入时候执行,方法中首先需要执行CCNode::onEnter()

通常还会对这个节点精灵执行触摸分发

CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);

onTouchBegin()方法中通常可以计算出触摸的偏移量

CCPoint touchPoint = touch->locationInView();
touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);
offset.x = touchPoint.x - this->getPosition().x;
offset.y = touchPoint.y - this->getPosition().y;


scheduleUpdate();//定时调度update方法
schedule(schedule_selector(CatDog::updateBullet), 1.2f);//定时调度updateBullet方法

两个方法的区别是一个指定了方法名,不可更改,另一个可以自己指定需要定时调度的名字,后者在定时调度上定时的意义更大,是更为准确的

定时调度,相同的地方在于所调用的方法都必须是带有float参数的。


CCSprite

这个类创建对象可以使用create工厂方法

加载可以有两种,一种是initWithxxx,另一种是spritewithxxx,,主要区别在前一种多数操作时手动执行,而后一中则是纯自动化操作(引述:http://blog.csdn.net/cg0206/article/details/7945648),

1》从文件中加载:只需要 CCSprite::spriteWithFile("文件完整名称"); 其中文件名必须是完整路径,

2)间接加载

对于那些需要经常进行加载操作和移除操作的资源,如果频繁的加载将降低效率,因而通常的操作时加载到缓存中然后从缓存中加载

CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename);

CCTextureCache的shareTextureCache方法单例返回其指针,使用addimage添加一个图片,返回一个CCTexture2D的指针,这个指针指向

一个缓存。我们可以使用:pSprite = CCSprite::spriteWithTexture(pTexture);

如果一个资源已经被加入到了缓存,addImage是不会再加一遍的


另外一种间接加载的方法是:SpriteFrame,

sprirteFrame就是把一个大图片切成多个小图片,每个小图片就是一个spriteFrame,spriteFrame所在的矩形区域信息放置在plist文件中并通过一个名称作为索引(这个大文件可以通过 Zwoptex 可以生成),用的时候需要这个.plist文件盒大图片放在一起,用的时候加载到缓存

CCSpriteFrameCache *pCache = CCSpriteFrameCache::sharedSpriteFrameCache();

pCache->addSpriteFramesWithFile("XXXX.plist");

然后可以用两种方法加载

pSprite = CCSprite::spriteWithSpriteFrame(pCache->spriteFrameByName(szFrameName));

pSprite = CCSprite::spriteWithSpriteFrameName(szFrameName);

事实上,如果我们知道sprteframe在大图中的矩形区域的大小和位置时,我们也可以使用CCTexture2D 使用CCRect参数



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值