Cocos2d-iOS入門知識詳解

1、Cocos2D座標
基本的兩個座標系:屏幕座標系和GL座標系。 在調用任何須要設置位置的函數,或從函數獲取位置信息前,必需要明確這個函數使用哪一個座標系。好比調用CCNode類的setPosition函數,它使用的就是GL座標系。好比在處理觸摸事件時CCTouch對象中的座標就是屏幕座標系。

1. GL座標系ios

  Cocos2D以OpenglES爲圖形庫,因此它使用OpenglES座標系。GL座標系x軸朝右,y軸朝上。默認原點在左下角。 緩存

2. 屏幕座標系函數

  蘋果的Quarze2D使用的是不一樣的座標系統,屏幕座標系原點在屏幕左上角,x軸向右,y軸向下。ios的屏幕觸摸事件CCTouch傳入的位置信息使用的是該座標系。所以在cocos2d中對觸摸事件作出響應前須要首先把觸摸點轉化到GL座標系。this

 

1. GL座標=====>屏幕座標spa

CGPoint touchScreen=[[CCDirector sharedDirector] convertToUI: touchScreen];//轉換爲屏幕座標設計

2. 屏幕座標=====>GL座標code

CGPoint touchGl=[[CCDirector sharedDirector] convertToGL: touchScreen];//轉換爲GL座標對象

 

2、幀回掉與觸屏響應blog

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;
    }
}

 

 

3、精靈與CCAction

一、從圖片文件建立:

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

二、從幀緩存建立:

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

三、初始化及自定義大小

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

備註:默認錨點ccp(0.5,0.5),默認位置 ccp(0,0),contentSize爲精靈圖片尺寸

2、精靈經常使用屬性及方法:

  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)];//起始點座標(作上角座標系),寬高    

3、添加其餘精靈

CCSprite繼承自CCNode,因此你能夠對它進行addChild的操做:

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

4、精靈Z軸重設

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

5、精靈換圖

一、直接利用新建貼圖進行更換

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

二、利用幀替換

  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);

 

4、粒子系統

使用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/

相關文章
相關標籤/搜索