1. GL坐标系
Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系。GL坐标系x轴朝右,y轴朝上。默认原点在左下角。
2. 屏幕坐标系
苹果的Quarze2D使用的是不同的坐标系统,屏幕坐标系原点在屏幕左上角,x轴向右,y轴向下。ios的屏幕触摸事件CCTouch传入的位置信息使用的是该坐标系。因此在cocos2d中对触摸事件做出响应前需要首先把触摸点转化到GL坐标系。
1. GL坐标=====>屏幕坐标
CGPoint touchScreen=[[CCDirector sharedDirector] convertToUI: touchScreen];//转换为屏幕坐标
2. 屏幕坐标=====>GL坐标
CGPoint touchGl=[[CCDirector sharedDirector] convertToGL: touchScreen];//转换为GL坐标
二、帧回掉与触屏响应
cocos2d中的schedule有两种作用
1)定时执行方法,例如每隔3秒钟执行一次方法
[self schedule:@selector(func) interval:3];
- (void) func{}
2)延时执行方法,例如5秒种后执行方法
[self schedule:@selector(func) interval:5];
- (void) func{
[self unschedule:@selector(func)];
}
CCStandardTouchDelegate 默认事件 | |
---|---|
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); | 处理按下事件 |
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); | 处理按下并移动事件 |
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); | 处理松开事件 |
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent); | 处理打断事件 |
CCTargetedTouchDelegate | |
---|---|
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); | 处理用户按下事件,true表示继续处理, 否则false. |
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); | 处理按下并移动事件 |
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); | 处理松开事件 |
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); | 处理打断事件 |
两者的区别: CCSet
与 CCTouch
,一个事件集合一个单个事件。
事件分发的顺序: CCTargetedTouchDelegate
→ CCStandardTouchDelegate
。
默认情况下所有 CCLayer
都没有启用触摸事件,需要 this->setIsTouchEnabled(true);
启用。
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //获得触屏信息 NSSet *allTouches = [event allTouches]; UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0]; switch ([allTouches count]) { case 1: //单点事件判断 switch ([touch1 tapCount]) { case 1: NSLog(@"单击操作"); break; case 2: NSLog(@"双击操作"); break; } break; case 2: { UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1]; } break; } }
三、精灵与CCAction
1、从图片文件创建:
- CCSprite *sprite = [CCSprite spriteWithFile:@"Icon.png"];
2、从帧缓存创建:
- [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"MineSweeping.plist"];
- CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"Icon.png"];
3、初始化及自定义大小
- CCSprite *sprite = [CCSprite spriteWithFile:@"Icon.png" rect:CGRectMake(x,y,w,h)];
备注:默认锚点ccp(0.5,0.5),默认位置 ccp(0,0),contentSize为精灵图片尺寸
二、精灵常用属性及方法:
- [self addChild:sprite]; //添加入层中,self为CCLayer
- sprite.scale=2;//放大2倍,参数为比例,1保持不变,0.5代表50%,2代表200%
- sprite.rotation=90;//旋转90度
- sprite.opacity=255;//设置透明度为完全不透明(范围0~255)
- sprite.anchorPoint=ccp(0,0);//设置锚点为左下角,默认为ccp(0.5,0.5)中心点
- sprite.position=ccp(100,100);//设置精灵左下角坐标是x=100,y=100,本地GL坐标系
- [sprite setFlipX:YES];//X轴镜像反转
- [sprite setFlipY:YES];//Y轴镜像反转
- [sprite setVisible:NO];//设置隐藏,默认为可见
- [sprite setColor:ccc3(255, 0, 0)];//设置颜色为红色,三原色
- [sprite zOrder]; //精灵层叠次序即Z轴(小的在下面,大的在上面),注意这是只读属性,不能通过sprite.zOrder=2实现Z轴重设
- [sprite setTextureRect:CGRectMake(10, 10, 30, 30)];//起始点坐标(做上角坐标系),宽高
三、添加其他精灵
CCSprite继承自CCNode,所以你可以对它进行addChild的操作:
- CCSprite *s1 = [CCSprite spriteWithFile:@"Icon.png"];
- CCSprite *s2 = [CCSprite spriteWithFile:@"Icon.png"];
- [s1 addChild:s2];
四、精灵Z轴重设
- [self reorderChild:sprite z:10];//self为CCLayer
五、精灵换图
1、直接利用新建贴图进行更换
- //更换贴图
- CCTexture2D * texture =[[CCTextureCache sharedTextureCache] addImage: @"Default.png"];//新建贴图
- [sprite setTexture:texture];
2、利用帧替换
- //加载帧缓存
- [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"MineSweeping.plist"];
- //从帧缓存中取出Default.png
- CCSpriteFrame* frame2 = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"Default.png"];
- [sprite setDisplayFrame:frame2];
Cocos2d-x提供了很多基本的动作类,主要包括两大类:一类是瞬时动作(CCActionInstant),一类是延时动作(CCActionInterval),今天主要记录一下延时动作类的一般用法。
ActionTo是指动作结束的状态,也就是动作的终点。
ActionBy是指动作执行的状态,也就是动作的执行过程。
常用的延时动作类包括:
移动动作:CCMoveBy CCMoveTo
旋转动作:CCRotateBy CCRotateTo
缩放动作:CCScaleBy CCScaleTo
跳跃动作:CCJumpBy CCJumpTo
淡入淡出动作:CCFadeBy CCFadeIn CCFadeOut
结合CCSequence动作序列设计精灵动作
CCActionInterval *actionTo = CCMoveTo::actionWithDuration(2.0f, CCPointMake(winSize.width * 3 / 4, winSize.height / 2)); CCActionInterval *actionBy = CCMoveBy::actionWithDuration(2.0f, CCPointMake(-winSize.width / 2, 0)); CCActionInterval *actionByCopy = (CCActionInterval *) actionBy->copy(); CCActionInterval *actionBack = actionBy->reverse(); Sprite->runAction(CCSequence::actions(actionTo, actionByCopy, NULL));
含动作回掉的Action
要根据你的需求来定义回调函数。
如果只是简单的通知,则使用CCCallFunc;如果需要知道发送者信息,则使用CCCallFuncN;如果还要附带一些数据信息,则使用CCCallFuncND
CCFiniteTimeAction *actionND = CCSequence::actions(CCMoveBy::actionWithDuration(2.0f, CCPointMake(winSize.width / 2, 0)), CCCallFuncND::actionWithTarget(this, callfuncND_selector(HelloWorld::actionCallbackND), (void *) "Callback Data"), NULL); Sprite->runAction(actionND);
四、粒子系统
使用Cocos2d-x提供的CCParticleSystem来实现,使用这种方法,可以实现我们想要的任意效果。
CCParticleSystemQuad *m_emitter=new CCParticleSystemQuad(); m_emitter->initWithTotalParticles(900);//900个粒子对象 //设置图片 m_emitter->setTexture(CCTextureCache::sharedTextureCache()->addImage("snow.png")); //设置发射粒子的持续时间-1表示一直发射,0没有意义,其他值表示持续时间 m_emitter->setDuration(-1); //设置中心方向,这个店是相对发射点,x正方向为右,y正方向为上 m_emitter->setGravity(CCPoint(0,-240)); //设置角度,角度的变化率 m_emitter->setAngle(90); m_emitter->setAngleVar(360); //设置径向加速度,径向加速度的变化率 m_emitter->setRadialAccel(50); m_emitter->setRadialAccelVar(0); //设置粒子的切向加速度,切向加速度的变化率 m_emitter->setTangentialAccel(30); m_emitter->setTangentialAccelVar(0); //设置粒子的位置,位置的变化率 m_emitter->setPosition(CCPoint(400,500)); m_emitter->setPosVar(CCPoint(400,0)); //设置粒子声明,生命的变化率 m_emitter->setLife(4); m_emitter->setLifeVar(2); //设置粒子开始的自旋转速度,开始自旋转速度的变化率 m_emitter->setStartSpin(30); m_emitter->setStartSpinVar(60); //设置结束的时候的自旋转以及自旋转的变化率 m_emitter->setEndSpin(60); m_emitter->setEndSpinVar(60); ccColor4F cc; cc.a=1.0f; cc.b=255.0f; cc.g=255.0f; cc.r=255.0f; ccColor4F cc2; cc2.a=0; cc2.b=0; cc2.g=0; cc2.r=0; //设置开始的时候的颜色以及颜色的变化率 m_emitter->setStartColor(cc); m_emitter->setStartColorVar(cc2); //设置结束的时候的颜色以及颜色的变化率 m_emitter->setEndColor(cc); m_emitter->setEndColorVar(cc2); //设置开始时候粒子的大小,以及大小的变化率 m_emitter->setStartSize(30); m_emitter->setStartSizeVar(0); //设置粒子结束的时候的大小,以及大小的变化率 m_emitter->setEndSize(20.0f); m_emitter->setEndSizeVar(0); //设置每秒钟产生粒子的数目 m_emitter->setEmissionRate(100); addChild(m_emitter);
Cocos2d-x为我们定义的一些已经做好的粒子效果,我们只需要指定图片就行了,具体有哪些,现在就写下面的这几个吧。
-
CCParticleFire
-
CCParticleFireworks
-
CCParticleSun
-
CCParticleGalaxy
-
CCParticleFlower
-
CCParticleMeteor
-
CCParticleSpiral
-
CCParticleExplosion
-
CCParticleSmoke
CCParticleSnow *snow=CCParticleSnow::create(); snow->setPosition(ccp(400,670)); snow->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage("snow.png"),CCRectMake(0,0,32,32)); addChild(snow);
More : http://cn.cocos2d-x.org/tutorial/