【玩转cocos2d-x之二十七】CCSequence不能执行CCRepeatForever

之前在遇到这么一个问题,在CCSequence中加入CCRepeatForever,发现其他动作执行没问题,就是CCRepeatForever无法执行。代码并没有问题,很奇怪。

示例

示例
1
2
3
4
5
6
7
8
9
10
11
12
CCBlink* blink=CCBlink::create(0.5f,10);//创建闪烁动画,duration=0.5s  
CCAnimation* animation=CCAnimation::create();
animation->addSpriteFrameWithFileName("CloseNormal.png");
animation->addSpriteFrameWithFileName("CloseSelected.png");
animation->setDelayPerUnit(1.0f);//帧间间隔1s
CCAnimate* animate=CCAnimate::create(animation);//创建帧动画
CCRepeatForever* repeat=CCRepeatForever::create(animate);
CCSequence* sequence=CCSequence::create(blink,repeat,NULL);//创建连续动画
CCSprite* close=CCSprite::create("CloseNormal.png");
close->setPosition(ccp(240,160));
this->addChild(close);
close->runAction(sequence);//执行连续动画

结果精灵闪烁10次以后,帧动画不执行了。

【玩转cocos2d-x之二十六】数据结构CCDictionary

CCDictionary在cocos2d-x中被大量的应用,比如CCTexureCache,CCSpriteFramCache等等。

实现原理

uthash

CCDictionary是使用uthash实现的,而过时的CCMutableDictionary则是使用STL实现,就效率而言CCDictionary至少提升了两倍,而且CCDictionary并没有使用C++模版,因此也很容易绑定到脚本。

uthash是一个C/C++的哈希表实现,它以宏定义的方式实现了哈希表,不仅加快了运行速度,而且与key类型无关。它的github在这里。cocos2d-x的头文件在\cocos2d-x-2.2.0\cocos2dx\support\data_support\uthash.h。

【玩转cocos2d-x之二十四】截图保存功能的实现

官方TestCpp有这个demo了,这里还是把它单独拖出来写一下,游戏推广的一个很重要组成就是玩家分享,所以游戏截图就起到很大作用了。截图功能通过CCRenderTexture实现。

CCRenderTexture

CCRenderTexture是一个通用渲染对象,可以通过构建一个CCRenderTexture对象,进而把要渲染的东西填充进去,在渲染开始前调用call函数,调用cocos的场景的visit函数对其进行渲染,渲染结束后调用end函数。CCRenderTexture继承于CCNode,所以可以简单地把渲染纹理添加到你的场景中,就像处理其它cocos中的节点一样,当然它还提供了保存功能,可以把渲染纹理保存为PNG或JPG格式。

【玩转cocos2d-x之二十三】多线程和同步03-图片异步加载

cocos2d-x中和Android,Windows都一样,如果在主线程中处理一些耗时操作,那么主线程就会出现阻塞现象,表现在界面上就是卡住,未响应等情况。为了避免这种情况的出现,我们需要在后台开辟工作线程进行数据的处理,再采用消息传递或者其他形式来通知主线程进行UI变化。最常见的情况就是游戏进入前的loading。

图片的异步加载

在多线程和同步的第一篇介绍到使用pthread库的时候,讲到由于CCAutoreleasePool不是线程安全的,所以不能在工作线程中引入cocos2d-x相关的API(其实并不是所有的API都不能使用)。但是cocos2d-x显然考虑到这个问题了,所以它本身就帮我们封装好了一个API,避免了还要手动引入pthread库的尴尬。

1
void CCTextureCache::addImageAsync(const char *path, CCObject *target, SEL_CallFuncO selector)

【玩转cocos2d-x之二十二】多线程和同步02-售票

pthread有很多不同应用,官网都有相应的API解释和Sample,这里不再重复,本文主要介绍一个cocos2d-x多线程和同步示例。

售票

孙鑫老师的C++和Java多线程售票一直让我念念不忘,好吧,这里用cocos2d-x和pthread实现一个吧。总共有100张火车票,有2个售票点A和B再售票,当票卖完了就结束了。我们知道当程序一开始进程就会创建一个主线程,所以可以在主线程基础上再创建2个线程A和B,再线程A和B中分别售票,当票数为0的时候,结束线程A和B。

【玩转cocos2d-x之十九】从CCObject看cocos2d-x的拷贝机制

CCObject在之前的文章中出现了N次,它扮演了一个老祖宗的角色,但是它到底是做什么的?先从它看看cocos2d-x的拷贝机制吧。

CCCopying

CCObject从CCCopying继承而来,而CCCopying拥有唯一的一个成员虚函数copyWithZone,这个函数可以认为是拷贝的一个协议,所有继承了CCObject并且需要实现拷贝功能的子类都可以通过它来实现,它的源码很简单,就是一个未实现的断言。CCZone是神马?只是封装了一个CCObject对象指针而已。

【玩转cocos2d-x之十八】仿《中国好学霸》文字拖拽和定位

现在各种猜成语猜歌名好学霸之类的游戏火的一塌糊涂。本节就介绍下文字的拖拽和定位。

基本原理

其实这只是精灵的简单拖拽和坐标的识别而已。当触摸点在精灵的范围内,精灵可以感应拖动,当触摸结束进行位置判断,如果在有效范围内就进行自动定位。

,