沈大海cocos2d-x教程

时间:2021-07-17 11:46:10

cocos2d-x 图层触摸事件处理onTouch-沈大海cocos2d-x教程8

分类: cocos2d-x2012-11-12 23:00 2143人阅读 评论(2) 收藏 举报

游戏

一个层接收触摸消息需要如下步骤:

1,在初始化阶段(init方法)将此层的属性设置为接收触摸消息 setTouchEnabled(true);//开启屏幕触摸

  2,重载函数virtual void registerWithTouchDispatcher(void);因为默认的方式为Standard Touch Delegate,因此需要重新注册,在函数中添加以下语句 CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,0, true)

 3,重载触摸响应函数接收触摸消息需要重载以下函数

ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);// 按下

ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);  //滑动

ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);  //抬起

这里需要注意的事第一个函数是必须实现的,否则点击会抛出异常

多点触控的实现: 支持这种方式同样需要三个步骤:

1,同Targeted Touch Delegate方式第一步

2,将此节点添加到StandardDelegate(对于CCLayer可以省略此步),以实现一个可以点击的CCSprite为例: 在onEnter函数中添加cocos2d::CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this,0)

3,重载响应函数

virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);

virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);

virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);

virtual void ccTouchesCancelled(cocos2d::CCSet*pTouches,cocos2d::CCEvent *pEvent);

4,从StandardDelegate移除:如果第二步将自定义的CCSprite加入到StandardDelegate,那么在此CCSprite被清除时,移除此CCSprite

onExit函数中调用cocos2d::CCTouchDispatcher::sharedDispatcher()->removeDelegate(this<span

 

 

 

 

 

cocos2d-x中的单例对象-沈大海cocos2d-x教程9

分类: cocos2d-x2012-11-14 08:07 1448人阅读 评论(1) 收藏 举报

cocos2d-xCocos2d-x

cocos2d-x的单例 

单例是在程序生命周期里只被实例化过一次的类。

一般利用类的一个静态方法来生成和访问对象。

通过以“shared”开头的方法来访问cocos2d-x的单例对象的。

以下是一些最常用到的cocos2d-x 单例类和访问它们的方法:

CCActionManager* sharedManager = [CCActionManager sharedManager];
CCDirector* sharedDirector = [CCDirector sharedDirector];
CCSpriteFrameCache* sharedCache = [CCSpriteFrameCache sharedSpriteFrameCache]; 

CCTextureCache* sharedTexCache = [CCTextureCache sharedTextureCache]; 

CCTouchDispatcher* sharedDispatcher = [CCTouchDispatcher sharedDispatcher]; 

CDAudioManager* sharedManager = [CDAudioManager sharedManager]; 

SimpleAudioEngine* sharedEngine = [SimpleAudioEngine sharedEngine];

单例的好处是它可以在任何时间任何地点被任何类所调用。

类似一个全局变量。如果你需要在任何地方都能用到某些数据或者方法,单例是很好的选择。

音频就是个很好的例子:因为任何一个类,不管是玩家,敌人,菜单按钮,或是过场动画,都可能需要播放声效或者改变背景音乐。

 

 

 

 

 

cocos2d-x常用宏 沈大海cocos2d-x教程16

分类: cocos2d-x2012-11-23 19:05 1209人阅读 评论(0) 收藏 举报

目录(?)[+]

与节点属性(property)相关的

CC_PROPERTY_READONLY

CC_PROPERTY_READONLY_PASS_BY_REF

CC_PROPERTY

CC_PROPERTY_PASS_BY_REF

CC_SYNTHESIZE_READONLY

CC_SYNTHESIZE_READONLY_PASS_BY_REF

CC_SYNTHESIZE

CC_SYNTHESIZE_PASS_BY_REF

CC_SYNTHESIZE_RETAIN

具体定义见CCPlatformMacros.h。这些主要是为了模拟objective-C下的@property, readonly, retain, @synthesize等关键字。

与命名空间(namespace)相关

NS_CC_BEGIN

NS_CC_END

USING_NS_CC

具体定义见CCPlatformMacros.h

与节点的创建方法(node, create)相关

CREATE_FUNC

NODE_FUNC

具体定义见CCPlatformMacros.h

与内存管理相关

CC_SAFE_DELETE

CC_SAFE_DELETE_ARRAY

CC_SAFE_FREE

CC_SAFE_RELEASE

CC_SAFE_RELEASE_NULL

CC_SAFE_RETAIN

在代码中使用这些宏,可以减少敲键盘的次数,从而提高编写效率。什么时候用SAFE_DELETE 什么时候用SAFE_RELEASE?????????请关注blog.csdn.net @weibo.com/shunfengche

填空题:

 malloc calloc申请空间的用__释放,c++ new申请空间的用___释放,CCObject子类对象用_____释放。

日志

CCLOG

CCLOGERROR

CCLOGINFO

CCLOGWARN

具体定义见CCPlatformMacros.h

断言

CC_BREAK_IF

CC_ASSERT

CCAssert

其中CC_BREAK_IF是在CCPlatformMacros.h中定义的,它用在循环中的条件判断。

CC_BREAK_IF有一个使用非常频繁的场合,就是在do{}while(0)中。这个使用语句块的作用还是挺大的。根据GOOGLE编程规范,为了减少代码层次,条件判断应该先进行,不满足则跳过后面代码。跳过有两种方式,一种是return,另一种是break。前一种方式下,后面的全部代码都不能得到执行;后一种方式必须放在循环或者swich语句块中。如果使用do{}while(0)则可以解决第一种方式后面的代码得不到执行的问题。

CCAssert定义在ccMacros.h中,它是对CC_ASSERT的封装。与数学相关

CCRANDOM_MINUS1_1

CCRANDOM_0_1

CC_DEGREES_TO_RADIANS

CC_RADIANS_TO_DEGREES

具体定义见ccMacros.h。产生随机数与弧度与角度的转换。

(CCPoint)相关

ccp

具体定义在CCPointExtension.h中。此文件中还定义了很多与点运算相关的API。需要作点运算时,先检查此处是否已经定义过了。

 

 

 

 

 

 

 

cocos2d-x获取当前系统时间-沈大海cocos2d-x教程17

分类: cocos2d-x2012-11-23 19:44 2278人阅读 评论(0) 收藏 举报

1. long millisecondNow()  

2. 

3. struct cc_timeval now; 

4. CCTime::gettimeofdayCocos2d(&now, NULL); 

5. return (now.tv_sec * 1000 + now.tv_usec / 1000); 

6. 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

代码很少,用在何处?

1。游戏倒记时

2。定时任务

3。控制fps

4.  定时炸弹

5。记录玩家游戏时间

 

 

 

 

 

 

 

移植12游戏到2.0

1.所有sprite的创建改为sprite::cretae

2.没有了CCMutableArray 全改为CCArray

3. LAYER_NODE_FUNC 改为CREATE_FUNC

4setisTouchEnabled 改为 setTouchEnabled

5   CCRepeatForever::actionWithAction 以及所有Action 都用create方法创建

6addFrameWithTexture 改为 addSprieFrameWithTexture

7 update(CCTime dt) 改为 update(float dt)

 

 

 

 

 

//! convert from wstring to UTF8 using self-coding-converting
inline void WStrToUTF8(std::string& dest, const wstring& src){

 dest.clear();

 for (size_t i = 0; i < src.size(); i++){

  wchar_t w = src[i];

  if (w <= 0x7f)

   dest.push_back((char)w);

  else if (w <= 0x7ff){

   dest.push_back(0xc0 | ((w >> 6)& 0x1f));

   dest.push_back(0x80| (w & 0x3f));

  }

  else if (w <= 0xffff){

   dest.push_back(0xe0 | ((w >> 12)& 0x0f));

   dest.push_back(0x80| ((w >> 6) & 0x3f));

   dest.push_back(0x80| (w & 0x3f));

  }

  else if (sizeof(wchar_t) > 2 && w <= 0x10ffff){

   dest.push_back(0xf0 | ((w >> 18)& 0x07)); // wchar_t 4-bytes situation

   dest.push_back(0x80| ((w >> 12) & 0x3f));

   dest.push_back(0x80| ((w >> 6) & 0x3f));

   dest.push_back(0x80| (w & 0x3f));

  }

  else

   dest.push_back('?');

 }

}

//! simple warpper
inline std::string WStrToUTF8(const std::wstring& str){

 std::string result;

 WStrToUTF8(result, str);

 return result;

}

 

 

只在win32label显示中文中适用

调用方法

string str = WStrToUTF8(L"你好");

CCLabelTTF* tishilabel = CCLabelTTF::labelWithString(str.c_str(), "Arial", 18);
tishilabel->setAnchorPoint(ccp(0.5,0));
tishilabel->setPosition(ccp(512,250));/  tishilabel->setColor(ccWHITE);
this->addChild(tishilabel,12);