cocos2d-x学习笔记(17)--简单游戏实例1--双易做图
cocos2d-x学习笔记(17)--简单游戏实例--双易做图
从最初的学习笔记到现在,一直在讲的都是一些基础操作,没有实际去做出一个游戏,有些人可能会疑问之前学得实不实用。为了更好地运用和巩固前面的知识,现在开始,我开始开发一个很简单的游戏--双易做图,是游戏总得有个名字的吧,可能起得不怎么样,大家见谅见谅!
这次游戏我会用到cocos2d-x下面一些知识(前面都学过的):
(1)地图
(2)粒子系统
(3)场景的切换
(4)精灵
(5)按钮
(6)回调函数
(7)动作
(8)精灵表单
step1:创建cocos2d-win32工程,并命名为myGame01;(以后还会陆续写一些游戏)
step2:这个游戏主要分成两大部分,第一部分是游戏的菜单部分,第二部分是游戏运行场景部分。我就先说第二部分吧!因为第一部分菜单按钮中的“开始按钮”会调用第二部分场景,所以从第二部分开始讲起,就不会牵涉到第一部分的代码;两者分开来写,思路会更清晰些,也方便日后代码的修改。
示意图:
由于About Game跳转到的场景比较简单这里不算进第二部分场景,可以直接忽略;
在HelloWorldScene.h中添加场景2的类:
[cpp]
class GameLayer:public CCLayerColor
{
protected:
CCMutableArray<CCSprite*>* m_targets;//用于记录移动的靶子
CCMutableArray<CCSprite*>* m_fires;//用于记录发射的子弹
CCTMXTiledMap* m_map;//tmx地图
CCSprite *m_player;//发射炮弹的主角
public:
GameLayer();
~GameLayer();
void addTarget();//添加移动的靶子
void spriteMoveFinished(CCNode* pSender);//处理那些移动到屏幕之外的靶子
void gameLogic(ccTime dt);
void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);//响应用户在屏幕上的点击事件
void update(ccTime dt);//处理每一帧画面中的对象
void moveMap(ccTime dt);//移动地图
void menuCloseCallback(CCObject* pSender);//退出游戏
};
在HelloWorldScene.cpp中添加响应成员函数:
[cpp]
/************************************************************************/
/* GameLayer */
/************************************************************************/
GameLayer::GameLayer()
{
setIsTouchEnabled(true);
increaseX = 0;//初始化
m_targets = new CCMutableArray<CCSprite*>(NULL);
m_fires = new CCMutableArray<CCSprite*>(NULL);
CCSize size = CCDirector::sharedDirector()->getWinSize();
//添加关闭按钮
CCMenuItemImage *pCloseItem = CCMenuItemImage::itemFromNormalImage(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(GameLayer::menuCloseCallback));
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
CCMenu* pMenu = CCMenu::menuWithItems(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
addChild(pMenu, 10);
//添加player精灵
m_player = CCSprite::spriteWithFile("player.png", CCRectMake(0, 0, 40, 40));
m_player->retain();
//addChild(m_player, 1);
//m_player->setPosition(ccp(player->getContentSize().width / 2, size.height / 2));
//添加地图
m_map = CCTMXTiledMap::tiledMapWithTMXFile("map.tmx");
m_map->retain();
m_map->setPosition(CCPointZero);
addChild(m_map, 3);
CCTMXObjectGroup* objGroup = m_map->objectGroupNamed("object");
CCStringToStringDictionary* startPoint = objGroup->objectNamed("player");
float posX = startPoint->objectForKey("x")->toFloat();
float posY = startPoint->objectForKey("y")->toFloat();
CCTexture2D* playerTexture = CCTextureCache::sharedTextureCache()->addImage("Player.png");
m_player->setPosition(ccp(posX, posY));
m_map->addChild(m_player);
this->schedule(schedule_selector(GameLayer::gameLogic), 1.0);
this->schedule(schedule_selector(GameLayer::update));
this->schedule(schedule_selector(GameLayer::moveMap), 1.0);
}
GameLayer::~GameLayer()
{
if(m_targets)
{
m_targets->release();
m_targets = NULL;
}
if(m_fires)
{
m_fires->release();
m_fires = NULL;
}
}
void GameLayer::menuCloseCallback(CCObject* pSender)
{
//跳转到游戏开始处
CCScene* scene = new CCScene();
CCLayer* layer = new GameMenuLayer();
scene->addChild(layer);
CCDirector::sharedDirector()->replaceScene(scene);
scene->release();
layer->release();
}
void GameLayer::moveMap(ccTime dt)
{
if(increaseX >= 2700)//地图移动到尽头,不能再移动
return;
increaseX += 50;
CCActionInterval* move = CCMoveBy::actionWithDuration(1, ccp(-50,0));
m_map->runAction(move);
m_player->runAction(move->reverse());
}
void GameLayer::addTarget()
{
CCSize size = CCDirector::sharedDirector()->getWinSize();
 
补充:移动开发 , 其他 ,