上次给大家介绍了GameMenu类和GameManager类,这次是个大家介绍GameScene类
游戏下载链接:http://download.csdn.net/detail/a402813378/6275427
GameScene类是生成游戏窗口的类。游戏窗口占据了这个Demo中大部分的代码,下面我们来逐一介绍它。
首先来看看类的头文件。这个类的头文件和前面讲的类的头文件基本一致,GameScene类继承了CCLayer,只有一个初始化的方法和一个返回CCScene对象的方法,看起来非常简单。充分表现了面向对象的设计方法的简洁性.下面我们来看看头文件的代码。
如下:
#ifndef _GAME_SCENE_H
#define _GAME_SCENE_H
#include"cocos2d.h"
class GameScene: public cocos2d::CCLayer
{
public:
bool init();
static cocos2d::CCScene *Scene();
CREATE_FUNC(GameScene);
};
#endif
CREATE_FUNC(GameScene)是一个回调函数,上一篇博文已经讲过,这个还是比较好懂的。
下面我们来看看这个类的cpp文件代码如下,我会很努力的为大家进行解释,大家也不用担心很难。在这个游戏窗口类里,它把游戏的背景和游戏的精灵进行分开初始化了,我觉得这个还是降低了程序的复杂性。
#include"GameScene.h"
#include"GameSceneBgLayer.h" //游戏窗口的背景初始哈类
#include"GameScenePlayerLayer.h"//游戏窗口的精灵初始化类,里面有玩家,炸弹,按钮,方向盘,子弹等
#include"GlobalParam.h" //这个类里包含了所有要用的文件的文件名。
#include"cocos2d.h"
using namespace cocos2d;
CCScene * GameScene::Scene()
{
CCScene *scene =NULL ;
do
{
scene = CCScene::create();
CC_BREAK_IF(!scene);
GameScene* layer = GameScene::create();
//自动运行init()函数进行初始化,我理解这里应该是继承CCLayer的作用,上一篇有讲到。
CC_BREAK_IF(! layer);
scene->addChild(layer);
}while(0);
CCLOG("%s", "create GameScene");
return scene;
}
bool GameScene::init()
{
bool bRet = false;
do
{
CCLOG("GameScene::init");
/* 初始化背景 */
GameSceneBgLayer* sceneBgLayer =GameSceneBgLayer::create();//返回一个CCScene对象
CC_BREAK_IF(! sceneBgLayer);
this->addChild(sceneBgLayer);
/* 初始化所有的精灵*/
GameScenePlayerLayer *scenePlayerLayer =GameScenePlayerLayer::create();
CC_BREAK_IF(! scenePlayerLayer);
this->addChild(scenePlayerLayer);
bRet = true;
}while(0);
return bRet;
}
GameScene中主要是进行了背景类和精灵类的初始化并把他们生成的布景加到窗口中去。
下面继续讲解GameSceneBgLayer类,这个类主要是负责游戏画面背景的初始化。
GameSceneBgPlayer中主要是一个初始化函数和一个Update更新坐标的函数,其中初始化函数是初始化两个背景精灵,Update是改变背景的中心点的坐标以达到动态背景的真实的效果,学过DX的同学在这个地方应该很好理解,这个和D3D里实现的动态天空盒子是一个原理。
下面晒出这个GameSceneBgLayer类的头文件,我已经注释了。
GameSceneBgLayer.h
#ifndef __GAME_SCENE_BG_LAYER_H__
#define __GAME_SCENE_BG_LAYER_H__
#include "cocos2d.h"
class GameSceneBgLayer : public cocos2d::CCLayer
{
public:
bool init(); //初始化背景1和背景2
CREATE_FUNC(GameSceneBgLayer);
virtual void update(float dt); //改变背景一和背景2的坐标以达到动态的效果
private:
cocos2d::CCSprite * bgSprite1; /*背景1精灵对象*/
cocos2d::CCSprite * bgSprite2; /*背景2精灵对象*/
int movespeed ; //坐标变换的速度 */
int bgX1 ; //背景1中心点的X坐标 ;
int bgY1 ; //背景1中心点的Y坐标;
int bgX2 ; //背景2中心点的的X坐标 ;
int bgY2 ; //背景2中心点的Y坐标 ;
};
#endif
大家基本上看懂了上面的声明的话下面我们来看这个类的cpp文件,我也进行了注释,大家应该比较好理解。
GameSceneBgPlayer.cpp
#include"GameSceneBgLayer.h"
#include"GlobalParam.h" //这个头文件保留了所有要用的文件的名字
#include"XSystem.h" //这个头文件的功能是将屏幕坐标转换成图片的真实坐标
using namespace cocos2d; //这个是用cocos2d为我们创建的环境
bool GameSceneBgLayer::init()
{
bgSprite1; /*背景1*/ //这两个变量的声明是在头文件里,在cocos2d-x里有很多这样的声明方式
bgSprite2; /*背景2*/ //为什么要两张图呢?是为后面的背景图片的滑动做铺垫,做出动态的背景效果
movespeed;
bool bRet =false ;
do
{
movespeed = 3;
/* 和MFC中的UpdateWindow()是一样的功能,就是刷新屏幕重绘而已。
有了这句,每帧屏幕都会进行刷新,然后实现了窗口中物体的运动。
*/
this->scheduleUpdate();
/*背景1的初始化*/
bgSprite1 = CCSprite::createWithSpriteFrameName(IMG_BACKGROUND);
this->addChild(bgSprite1);
/*背景2的初始化*/
bgSprite2 = CCSprite::createWithSpriteFrameName(IMG_BACKGROUND);
bgSprite2->setScaleX(-1); //这个是图片缩放函数,参数-1我在网上没有查到用法,我想的就是把图片从又往左翻转一次
this->addChild(bgSprite2);
CCSize visible =CCDirector::sharedDirector()->getVisibleSize(); //这个是获取屏幕的分辨率的大小
CCPoint orign =CCDirector::sharedDirector()->getVisibleOrigin(); //这个是获取屏幕在背景图片中绘制的起点位置
/*初始化背景1坐标*/
bgX1 =visible.width/2;
bgY1 =visible.height/2;
//其实在这里整个屏幕就已经被背景1填充满了
bgSprite1->setPosition(XSystem::xccp(bgX1,bgY1)); //将屏幕坐标转换成背景图的实际坐标
CCSize sprite1size =bgSprite1->getContentSize();
bgX2 =bgX1 +sprite1size.width; //这个坐标是为了将两个图拼到一起
bgY2 =bgY1;
bgSprite2->setPosition(XSystem::xccp(bgX2,bgY2)); //将屏幕坐标转换成背景图的实际坐标
bRet =true; //前面了所有的完成了才会为true,我认为这个是为了调试的方便而建立的一个变量
}while(0);
return bRet;
}
void GameSceneBgLayer::update(float dt)
{
CCSize visibleSize = CCDirec