• Cocos2d-x 创建自己定义项目模板


    你是否以前为cocos方便高速开发而兴奋,你是否以前为各种工具的便利开发而感动,但如今的你是否为每次创建一个新的项目都是HelloWorldScene而苦恼?


    好吧,事实上我也感觉到了,每次创建一个项目都是那个模板,太麻烦了,由于基本HelloWorldScene不删也是放在那不用的,而且还是要自己创建一些新的scene新的layer,所以,索性一点,今天我们就直接来改动这个模板,这样以后创建项目就方便了。事实上也不是有益要改动的,近期在尝试些新的东西,所以常常性的创建一个新项目,但每次刚開始改动的内容都是一样的,浪费时间和精力。好了,话不多说,開始我们的行动!


    首先分析一下一个游戏的基本模块,假设要做一个游戏,或者简单一点的一个demo,我们基本会有这些场景或者层,

    開始场景

    游戏场景

    SplashLayer或者说是刚进入游戏的logo画面

    游戏结束层,计算分数,展示几个星级这些


    除此之外,再来一个游戏管理的单例类,主要游戏中一些像广告啊,支付啊等等什么的全局一个就ok。


    有了这些类的需求,咱们開始码一下代码了,这里我用的是3.0的版本号,2.x做法差点儿相同,打开引擎包的更文件夹,进入templates文件夹,cpp-template-default这个里面就是cpp项目的模板了,进来打开一看,


    各个平台的解决方式都在这里了,咱们打开win32下的,可是一打开就会出错的,


    由于缺少这些库,如今的版本号创建项目的时候都是会复制引擎库的,不再依赖原来的目录结构,所以你能够带着你的全然项目放到不论什么地方都能够,所以咱们还得加入一下这些库,找到曾经用3.0创建的项目,在里面有个cocos2d的目录,然后里面包含了这些


    把它粘贴过来,再打开我们的模板项目就能够了,接下来就能够创建必要的类而且写代码了。

    这是我建的几个类,



    简单说明一下,Layers目录里存放各种层和场景,Sprites里面放创建的精灵,仅仅是如今里面没有,BaseLayer创建的原因是由于每次创建的层里都会用到获取屏幕的大小,所以我又封了一次,代码例如以下,

    #pragma once
    #include "cocos2d.h"
    
    USING_NS_CC; 
    
    class BaseLayer : public Layer
    {
    public:
    	BaseLayer();
    	~BaseLayer();
    	CREATE_FUNC(BaseLayer);
    	virtual bool init() override;
    
    protected:
    	Size size;
    
    };

    #include "BaseLayer.h"
    
    BaseLayer::BaseLayer()
    {
    }
    
    BaseLayer::~BaseLayer()
    {
    }
    
    bool BaseLayer::init()
    {
    	if (!Layer::init())
    		return false;
    
    	size = Director::getInstance()->getWinSize();
    
    	return true;
    }

    这样在创建的其它layer就继承BaseLayer就ok,举个GameScene的代码,

    #pragma once
    #include "cocos2d.h"
    #include "LayersBaseLayer.h"
    
    USING_NS_CC;
    
    class GameScene : public BaseLayer
    {
    public:
    	GameScene();
    	~GameScene();
    	CREATE_FUNC(GameScene);
    	virtual bool init() override;
    	static Scene* createScene();
    };

    
    
    #include "GameScene.h"
    #include "StartScene.h"
    #include "GameManager.h"
    #include "GameoverLayer.h"
    
    GameScene::GameScene()
    {
    }
    
    
    GameScene::~GameScene()
    {
    }
    
    Scene* GameScene::createScene()
    {
    	auto scene = Scene::create();
    	auto layer = GameScene::create();
    	scene->addChild(layer);
    
    	return scene;
    }
    
    bool GameScene::init()
    {
    	if (!BaseLayer::init())
    		return false;
    
    
    
    	return true;
    }

    一定要在init方法里运行一次BaseLayer的init方法,不然等于没有获取getWinSize方法。


    接着改改AppDelegate这个cpp,默认创建的窗体大小是960*640的,有点大,没有填写适屏策略,程序进入后台音乐不暂停,所以我们改点代码,

    #include "AppDelegate.h"
    #include "SimpleAudioEngine.h"
    #include "LayersGameScene.h"
    #include "LayersStartScene.h"
    
    USING_NS_CC;
    using namespace CocosDenshion;
    
    AppDelegate::AppDelegate() {
    
    }
    
    AppDelegate::~AppDelegate() 
    {
    }
    
    bool AppDelegate::applicationDidFinishLaunching() {
        // initialize director
        auto director = Director::getInstance();
        auto glview = director->getOpenGLView();
        if(!glview) {
    		glview = GLView::createWithRect("My Game", Rect(0, 0, 480, 320));  //创建指定窗体大小
            director->setOpenGLView(glview);
        }
    
    	director->getOpenGLView()->setDesignResolutionSize(1136, 640, ResolutionPolicy::FIXED_HEIGHT);  //适屏策略具体能够度娘
        // turn on display FPS
        director->setDisplayStats(0);
    
        // set FPS. the default value is 1.0/60 if you don't call this
        director->setAnimationInterval(1.0 / 60);
    
        // create a scene. it's an autorelease object
        //auto scene = GameScene::createScene();
    	auto scene = StartScene::createScene();
        // run
        director->runWithScene(scene);
    
        return true;
    }
    
    // This function will be called when the app is inactive. When comes a phone call,it's be invoked too
    void AppDelegate::applicationDidEnterBackground() {
        Director::getInstance()->stopAnimation();
    
        // if you use SimpleAudioEngine, it must be pause
        SimpleAudioEngine::getInstance()->pauseBackgroundMusic();  //暂停音乐,也就是把这行凝视解除
    }
    
    // this function will be called when the app is active again
    void AppDelegate::applicationWillEnterForeground() {
        Director::getInstance()->startAnimation();
    
        // if you use SimpleAudioEngine, it must resume here
        SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
    }
    

    ok,这些就是本人主要改动的地方了,假设有自己的想法也是全然能够改动的,看个人了。

    关掉并保存我们对这个解决方式的改动,在proj.win32文件夹下删掉sdf和suo这两个后缀文件,而且把cpp-template-default下之前复制过来的cocos2d那个文件夹也删了,让我们的解决方式最初长得还是那样,


    这样就完毕了,赶紧创建一个项目来看看,

    这里我创建一个叫TestTemp的项目,解决方式就会像这样了,



    大功告成,赶紧愉快的写代码吧~~~




  • 相关阅读:
    深入浅出Tomcat/2
    深入浅出Tomcat/1- 来历和配置文件
    深入浅出:HTTP/2
    深入浅出:5G和HTTP
    深入浅出:远离法律风险,必须了解开源项目许可证
    深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么
    深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么
    深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么
    一个微信群的现状
    Hbase原理、基本概念、基本架构
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4081714.html
Copyright © 2020-2023  润新知