这一篇该为我们的飞机大战加上游戏主场景了,所以新建一个类命名为MainGame,代表游戏的主场景,在游戏的主场景中我们首先需要添加一个滚动地图,滚动地图在很多游戏中都会看到,让地图不断的滚动,让人看起来就像角色在行走一样。好了,我们建立一个类Background,来实现地图滚动的效果,然后将这个背景层添加到游戏的主场景中。

#ifndef _BACKGROUND_H_
#define _BACKGROUND_H_
#include "cocos2d.h"

USING_NS_CC;

//地图层
class Background : public Layer
{
public:
	Background(void);
	~Background(void);
public:
	bool init();
	CREATE_FUNC(Background);
public:
	//滚动底涂层
	void move(float tm);
	void onEnterTransitionDidFinish();
private:
	//俩张背景图片
	Sprite * m_background_1;
	Sprite * m_background_2;
	//设备大小
	Size m_size;
	//背景图片移动的大小
	enum{OFFSET = 3};
};

#endif
#include "Background.h"

Background::Background(void)
{
}

Background::~Background(void)
{
}

bool Background::init()
{
	if(!Layer::init())
		return false;

	m_size = Director::getInstance()->getWinSize();
	//添加俩张背景图片
	m_background_1 = Sprite::createWithSpriteFrameName("background.png");
	m_background_1->setAnchorPoint(CCPoint::ZERO);
	m_background_1->setPosition(Point::ZERO);
	//设置精灵贴图无锯齿,用来解决移动过程中的黑边(叫白边也行)问题
	m_background_1->getTexture()->setAliasTexParameters();
	this->addChild(m_background_1);

	m_background_2 = Sprite::createWithSpriteFrameName("background.png");
	m_background_2->setAnchorPoint(Point::ZERO);
	//设置坐标的时候减个数值来使得最后不出现黑线
	m_background_2->setPosition(Point(0,
		m_background_1->getContentSize().height-2));
	m_background_2->getTexture()->setAliasTexParameters();
	this->addChild(m_background_2);

	return true;
}

//函数初始化完毕调用的函数,实现的效果就是切换场景的动画播放完毕才移动地图
void Background::onEnterTransitionDidFinish()
{
	Layer::onEnterTransitionDidFinish();
	//改变图片的坐标,产生移动的效果
	this->schedule(SEL_SCHEDULE(&Background::move),0.01f);
}

//地图移动
void Background::move(float tm)
{
	float y1 = m_background_1->getPositionY()-OFFSET;
	float y2 = m_background_2->getPositionY()-OFFSET;
	//改变坐标位置
	m_background_1->setPositionY(y1);
	m_background_2->setPositionY(y2);
	//判断是否超出了屏幕的边界
	if(y1 < -m_background_1->getContentSize().height)
	{
		m_background_1->setPositionY(m_background_2->getPositionY()+m_background_2->getContentSize().height-2);
	}
	else if(y2 < -m_background_2->getContentSize().height)
	{
		m_background_2->setPositionY(m_background_1->getPositionY()+m_background_1->getContentSize().height-2);
	}
}

以上是实现滚动地图的代码,在实现的过程中主要遇到俩个问题,一个是俩张背景图片叠加的时候出现的白边和黑边问题,黑边就是俩张背景图片之间有了缝隙,所以我设置另一张背景图片的坐标的时候将它的高度减小了俩个像素,这样就没有了缝隙,白边是因为俩张背景图片叠加在了一起,移动的过程中在叠加的地方有一条白线,解决方法是调用以下的代码m_background_1->getTexture()->setAliasTexParameters();将精灵图片设置为无锯齿,这样就有了好的效果了。另一个问题是场景还没有切换完毕地图就开始滚动了,为了让场景切换完毕再滚动地图,将schedule函数的调用放在了onEnterTransitionDidFinish函数中,关于这些函数的调用顺序我前边的博客有写到,不明白的可以看看。然后就是建立一个开始游戏场景了,将地图层加载进去,然后实现对android返回键的响应。

#ifndef _MAIN_GAME_H_
#define _MAIN_GAME_H_
#include "cocos2d.h"
//包含地图层
#include "Layer/Background.h"
//开始游戏场景
#include "StartGame.h"

USING_NS_CC;
//游戏主场景
class MainGame : public Layer
{
public:
	MainGame(void);
	~MainGame(void);
public:
	static Scene * createScene();
	bool init();
	CREATE_FUNC(MainGame);
public:
	//对返回键的监听函数
	void onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent);
private:
	EventListenerKeyboard * m_listener;
};

#endif
#include "MainGame.h"

MainGame::MainGame(void)
{
}

MainGame::~MainGame(void)
{
	//移除事件监听器
	Director::getInstance()->getEventDispatcher()->removeEventListener(m_listener);
}

Scene * MainGame::createScene()
{
	auto scene = Scene::create();
	auto layer = MainGame::create();
	scene->addChild(layer);

	return scene;
}

bool MainGame::init()
{
	if(!Layer::init())
		return false;

	//添加地图层
	auto background = Background::create();
	this->addChild(background);

	//添加android返回键的监听器
	m_listener = EventListenerKeyboard::create();
	m_listener->onKeyReleased = CC_CALLBACK_2(MainGame::onKeyReleased,this);
	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(m_listener,this);

	return true;
}

void MainGame::onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent)
{
	//切换到开始游戏场景
	Director::getInstance()->replaceScene(StartGame::createScene());
}

使用3.0实现飞机大战——滚动地图

最后就是移植到android上看效果了,上次关于这个问题没有说清楚,这里说下。在使用cocos run命令之前,我们需要进入到android工程中,在jni目录下有个Android.mk文件,我们需要配置一下我们要打包的类名,如图所示。

使用3.0实现飞机大战——滚动地图 使用3.0实现飞机大战——滚动地图

这样的话,用手机连接上电脑,run命令运行完毕就会看到手机上运行的程序了,关于移植的问题有不明白的可以留言讨论,如果是做过2.x的移植,这个移植就不会难了。