之前已经建立好了一个场景,在建立场景的时候,已经将一个CCLayer加到场景的子节点上,这个节点将作为这个场景的父节点,场景中所有的内容都将以它的孩子身份出现。在移动设备上,最常处理的就是触摸消息的响应了。 单点触控:Targeted Touch Delegate方式 一个层接收触摸消息需要如下步骤: 1,在初始化阶段将此层的属性设置为接收触摸消息。例如在init()函数中添加: m_bIsTouchEnabled = true; 或 setIsTouchEnabled(true); 2,重载函数virtual void registerWithTouchDispatcher(void); 因为默认的方式为Standard Touch Delegate,因此需要重新注册,在函数中添加以下语句 CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, INT_MIN+1, true); 其中第二个参数为优先级,优先级数值越低,越先响应(未测试) 3,重载触摸响应函数 接收触摸消息需要重载以下函数 virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);// 必须实现virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); 这里需要注意的事第一个函数是必须实现的,否则点击会抛出异常 多点触控:Standard Touch Delegate方式(CCLayer默认采纳这种方式) 支持这种方式同样需要三个步骤: 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); 其中 pTouches为一个CCTouch的集合,可以通过以下方法来获取单一触点 if(!pTouches||!pTouches->count()){ return;}cocos2d::CCTouch* pTouch = (cocos2d::CCTouch*)(*(pTouches->anyObject())); 获取全部触点需要遍历这个集合 for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++){ CCTouch *pCurTouch = (cocos2d::CCTouch*)(*iterTouch); // do something} 4,从StandardDelegate移除: 如果第二步将自定义的CCSprite加入到StandardDelegate,那么在此CCSprite被清除时,移除此CCSprite。在onExit函数中调用 cocos2d::CCTouchDispatcher::sharedDispatcher()->removeDelegate(this); 获取触点位置 从CCTouch中可以获取到触点的位置主要有以下几种方式 1:获取UIView坐标 CCPoint ptTouch = pTouch->locationInView(pTouch->view()); 这里获取的是设备的UIView坐标,原点在左上角,X向右侧递增,Y向下递增。 2:获取节点坐标 CCPoint ptNode = convertTouchToNodeSpace(pTouch); 节点坐标的计算同GL坐标,它以所在节点的左下角为原点,X向右递增,Y向上递增 3,获取锚点坐标 一个节点,所有的变换都是基于锚点,比如平移,旋转,缩放等。可以通过函数setAnchorPoint(CCPoint var);来改变锚点。cocos2d-x里节点默认的锚点是中心点,即等同于setArchorPoint(ccp(0.5, 0.5));其中(0,0)代表左下角,(1,1)代表右上角。 CCPoint ptNodeAR = convertTouchToNodeSpaceAR(pTouch); 这时,坐标系的原点在该节点的锚点位置。X向右递增,向左递减;Y向上递增,向下递减 |
objective-c多参数解析和@class声明的作用
Objective-C 多参数成员函数
多个参数的写法
(方法的数据类型)函数名:(参数1数据类型)参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ;
举个例子,一个方法的定义:
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;
实现这个函数的时候:
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName
{
大儿子 = myOldestKidName; 二儿子 = mySecondOldestKidName; 三儿子 = myThirdOldestKidName;
}
调用的时候:
Kids *myKids = [[Kids alloc] init];
[myKids setKids: @”张大力” secondKid: @”张二力” thirdKid: @”张小力”];
按个人的理解就是 Objective-C中参数表是这样的, 实参名:(数据类型)形参名。第一个参数的实参名就是函数名。
@class声明的作用
如果在a.h里import了b.h,那么所有import了a.h的文件都会同时与b.h产生编译依赖,一旦b.h被修改,所有应用了a.h 的文件也要被重新编译。如果可以使用前置声明而不是import b.h,而是用@class,就可以解除这种依赖关系,b.h被修改,只import了a.h的文件就未必需要重新编译。