参考网络视频资源,作者blog网址是:http://blog.youkuaiyun.com/s_xing
另外一个也写了这个游戏的简单实现的网址:http://blog.youkuaiyun.com/akof1314/article/details/8268882
环境 xp + cocos2d-x-2.2.0 + vs2010
游戏源码资源下载地址 点击打开链接
游戏最终运行效果如图示:
1. 新建项目
参考新建项目 SimpleGame
2. 提交资源以及显示第一个精灵
修改 HelloWorldScene.h 将类 HelloWorld 从原来的继承 CCLayer 改为继承于 CCLayerColor
将 HelloWorldScene.cpp 文件中的 init 改为如下的内容
bool HelloWorld::init()
{
if ( !CCLayerColor::initWithColor(ccc4(0, 255, 0, 255)))
{
return false;
}
CCSize screenSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *player = CCSprite::create("Player.png");
player->setPosition(ccp(20, screenSize.height/2));
this->addChild(player);
return true;
}
编译运行即可出现第一个精灵。
3. 增加怪物精灵
修改 HelloWorldScene.h,在类里增加如下成员变量和成员函数
void responseFunc(CCObject *obj);
void myDefine(CCNode *who);
void createTarget();
void gameLogic(float dt);
cocos2d::CCSprite *target;
在 HelloWorldScene.cpp中实现以上的成员函数
void HelloWorld::gameLogic(float dt)
{
this->createTarget();
}
void HelloWorld::createTarget()
{
CCSize screenSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *myTarget = CCSprite::create("Target.png");
int y = rand() % (int)(screenSize.height);
myTarget->setPosition(ccp(screenSize.width, y));
this->addChild(myTarget);
CCMoveTo *move = CCMoveTo::create(2, ccp(0, y));
CCCallFuncN *disappear = CCCallFuncN::create(this, callfuncN_selector(HelloWorld::myDefine));
CCSequence *actions = CCSequence::create(move, disappear, NULL);
myTarget->runAction(actions);
}
void HelloWorld::responseFunc(CCObject *obj)
{
//CCLOG("hello shopping");
CCMoveTo *move = CCMoveTo::create(2, ccp(0, 80));
CCCallFuncN *disappear = CCCallFuncN::create(this, callfuncN_selector(HelloWorld::myDefine));
CCSequence *actions = CCSequence::create(move, disappear, NULL);
target->runAction(actions);
}
void HelloWorld::myDefine(CCNode *who)
{
//who->setPosition(ccp(40,0));
//who->setScale(2);
who->removeFromParentAndCleanup(true);
}
并在 init 中增加语句 this->schedule(schedule_selector(HelloWorld::gameLogic),2);
编译运行即可出现怪物了。
4. 添加可以发射的飞镖
修改 HelloWorldScene.h,在类里增加如下成员变量和成员函数
bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
void registerWithTouchDispatcher();
在 HelloWorldScene.cpp 中实现以上的成员函数
bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
return true;
}
void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
}
void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint locInView = pTouch->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);
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 *moveto = CCMoveTo::create(D/320, ccp(endx,endy));
CCCallFuncN *moveFinish = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::myDefine));
CCSequence *action = CCSequence::create(moveto, moveFinish, NULL);
proj->runAction(action);
}
void HelloWorld::registerWithTouchDispatcher()
{
CCDirector *pDirector=CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this,0,true);
}
并在 init 中增加语句 this->setTouchEnabled(true);
编译运行,点击窗口即可出现飞镖
5. 增加碰撞检测 飞镖可以打死怪物
修改 HelloWorldScene.h,在类里增加如下成员变量和成员函数
~HelloWorld();
void update(float delta);
cocos2d::CCArray *_targets;
cocos2d::CCArray *_projs;
在HelloWorldScene.cpp中初始化以上的成员变量以及实现以上的成员函数
HelloWorld::~HelloWorld()
{
if(_projs != NULL)
{
_projs->release();
}
if(_targets != NULL)
{
_targets->release();
}
}
void HelloWorld::update(float delta)
{
CCObject *itarget, *iproj;
CCArray *targetToDelete = new CCArray;
CCArray *projToDelete = new CCArray ;
CCARRAY_FOREACH(_targets, itarget)
{
CCSprite *target = (CCSprite*)itarget;
CCARRAY_FOREACH(_projs, iproj)
{
CCSprite *proj = (CCSprite*)iproj;
if(target->boundingBox().intersectsRect(proj->boundingBox()))
{
projToDelete->addObject(iproj);
targetToDelete->addObject(itarget);
}
}
}
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();
}
在 init 中增加语句
this->schedule(schedule_selector(HelloWorld::update));
_projs = new CCArray;
_targets = new CCArray;
在 ccTouchEnded 增加语句
_projs->addObject(proj);
proj->setTag(2);
在 createTarget
增加语句
_targets->addObject(myTarget);
myTarget->setTag(1);
在 myDefine 增加语句
int tag = who->getTag();
if(tag == 1)
{
_targets->removeObject(who);
}
else if(tag == 2)
{
_projs->removeObject(who);
}
编译运行,点击窗口,射出的飞镖可以将怪物打死了。
好了,一个简单的游戏就完成了。