Cocos2d-iOS入门知识详解

一、Cocos2D坐标
基本的两个坐标系:屏幕坐标系和GL坐标系。 在调用任何需要设置位置的函数,或从函数获取位置信息前,必须要明确这个函数使用哪个坐标系。比如调用CCNode类的setPosition函数,它使用的就是GL坐标系。比如在处理触摸事件时CCTouch对象中的坐标就是屏幕坐标系。

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、从图片文件创建:

  1. CCSprite *sprite = [CCSprite spriteWithFile:@"Icon.png"];   

2、从帧缓存创建:

  1. [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"MineSweeping.plist"];  
  2. CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"Icon.png"];  

3、初始化及自定义大小

  1. CCSprite *sprite = [CCSprite spriteWithFile:@"Icon.png" rect:CGRectMake(x,y,w,h)];  

备注:默认锚点ccp(0.5,0.5),默认位置 ccp(0,0),contentSize为精灵图片尺寸

二、精灵常用属性及方法:

  1. [self addChild:sprite]; //添加入层中,self为CCLayer     
  2. sprite.scale=2;//放大2倍,参数为比例,1保持不变,0.5代表50%,2代表200%     
  3. sprite.rotation=90;//旋转90度      
  4. sprite.opacity=255;//设置透明度为完全不透明(范围0~255)   
  5. sprite.anchorPoint=ccp(0,0);//设置锚点为左下角,默认为ccp(0.5,0.5)中心点   
  6. sprite.position=ccp(100,100);//设置精灵左下角坐标是x=100,y=100,本地GL坐标系     
  7. [sprite setFlipX:YES];//X轴镜像反转      
  8. [sprite setFlipY:YES];//Y轴镜像反转    
  9. [sprite setVisible:NO];//设置隐藏,默认为可见    
  10. [sprite setColor:ccc3(255, 0, 0)];//设置颜色为红色,三原色   
  11. [sprite zOrder]; //精灵层叠次序即Z轴(小的在下面,大的在上面),注意这是只读属性,不能通过sprite.zOrder=2实现Z轴重设     
  12. [sprite setTextureRect:CGRectMake(10, 10, 30, 30)];//起始点坐标(做上角坐标系),宽高    

三、添加其他精灵

CCSprite继承自CCNode,所以你可以对它进行addChild的操作:

  1. CCSprite *s1 = [CCSprite spriteWithFile:@"Icon.png"];  
  2. CCSprite *s2 = [CCSprite spriteWithFile:@"Icon.png"];  
  3. [s1 addChild:s2];  

四、精灵Z轴重设

  1. [self reorderChild:sprite z:10];//self为CCLayer  

五、精灵换图

1、直接利用新建贴图进行更换

  1. //更换贴图      
  2. CCTexture2D * texture =[[CCTextureCache sharedTextureCache] addImage: @"Default.png"];//新建贴图      
  3. [sprite setTexture:texture];   

2、利用帧替换

  1. //加载帧缓存    
  2. [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"MineSweeping.plist"];      
  3. //从帧缓存中取出Default.png   
  4. CCSpriteFrame* frame2 = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"Default.png"];     
  5. [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/

 

posted @ 2014-06-10 13:23  匡时@下一站.info  阅读(696)  评论(0编辑  收藏  举报