zoukankan      html  css  js  c++  java
  • [置顶] 【cocos2d-x入门实战】微信飞机大战之二:别急,先处理好CCScene和CCLayer的关系

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11713197

    在整个游戏开始之前,我们先看一下HelloWorld示例中CCScene和CCLayer之间的关系是怎么处理的。

    //HelloWorldScene.h
    #ifndef __HELLOWORLD_SCENE_H__
    #define __HELLOWORLD_SCENE_H__
    
    #include "cocos2d.h"
    
    class HelloWorld : public cocos2d::CCLayer
    {
    public:
        virtual bool init();  
    
        static cocos2d::CCScene* scene();//通过此函数获取场景指针
    
        LAYER_CREATE_FUNC(HelloWorld);
    };
    
    #endif // __HELLOWORLD_SCENE_H__
    //HelloWorldScene.cpp
    #include "HelloWorldScene.h"
    
    USING_NS_CC;
    
    CCScene* HelloWorld::scene()
    {
        CCScene *scene = CCScene::create();//创建并返回场景指针
        
        HelloWorld *layer = HelloWorld::create();
    
        scene->addChild(layer);
    
        return scene;
    }
    
    bool HelloWorld::init()
    {
        if ( !CCLayer::init() )
        {
            return false;
        }
        return true;
    }

    cocos2d-x的示例中采用的是创建一个继承于CCLayer的HelloWorldScene,然后通过HelloWorldScene这个Layer中提供一个产生CCScene的指针的静态函数,获取场景的指针,载入场景。

    但是我们这里并不打算这么做,通过一个CCLayer的子类来获取CCScene的指针,这样用起来很奇怪,所以,我把CCScene和CCLayer严格的分开来使用。

    1.创建GameScene类继承于CCScene。

    2.创建GameLayer类继承于CCLayer。

    3.为GameScene添加成员变量 GameLayer* _gameLayer。

    4.在GameScene的init里把_gameLayer add到场景中。

    这样就能把GameScene和GameLayer结合起来,同时又分工独立。在后面的其他场景也是这样进行处理的。GameScene的结构如下。

    //GameScene.h
    #pragma once
    
    #include "cocos2d.h"
    #include "GameLayer.h"
    
    USING_NS_CC;
    
    class GameScene :
    	public CCScene
    {
    public:
    	
    	GameScene(void);
    
    	~GameScene(void);
    
    	SCENE_CREATE_FUNC(GameScene);
    
    	virtual bool init();
    
    	GameLayer* _gameLayer;//把GameLayer暴露给GameScene
    
    };
    //GameScene.cpp
    #include "GameScene.h"
    
    GameScene::GameScene(void)
    {
    	_gameLayer=NULL;
    }
    
    GameScene::~GameScene(void)
    {
    }
    
    bool GameScene::init()
    {
    	bool bRet=false;
    	do 
    	{
    		CC_BREAK_IF(!CCScene::init());
    		_gameLayer=GameLayer::create();//在这里获取GameLayer实例
    		CC_BREAK_IF(!_gameLayer);
    		this->addChild(_gameLayer);//add _gameLayer到场景中
    		bRet=true;
    	} while (0);
    
    	return bRet;
    }

    而GameLayer就不再产生场景指针了。导演类直接从GameScene中获取场景指针。GameLayer其余部分的结构和HelloWorldScene就一致了。

    //AppDelegate.cpp
    CCScene *pScene = GameScene::create();
    pDirector->runWithScene(pScene);


  • 相关阅读:
    使用 Spring 2.5 注释驱动的 IoC 功能
    分页、排序SQL 通用存储过程(转)
    MySQL中group_concat函数
    文本内容分页
    jQuery Pagination Ajax分页插件中文详解(转)
    Cesium组件:Cesiumdraw,基于Vue开发的Cesium基础标绘插件
    tileset格式详解Part2
    css实现div的隐藏
    eltable不透明度&边框
    1rem,1em,1vh,1px含义
  • 原文地址:https://www.cnblogs.com/pangblog/p/3325004.html
Copyright © 2011-2022 走看看