从今天开始我将和大家分享下(仿微信飞机) cocos2d-x 2.2版的实现过程 (一)...
在这里首先要感谢JackyStudio 无私的奉献这是他的博客地址http://blog.****.net/jackystudio/article/details/11730601
本游戏中使用的资源来自于jackyStudio。我会尽可能的把源码和效果图,截图列出来,便于大家参考和分享
好了不多说了,下面我们就一起来开始cocos2d-x 2.2版本的微信飞机大战吧;
首先搭建好coco2d-x的工程;删除引擎自带的helloworld.h .ccp 文件。创建一个新的文件取名为GameScene.h
在GameScene.h声明以下内容:具体的功能我逐步解释
#pragma once
#include "e:\cocos2d-x\cocos2d-x-2.2\cocos2d-x-2.2\cocos2dx\layers_scenes_transitions_nodes\ccscene.h"
#include "cocos2d.h"
#include "SimpleAudioEngine.h"//背景音乐和音效播放文件
//创建游戏场景类
class GameScene :public cocos2d::CCScene
{
public:
GameScene(void);
~GameScene(void);
CREATE_FUNC(GameScene); //create宏会直接创建场景对象,并引导程序执行下面的init()
virtual bool init();
GameLayer* _gameLayer; //声明游戏层指针
};
在GameScene.ccp文件中这样定义
#include "GameScene.h"
USING_NS_CC;
using namespace CocosDenshion; //使用音效的标准命名空间
GameScene::GameScene(void)
{
}
GameScene::~GameScene(void)
{
}
bool GameScene::init()
{
if(!CCScene::init()) //重载基类创建的init()
{
return false;
}
//这里是播放背景音乐
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("game_music.mp3");
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("game_music.mp3",true);
return true;
}
修改引擎的AppDelegate.cpp文件
删除helloworld.h ,添加#include "GameScene.h"
并把场景换成
//以上是创建一个空的游戏场景,这时候运行调试我们会看到一个带有背景音乐的黑色窗口
//这并不是我们想要的结果!
//下面我们要创建游戏层GameLayr 类 ,并把游戏层加入到场景中,并且在游戏层中我们要实现背景图的滚动
//好下面来写游戏层类
天加一个类,取名为GameLayer类
在GameLayer.h中声明以下内容
#pragma once
#include "e:\cocos2d-x\cocos2d-x-2.2\cocos2d-x-2.2\cocos2dx\layers_scenes_transitions_nodes\cclayer.h"
#include "cocos2d.h"
class GameLayer :public cocos2d::CCLayer
{
public:
GameLayer(void);
~GameLayer(void);
CREATE_FUNC(GameLayer);
virtual bool init();
//创建精灵批处理节点
cocos2d::CCSpriteBatchNode* _batchNode;
//初始化背景图
void initBackGound();
//声明两个背景图精灵变量,用于背景图的滚动
cocos2d::CCSprite* _backGound_1;
cocos2d::CCSprite* _backGound_2;
//声明背景图的滚动
void backGoundMove(float dt);
//每一帧都执行地图的滚动算法
void update(float dt);
};
在GameLayer.ccp中这样定义(首先我说以下,我把游戏的所有资源都放在了planesource.plist);当然这块多新说理解起来有点难度,
#include "GameLayer.h"
USING_NS_CC;
GameLayer::GameLayer(void)
{
//初始化游戏资源缓存(我们把游戏资源先放到精灵框帧缓存中去)
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("planesource.plist");
//初始化精灵批处理节点;
this->_batchNode =CCSpriteBatchNode::create("planesource.pvr.ccz");
this->addChild(_batchNode);
}
GameLayer::~GameLayer(void)
{
this->_batchNode->release();
this->_batchNode=NULL;
}
bool GameLayer::init()
{
if(!CCLayer::init())
{
return false;
}
//初始化背景图
this->initBackGound();
scheduleUpdate();
return true;
}
//初始化背景图
void GameLayer::initBackGound()
{
this->_backGound_1 = CCSprite::createWithSpriteFrameName("background.png");
this->_backGound_1->setAnchorPoint(ccp(0,0));
this->_backGound_1->setPosition(ccp(0,0));
this->_batchNode->addChild(_backGound_1);
this->_backGound_2 = CCSprite::createWithSpriteFrameName("background.png");
this->_backGound_2->setAnchorPoint(ccp(0,0));
this->_backGound_2->setPosition(ccp(0,this->_backGound_1->getPositionY()+ this->_backGound_1->getContentSize().height-2));
this->_batchNode->addChild(_backGound_2);
this->schedule(schedule_selector(GameLayer::backGoundMove),0.01f);
}
//声明背景图滚动
void GameLayer::backGoundMove(float dt)
{
//让背景图的高度随时间递减2;来更新背景图的位置
this->_backGound_1->setPositionY(this->_backGound_1->getPositionY()-2);
this->_backGound_2->setPositionY(this->_backGound_1->getPositionY() + this->_backGound_1->getContentSize().height -2);
if(this->_backGound_2->getPositionY()==0)
{
this->_backGound_1->setPositionY(0);
}
}
//以上可以玩我们的需求,我们此时可以看到一个滚得背景图
好吧,我先来解释下,我们是怎样子实现背景图的滚动;
为什么我们要使用两张图片来实现背景的滚动?
是这样的:滚动呢实际上是改变背景图片Y坐标,它的原理是:让背景图的Y坐标每秒钟向游戏窗口的下方移动一小段距离,这样,背景就会一点一点的往下掉。当第二张背景图片的Y坐标为0时,我们再把第一张背景的Y坐标放在0坐标处,总之就是实现两张图片不断切换,其实也不难;
下次我将为大家分享怎么在游戏中加入一个可以有方向盘来控制飞机
想让大家看下效果图吧
就是这样子。好吧今天就写到这里了。