zoukankan      html  css  js  c++  java
  • cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建

    一、场景与层的关系:

    cocos2dx的框架可以说主要由导演,场景,层,精灵来构成:

    1、其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏。

    2、场景就像电影的一幕剧情,所以说,懂得如何划分好游戏的场景,是开始动手做游戏的第一步。

    3、一个场景会有很多层,用来处理场景不同的功能。

    4、而精灵则是最小的单位,比如子弹,飞机,敌机都是一个个的精灵所组成的。

    二、WelcomeScene的搭建:

    1、场景和层的二种搭建方法:

    (1)一种就是跟HelloWorld示例一样的方法,以一个层为主体,然后这个层建立成一个场景,这种方式适合用再一个场景下只有一个层的时候,可以缩短代码的长度。

    (2)另一种就是先建立一个场景,然后再建立层。这是我比较推荐的做法,因为本人是个小白,认为这种方法比较如何我们正常人的思维= =。然后先贴WelcomeScene.h的代码:

    #include "cocos2d.h"
    
    USING_NS_CC;                         //用引擎要的头文件和名字空间
    
    class WelcomeScene :public Scene       
    {
    public:
    
        CREATE_FUNC(WelcomeScene);     //一个宏定义
    
        virtual bool init();                  //继承的init方法
    };

    1、CREATE_FUNC():其实它就是一个宏定义,可以追踪下去看他的代码:

    #define CREATE_FUNC(__TYPE__)
     
    static __TYPE__* create() 
    
    { 
        __TYPE__ *pRet = new __TYPE__(); 
     
       if (pRet && pRet->init()) 
      
      { 
            pRet->autorelease(); 
          
      return pRet; 
        } 
       
     else 
       
     { 
            delete pRet; 
        
        pRet = NULL; 
         
       return NULL; 
       
     } 
    
    }

    其实就是一个创建的方法,首先new一个新的对象,然后检验是否申请到内存,没有的话直接跳过,有的话,执行init()的方法。于是呢init()方法便成为一个场景的主干,就相当于C++语言的main函数的感觉吧。

    2、然后就是init的方法做了什么,我们看看WelcomeScene.cpp:

    #include "WelcomeScene.h"
    #include "WelcomeLayer.h"
    
    USING_NS_CC;
    
    bool WelcomeScene::init()
    {
        if (!Scene::init())
        {
            return false;
        }
        
        auto layer = WelcomeLayer::create();
        if (layer)
        {
            this->addChild(layer);
        }
    
        
        return true;
    }

    其实就是创建一个WelcomeLayer然后通过addChild的方法加到这个场景当中。

    三、WelcomeLayer的搭建

    如果说Scene是个大的一幕剧情,那么layer就代表了这一幕剧情中每一个角色。

    这个WelcomeLayer主要是实现一个资源的加载,由于不能太过无聊所以还得加一个小小的缓冲帧动画。然后:

    1、我们先看如何进行资源的加载和背景的加入。

    //主要通过cocos已经实现的单例将所需要的图片的plist文件加入
     SpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot.plist");
        SpriteFrameCache::getInstance()->addSpriteFramesWithFile("shoot_background.plist");
    
    
    //创建背景
        auto background = Sprite::createWithSpriteFrameName("background.png");
        background->setAnchorPoint(Vec2::ZERO);
        background->setPosition(Vec2::ZERO);
        this->addChild(background);
    
    //创建copyRight
        auto copyRight = Sprite::createWithSpriteFrameName("shoot_copyright.png");
        copyRight->setPosition(Vec2(origin.x + visibleSize.width/2, origin.y + visibleSize.height / 3*2));
        this->addChild(copyRight);

    (1)大家可以想一下,其实一个游戏的本质就是在不停的绘图,那你想想,如果每次再画一个图的时候再把图片加入到内存中,是不是会一卡一卡的 = = 所以呢,我们通过cocos2d封装的方法一次性先加入进去。

    (2)然后大家可能不大清楚什么是plist文件,首先我们加载图片资源的时候,其实是把所有的图片打包成一个图片加入进去的,但我们要记录那个图片在新生成的图片的哪一个位置,所以便需要引入一个plist文件,它就是一张表格,记录了每个图片在新生成图片中的位置。上图。如下~

    hero2hero1     ……                                              shoot

                      小的图片                                                                                         打包后新生成的图片。

    (3)然后就是创建一个背景的精灵,设置锚点和位置,最后加入到这个层中。然后主要是这个锚点的定义,锚点其实就相当于在一个图片上打上一个图钉,以这一个图钉的位置来代表整个图片的位置,然后通过setPosition来设置图片的位置。

    (4)copyRight和背景的创建类似。

    (5)Vec2就是Point,代表一个点的数据类型。

    2、帧动画的创建:

    auto gameLoading = Sprite::createWithSpriteFrameName("game_loading1.png");
        gameLoading->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 7*3));
        this->addChild(gameLoading);
    
    
        auto animation = Animation::create();
        animation->setDelayPerUnit(0.5f);
        animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading1.png"));
        animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading2.png"));
        animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading3.png"));
        animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("game_loading4.png"));
        auto animate = Animate::create(animation);
    
    gameLoading->runAction(animate);
        return true;

    帧动画就是通过记账图片在很短的时间内进行形成的动画,所以可以看到,我们先设置动画的第一帧为一个精灵,然后创建一个帧动画,通过addSpriteFrame的方法加入图片,然后通过setDelayPerUnit的方法设置切换图片的时间,然后让精灵做这个动画,然后的然后就看效果吧,这一节学习笔记就结束了= =,我怎么觉得写完会累死的节奏。

                                                       QQ截图20140806215552

  • 相关阅读:
    软件工程实践2019第四次作业
    软件工程实践2019第三次作业
    C语言第九次博客作业---指针
    基于open cv的人脸检测功能 (大自然的搬运工)
    STM32F103RCT6驱动AD7705(cubeide)
    python-tips
    在树莓派上使用DS18B02,并将数据打印在oled上
    数据库基础1
    转载:Why machine learning algorithms are hard to tune and how to fix it
    论文笔记(7)-"Local Newton: Reducing Communication Bottleneck for Distributed Learning"
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/3895853.html
Copyright © 2011-2022 走看看