main调用AppDelegate()创建应用,进行场景launching和finish以及频率等一些游戏配置,然后调入场景GameScene
GameScene.h 定义了主游戏场景,包括精灵,动作,以及碰撞
#ifndef __GameScene_SCENE_H__
#define __GameScene_SCENE_H__
#include "cocos2d.h"
//#include "BackgroundLayer.h"
class GameScene : public cocos2d::CCLayerColor
{
public:
// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::CCScene* scene();
cocos2d::CCSprite* target;
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// a selector callback
// implement the "static create()" method manually
CREATE_FUNC(GameScene);
void menuCloseCallback(CCObject* pSender);
void responseFunc(CCObject* obj);
void myDefine(CCNode* who);
void createTarget();
void gameLogic(float dt);
void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
~GameScene();
void update(float delta) ;//delta = 1s/fps;
//array or list
//add:怪物飞镖出现 delete:碰撞出现
//遍历:FPS的时间遍历一次
cocos2d::CCArray *_targets;
cocos2d::CCArray *_projs;
int _successCount; //打怪数
protected:
};
#endif // __HELLOWORLD_SCENE_H__
GameScene.cpp 实现精灵、动作、场景切换、碰撞检测、计算分数等
#include "GameScene.h"
#include "SimpleAudioEngine.h"
#include "GameOverLayer.h"
USING_NS_CC;
CCScene* GameScene::scene()
{
// 'scene' is an autorelease object
auto scene = CCScene::create();
// 'layer' is an autorelease object
auto layer = GameScene::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool GameScene::init()
{
//
if ( !CCLayerColor::initWithColor(ccc4(255,0,0,255)) )
{
return false;
}
//杀怪数
_successCount = 0;
//创建精灵
CCSize screenSize = CCDirector::sharedDirector()->getVisibleSize();
CCSprite* player = CCSprite::create("Player.png");
player->setPosition(ccp(20,screenSize.height/2));
this->addChild(player);
//工厂方法 Class::create 不需要手动释放
//new 则需要手动释放
_projs = new CCArray;
_targets = new CCArray;
//菜单的使用
/*CCMenuItemImage* item = CCMenuItemImage::create("button2.png",
"button2.png","button2.png",this,menu_selector(GameScene::responseFunc));
item->setPosition(ccp(30,30));
CCMenu* menu= CCMenu::create(item,NULL);
this->addChild(menu);*/
this->schedule(schedule_selector(GameScene::gameLogic),2);
this->schedule(schedule_selector(GameScene::update),1/60);
this->setTouchEnabled(true);
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav",true);
return true;
}
void GameScene::update(float delta) //delta = 1s/fps
{
CCArray* targetToDelete = new CCArray;
CCArray* projToDelete = new CCArray;
CCObject* itarget;
CCObject* iproj;
CCARRAY_FOREACH(_targets,itarget)
{
CCSprite* target=(CCSprite*)itarget;
CCRect targetZone = CCRectMake(target->getPositionX(),
target->getPositionY(),target->getContentSize().width,
target->getContentSize().height);
CCARRAY_FOREACH(_projs,iproj)
{
CCSprite* proj=(CCSprite*)iproj;
CCRect projZone = CCRectMake(proj->getPositionX(),
proj->getPositionY(),proj->getContentSize().width,
proj->getContentSize().height);
if(projZone.intersectsRect(targetZone))
{
if(_successCount++>5){
CCScene* overScene = GameOverLayer::scene();
//CCScene->GameOverLayer->Label
GameOverLayer* overLayer = (GameOverLayer*) overScene->getChildByTag(100);
overLayer->_label->setString("Man,you Rock!");
CCDirector::sharedDirector()->replaceScene(overScene);
}
projToDelete->addObject(iproj);
targetToDelete->addObject(itarget);
}
}
}//end of iterate
CCARRAY_FOREACH(projToDelete,iproj)
{
_projs->removeObject(iproj);
CCSprite* proj=(CCSprite*)iproj;
proj->removeFromParentAndCleanup(true);
}
CCARRAY_FOREACH(targetToDelete,itarget)
{
_targets->removeObject(itarget);
CCSprite* target=(CCSprite*)itarget;
target->removeFromParentAndCleanup(true);
}
targetToDelete->release();
projToDelete->release();
}
void GameScene::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
CCTouch* touch = (CCTouch*)pTouches->anyObject();
CCPoint locInView = touch->getLocationInView();
CCPoint loc = CCDirector::sharedDirector()->convertToGL(locInView);
if(loc.x <=20)
{
return;
}
CCSize screenSize = CCDirector::sharedDirector()->getVisibleSize();
CCSprite* proj = CCSprite::create("Projectile.png");
proj->setPosition(ccp(20,screenSize.height/2));
this->addChild(proj);
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pew-pew-lei.wav");
_projs->addObject(proj);
proj->setTag(2);
double dx = loc.x-20;
double dy = loc.y-screenSize.height/2;
double d = sqrt(dx*dx + dy*dy);
double D = sqrt(screenSize.width*screenSize.width+screenSize.height*screenSize.height);
double ratio = D/d;
double endx = ratio *dx +20;
double endy = ratio * dy+screenSize.height/2;
CCMoveTo* move=CCMoveTo::create(D/320,ccp(endx,endy));
CCCallFuncN* moveFinish = CCCallFuncN::create(this,
callfuncN_selector(GameScene::myDefine));
CCSequence* actions = CCSequence::create(move,moveFinish,NULL);
proj->runAction(actions);
}
GameScene::~GameScene()
{
if(_projs!=NULL)
_projs->release();
if(_targets!=NULL)
_targets->release();
}
void GameScene::gameLogic(float dt)
{
this->createTarget();
}
void GameScene::createTarget()
{
CCSize screenSize = CCDirector::sharedDirector()->getVisibleSize();
//添加怪物并直接移动到消失
CCSprite* mytarget = CCSprite::create("Target.png");
int y = rand() % (int)screenSize.height;
mytarget->setPosition(ccp(screenSize.width-20,y));
this->addChild(mytarget);
_targets->addObject(mytarget);
mytarget->setTag(1);
CCMoveTo* move = CCMoveTo::create(2,ccp(0,y));
CCCallFuncN* disappear = CCCallFuncN::create(this,
callfuncN_selector(GameScene::myDefine));
CCSequence* actions = CCSequence::create(move,disappear,NULL);
mytarget->runAction(actions);
}
void GameScene::responseFunc(CCObject* obj)
{
//CCLOG("menue item clicked");
CCMoveTo* move = CCMoveTo::create(2,ccp(0,40));
CCCallFuncN* disappear = CCCallFuncN::create(this,
callfuncN_selector(GameScene::myDefine));
CCSequence* actions = CCSequence::create(move,disappear,NULL);
target->runAction(actions);
}
void GameScene::myDefine(CCNode* who)
{
//who->setPosition(ccp(0,0));
//who->setScale(2);
who->removeFromParentAndCleanup(true);
int tag = who->getTag();
if(1==tag)
{
_targets->removeObject(who);
CCScene* overScene = GameOverLayer::scene();
//CCScene->GameOverLayer->Label
GameOverLayer* overLayer = (GameOverLayer*) overScene->getChildByTag(100);
overLayer->_label->setString("Man,you suck!");
CCDirector::sharedDirector()->replaceScene(overScene);
}
else if(2==tag)
{
_projs->removeObject(who);
}
}
void GameScene::menuCloseCallback(CCObject* pSender)
{
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
GameOverLayout.h 用于显示游戏结果
#include "cocos2d.h"
//不用USING_NS_CC,避免污染其他环境
class GameOverLayer : public cocos2d::CCLayerColor
{
public:
bool init();
cocos2d::CCLabelTTF* _label;
~GameOverLayer();
//create scene,相互依赖,方便切换
static cocos2d::CCScene* scene();
CREATE_FUNC(GameOverLayer);
void returnToGame(cocos2d::CCNode*);
//CCLabelTTF::create() 要先设置一个宏变量,使用create则执行init
};
GameOverLayout.cpp 实现显示结果和自动切回主游戏场景
#include "GameOverLayer.h"
#include "GameScene.h"
USING_NS_CC;
bool GameOverLayer::init()
{
if(CCLayerColor::initWithColor(ccc4(0,255,0,255)))
{
_label = CCLabelTTF::create("word","Artial",40);
CCSize size = CCDirector::sharedDirector()->getVisibleSize();
_label->setPosition(ccp(size.width/2,size.height/2));
this->addChild(_label);
_label->retain(); //保证label不被autorelease,和layer有同样生命周期
CCDelayTime* delay = CCDelayTime::create(5);
CCCallFuncN* returnToGame = CCCallFuncN::create(this,
callfuncN_selector(GameOverLayer::returnToGame));
this->runAction(CCSequence::create(delay,returnToGame,NULL));
return true;
}
return false;
}
GameOverLayer::~GameOverLayer()
{
if(_label)
{
_label->release();
}
}
cocos2d::CCScene* GameOverLayer::scene()
{
CCScene* scene = CCScene::create();
GameOverLayer* layer = GameOverLayer::create();
layer->setTag(100);
scene->addChild(layer);
return scene;
}
void GameOverLayer::returnToGame(CCNode*)
{
CCDirector::sharedDirector()->replaceScene(GameScene::scene());
}
注意文件位置以及游戏过程调用和变量的生命周期
游戏结果截图:
(最后感谢,cocos2d-x简单入门视频教学 云盘位置:http://pan.baidu.com/s/1ELk78#dir/path=%2Fcocos2dx-%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B)