多个参数的写法
(方法的数据类型)函数名:(参数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的文件就未必需要重新编译。
cocos2d-x总结(三)场景中的层(CCLayer)及其触摸消息响应
之前已经建立好了一个场景,在建立场景的时候,已经将一个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向上递增,向下递减
NSLog([[UIDevice currentDevice] name]); // Name of the phone as named by user NSLog([[UIDevice currentDevice] uniqueIdentifier]); // A GUID like string NSLog([[UIDevice currentDevice] systemName]); // "iPhone OS" NSLog([[UIDevice currentDevice] systemVersion]); // "2.2.1" NSLog([[UIDevice currentDevice] model]); // "iPhone" on both devices NSLog([[UIDevice currentDevice] localizedModel]); // "iPhone" on both devices float version = [[[UIDevice currentDevice] systemVersion] floatValue];
NSDictionary 和 NSArray一样是不可变的对象。用来实现字典集合,在给定关键字(通常是一个NSString字符串)下存储一个数值(可以是任何类型的对象)。
NSDictionary使用类方法 dictionaryWithObjectAndKeys: 来创建字典;使用方法objectForKey: 来获取字典中的值。
NSDictionary *dict = [NSDictionary dictionaryWithObjectAndKeys:@"just",@"firstname", @"code",@"lastname", @"xcode@apple.com",@"email", nil];
NSString* firstName = [dict objectForKey:@"firstname"];
NSMutableDictionary是可变对象,可以进行添加和删除操作。可以是用dictionaryWithCapacity: (这里的容量也只是个参考值,表示对大小的限制)或 dictionary 来创建可变字典。
//NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:@"John" forKey:@"Firstname"]; [dict setObject:@"Doe" forKey:@"Lastname"]; [dict setObject:@"info@objectgraph.com" forKey:@"Email"]; NSLog(@"%@", dict); NSArray *keys = [dict allKeys]; // values in foreach loop for (NSString *key in keys) { NSLog(@"%@ is %@",key, [dict objectForKey:key]); } [dict removeObjectForKey:@"Email"];
addObject : 在数组末尾添加对象 (id)anObject
removeObjectAtIndex : 删除特定索引处的对象
Objective-C数组相关操作。
// insert code here... NSLog(@"数组"); //指定多个字符串创建数组 NSArray *array; array=[NSArray arrayWithObjects:@"0-asd",@"1-fds",@"2-哈咯",@"3-个人",nil]; //数组的长度 NSLog(@"数组长度%d",array.count); //通过索引取得对象 for(int i=0;i<array.count;i++) { NSString *secondStr=[array objectAtIndex:i]; NSLog(secondStr,nil); } //高速枚举法取得对象,Objective-C2.0开始支持, for(NSString *str in array) { NSLog(str,nil); } //对象的追加于删除 //创建空数组 NSMutableArray *MutArray=[NSMutableArray array]; //追加对象 [MutArray addObject:@"A"]; [MutArray addObjectsFromArray:array]; //插入对象 NSString *thstr=@"插入值"; [MutArray insertObject:thstr atIndex:4]; //替换对象 [MutArray replaceObjectAtIndex:2 withObject:@"替换"]; //删除所有对象 //[Mutarray removeAllObjects]; //删除最后的对象 [MutArray removeLastObject]; //删除索引为Index的对象 [MutArray removeObjectAtIndex:0]; //删除所有于object同值的对象 [MutArray removeObject:@"0-asd"]; //删除数组中所有与object等价的对象 [MutArray removeObjectIdenticalTo:thstr]; //删除数组中所有与数组array包含相同的元素 [MutArray removeObjectsInArray:array]; NSLog(@"%@",MutArray);
NSDictionary 常用方法总结 +(id)dictionaryWithObjectsAndKeys:obj1,key1,obj2,key2,......nil 顺序添加对象和键值来创建一个字典,注意结尾是nil -(id)initWithObjectsAndKeys::obj1,key1,obj2,key2,......nil 初始化一个新分配的字典,顺序添加对象和值,结尾是nil -(unsigned int)count 返回字典中的记录数 -(NSEnumerator*)keyNSEnumerator 返回字典中的所有键到一个 NSEnumerator 对象 -(NSArray*)keysSortedByValueUsingSelector:(SEL)selector 将字典中所有键按照selector 指定的方法进行排序,并将结果返回 -(NSEnumerator*)objectEnumerator 返回字典中所有的值到一个 NSEnumetator 类型对象 -(id)objectForKey:key 返回指定key 值的对象
NSMutableDictionary 常用方法总结 +(id)dictionaryWithCapacity:size 创建一个size大小的可变字典 -(id)initWithCapacity:size 初始化一个size 大小的可变字典 -(void)removeAllObjects 删除字典中所有元素 -(void)removeObjectForKey:key 删除字典中key位置的元素 -(void)setObject:obj forKey:key 添加 (key , obj)到字典中去;若key已经存在,则替换值为 obj
NSArray 不可变数组 常用方法 +(id)arrayWithObjects:obj1,obj2,...nil 创建一个新的数组,obj1,obj2......是他的元素对象,以nil对象结尾 -(BOOL)containsObject:obj 确定数组中是否包含对象obj -(NSUInteger)count 返回数组元素个数 -(NSUInteger)indexOfObject:obj 第一个包含obj元素的索引号 -(id)objectAtIndex;i 返回存储在位置 i 的对象 -(void)makeObjectsPerformSelector:(SEL)selector 将 selector 只是的消息发送给数组中的每个元素 -(NSArray*)sortedArrayUsingSelector:(SEL)selector 根据selector 指示的比较方法对数组进行排序 -(BOOL)writeToFile:path atomically:(BOOL)flag 将数组写入指定的文件中,如果 flag 为 YES,则需要先创建一个临时文件
NSmutableArray 常用方法总结 array 创建一个空数组 +(id)arrayWithCapacity:size 创建一个数组,指定容量为size -(id)initWithCapacity:size 初始化一个新分配的数组,指定容量为size -(void)addObject:obj 将对象obj添加到数组末尾 -(void)insertObject:obj atIndex:i 将对象 obj 插入到索引为 i 的位置 -(void)replaceObject:obj atIndex:i 将数组中索引为 i 处的元素用obj 置换 -(void)removeObject:obj 从数组中删除所有是 obj 的对象 -(void)removeObjectAtIndex:i 从数组中删除索引为 i 的对像 -(void)sortUsingSelector:(SEL)selector 用 selector 只是的比较方法将数组排序