zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    .NET中对资源文件的使用简介
    jQuery框架学习
    asp.net 性能优化(转)
    走向ASP.NET架构设计(转)
    memcached全面剖析–5. memcached的应用和兼容程序
    ASP.NET MVC
    memcached全面剖析–3.memcached的删除机制和发展方向
    memcached完全剖析–1. memcached的基础
    memcached全面剖析–4. memcached的分布式算法
    memcached全面剖析–2.理解memcached的内存存储
  • 原文地址:https://www.cnblogs.com/updateofsimon/p/3551759.html
Copyright © 2011-2022 走看看