您的位置:首页 > 其它

竖屏小游戏--喵星战争源码分析【完整】

2014-09-19 12:11 344 查看
转自:/article/1379389.html

ccp文件介绍:

GameMenuScene.cpp游戏主菜单

GameMainScene.cpp游戏主页面

GameObjHero.cpp主角

GameHeroBullet.cpp主角的子弹

GameObjEnemy.cpp敌人

GameEnemyBullet.cpp敌人的子弹

GameAboutScene.cpp关于页面

GameMark.cpp游戏分数



运行游戏进入游戏主菜单页面



代码:

GameMenuScene类init()函数,初始化主菜单页面背景图

[cpp] view
plaincopy





CCSprite* back = CCSprite::create("bg.png");

back->setScale(0.5);

back->setPosition(ccp(size.width/2,size.height/2));

this->addChild(back,0,0);

初始化主菜单页面背景星球图片

[cpp] view
plaincopy





CCSprite* bgstar = CCSprite::create("moon.png");

bgstar->setAnchorPoint(ccp(0.5,0));

bgstar->setScale(0.5);

bgstar->setPosition(ccp(size.width/3 * 2, 0));

this->addChild(bgstar,1,1);

初始化主菜单页面标题名称meowstar、battle

[cpp] view
plaincopy





CCNode* title = CCNode::create();

title->setContentSize(CCSizeMake(0,0));

CCSprite* ptmLabel = CCSprite::create("meowstar.png");

ptmLabel->setScale(0.5);

ptmLabel->setPosition(ccp(0,30));

title->addChild(ptmLabel);

CCSprite *ptbLabel = CCSprite::create("battle.png");

ptbLabel->setScale(0.5);

ptbLabel->setPosition( ccp(0,-30) );

title->addChild(ptbLabel);

title->setPosition(ccp(size.width / 2, size.height - 80));

this->addChild(title,2,2);

初始化主菜单页面中的菜单项及单击事件,并设置为不可见

[cpp] view
plaincopy





CCMenuItemImage *newGameItem = CCMenuItemImage::create("newgameA.png", "newgameB.png",this,menu_selector(GameMenuScene::menuNewGameCallback));//newgame菜单项

newGameItem->setScale(0.5);

newGameItem->setPosition(ccp(size.width / 2,size.height / 2 - 20));

newGameItem->setEnabled(false);

CCMenuItemImage *continueItem = CCMenuItemImage::create("continueA.png", "continueB.png",this,menu_selector(GameMenuScene::menuContinueCallback));//continue菜单项

continueItem->setScale(0.5);

continueItem->setPosition(ccp(size.width / 2,size.height / 2 - 80));

continueItem->setEnabled(false);

CCMenuItemImage *aboutItem = CCMenuItemImage::create("aboutA.png", "aboutB.png",this,menu_selector(GameMenuScene::menuAboutCallback));//aboutA菜单项

aboutItem->setScale(0.5);

aboutItem->setPosition(ccp(size.width / 2,size.height / 2 - 140));

aboutItem->setEnabled(false);

m_soundItem = CCMenuItemImage::create("sound-on-A.png", "sound-on-B.png",this,menu_selector(GameMenuScene::menuSoundCallback));//设置声音菜单项

m_soundItem->setScale(0.5);

m_soundItem->setEnabled(false);

m_soundItem->setPosition(ccp(40,40));



CCMenuItemImage *pCloseItem = CCMenuItemImage::create(

"CloseNormal.png",

"CloseSelected.png",

this,

menu_selector(GameMenuScene::menuCloseCallback));

pCloseItem->setPosition(ccp(size.width - 20, 20));

//使用按钮创建菜单

CCMenu* mainmenu = CCMenu::create(newGameItem,continueItem,aboutItem,m_soundItem,pCloseItem,NULL);

mainmenu->setPosition(ccp(0,0));

this->addChild(mainmenu,1,3);

初始化背景音乐

[cpp] view
plaincopy





m_isSound = true;//是否开启声音标识

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCFileUtils::sharedFileUtils()->fullPathForFilename("background.mp3").c_str() );

CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);

CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic(CCFileUtils::sharedFileUtils()->fullPathForFilename("background.mp3").c_str(), true);

进入主菜单页面有动画效果

[cpp] view
plaincopy





void GameMenuScene::onEnter()

{

CCLayer::onEnter();

CCSize size = CCDirector::sharedDirector()->getWinSize();



CCNode* mainmenu = this->getChildByTag(3);//主菜单

mainmenu->setPositionX(-200);

mainmenu->runAction(CCSequence::create(CCEaseElasticOut::create(CCMoveTo::create(1,ccp(0,0))),CCCallFuncN::create(this, callfuncN_selector(GameMenuScene::menuEnter)),NULL));//终点有弹力



CCNode* title = this->getChildByTag(2);//标题

title->setPositionY(size.height + 20);

title->runAction(CCEaseElasticOut::create(CCMoveBy::create(1,ccp(0,-100))));



CCNode* bgstar = this->getChildByTag(1);//星球

bgstar->setPositionX(size.width/3);

bgstar->runAction(CCMoveBy::create(0.5,ccp(size.width/3,0)));

}

void GameMenuScene::menuEnter( CCNode* pSender )

{

//菜单项可见

CCNode* mainmenu = this->getChildByTag(3);

CCArray* temp = mainmenu->getChildren();

for(unsigned int i = 0;i < temp->count();i ++)

{

((CCMenuItemImage *)temp->objectAtIndex(i))->setEnabled(true);

}

}

点击NEW GAME、Contunue菜单按键切换GameMainScene场景进入游戏主页面

[cpp] view
plaincopy





void GameMenuScene::menuNewGameCallback( CCObject* pSender )

{

CCDirector::sharedDirector()->replaceScene(GameMainScene::scene());

}



void GameMenuScene::menuContinueCallback( CCObject* pSender )

{

CCDirector::sharedDirector()->replaceScene(GameMainScene::scene());

}

点击About 菜单按键切换GameAboutScene场景进入关于页面

[cpp] view
plaincopy





void GameMenuScene::menuAboutCallback( CCObject* pSender )

{

CCDirector::sharedDirector()->replaceScene(GameAboutScene::scene());

}

点击声音菜单按键,变换按键图标,设置声音开关

[cpp] view
plaincopy





void GameMenuScene::menuSoundCallback( CCObject* pSender )

{

if(!m_isSound)//声音开

{

m_soundItem->setNormalImage(CCSprite::create("sound-on-A.png"));

m_soundItem->setDisabledImage(CCSprite::create("sound-on-B.png"));

CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic(CCFileUtils::sharedFileUtils()->fullPathForFilename("background.mp3").c_str(), true);

m_isSound = true;

}

else//声音关

{

m_soundItem->setNormalImage(CCSprite::create("sound-off-A.png"));

m_soundItem->setDisabledImage(CCSprite::create("sound-off-B.png"));

CocosDenshion::SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();

m_isSound = false;

}

}



关于页面



代码:

初始化关于页面

背景

[cpp] view
plaincopy





CCSprite* bg = CCSprite::create("bg.png");

bg->setScale(0.5);

bg->setPosition( ccp(size.width/2, size.height/2) );

this->addChild(bg, 0,0);

星球

[cpp] view
plaincopy





CCSprite*bgstar = CCSprite::create("moon.png");

bgstar->setAnchorPoint(ccp(0.5,0));

bgstar->setScale(0.5);

bgstar->setPosition(ccp(size.width/3 * 1, 0));

this->addChild(bgstar,1,1);

关于页面的信息

[cpp] view
plaincopy





CCSprite*kuang = CCSprite::create("tb.png");

kuang->setScale(0.5);

kuang->setPosition(ccp(size.width/2, size.height/2));

this->addChild(kuang,2,2);

char inf[256];

sprintf(inf,"游戏名称:喵星战争\n\n作者:\n\n公司:\n\n使用工具:cocos2D-x");

CCLabelTTF * myjineng = CCLabelTTF::create(inf,"Marker Felt",40,CCSizeMake(400,400),kCCTextAlignmentLeft);

myjineng->setAnchorPoint(ccp(0,1));

myjineng->setColor(ccc3(255,200,0));

myjineng->setPosition(ccp(50,600));

kuang->addChild(myjineng);//将标签加入关于框

返回菜单按键,并注册点击事件

[cpp] view
plaincopy





CCMenuItemImage *back = CCMenuItemImage::create("backA.png", "backB.png",this,menu_selector(GameAboutScene::menuBackCallback));

back->setScale(0.5);

back->setPosition(ccp(size.width - 20,size.height - 20));

back->setEnabled(false);

CCMenu* mainmenu = CCMenu::create(back,NULL);

mainmenu->setPosition(ccp(0,0));

this->addChild(mainmenu,3,4);

返回键点击返回到主菜单页面

[cpp] view
plaincopy





void GameAboutScene::menuBackCallback( CCObject* pSender )

{

CCDirector::sharedDirector()->replaceScene(GameMenuScene::scene());

}

进入关于页面时的动画

[cpp] view
plaincopy





void GameAboutScene::onEnter()

{

CCLayer::onEnter();

//菜单进入后,菜单项点击有效

CCSize size = CCDirector::sharedDirector()->getWinSize();

CCNode* mainmenu = this->getChildByTag(4);//返回键

mainmenu->setPositionX(-100);

mainmenu->runAction(CCSequence::create(CCEaseElasticOut::create(CCMoveBy::create(0.5,ccp(100,0))),CCCallFuncN::create(this, callfuncN_selector(GameAboutScene::menuEnter)),NULL));//终点弹力效果

//

CCNode* title = this->getChildByTag(3);//关于页面标题

title->setPositionY(size.height+20);

title->runAction(CCEaseElasticOut::create(CCMoveBy::create(0.5,ccp(0,-40))));



CCNode*bgstar = this->getChildByTag(1);

bgstar->setPositionX(size.width/3 * 2);

bgstar->runAction(CCMoveBy::create(0.5,ccp(-size.width/3,0)));



CCNode*kuang = this->getChildByTag(2);//关于框

kuang->setPositionX(-200);

kuang->runAction(CCEaseElasticOut::create(CCMoveTo::create(0.5,ccp(size.width/2,size.height/2))));

}





进入主页面



代码:

初始化游戏主页面

背景,创建2个图拼接一起

[cpp] view
plaincopy





m_bg1 = CCSprite::create("bg.png");

m_bg1->setScale(0.5);

m_bg2 = CCSprite::create("bg.png");

m_bg2->setScale(0.5);

m_bg1->setAnchorPoint(ccp(0,0));//设置锚点

m_bg2->setAnchorPoint(ccp(0,0));

m_bg1->setPosition( ccp(0,0) );

m_bg2->setPosition( ccp(0,size.height) );

this->addChild(m_bg1, 0);

this->addChild(m_bg2, 0);

创建主角及出场动画

[cpp] view
plaincopy





m_hero = new GameObjHero();

m_hero->setPosition(ccp(size.width/2,-50));

m_hero->setScale(0.5);

this->addChild(m_hero,2,1);

m_hero->runAction(CCMoveBy::create(0.5,ccp(0,150)));

创建3个敌人,每个敌人有移动动作

[cpp] view
plaincopy





m_enemys = CCArray::createWithCapacity(3);

for(int i = 0;i < 3;i ++)

{

int type = i + 1;

GameObjEnemy* enemy = new GameObjEnemy();

enemy->setPosition(ccp(size.width/4 * type,size.height + 50));

enemy->setScale(0.5);

enemy->setType(type);

m_enemys->addObject(enemy);

this->addChild(enemy,1);

enemy->moveStart();

}

初始主角生命数及生命图标

[cpp] view
plaincopy





m_blood = 3;

CCSpriteBatchNode* ui = CCSpriteBatchNode::create("cat.png");

//CCNode *ui = CCNode::create();

m_blood1 = CCSprite::createWithTexture(ui->getTexture());

m_blood1->setPosition(ccp(20,size.height - 20));

m_blood1->setScale(0.2f);

ui->addChild(m_blood1);

m_blood2 = CCSprite::createWithTexture(ui->getTexture());

m_blood2->setPosition(ccp(50,size.height - 20));

m_blood2->setScale(0.2f);

ui->addChild(m_blood2);

m_blood3 = CCSprite::createWithTexture(ui->getTexture());

m_blood3->setPosition(ccp(80,size.height - 20));

m_blood3->setScale(0.2f);

ui->addChild(m_blood3);

addChild(ui,4);

初始化主角子弹

[cpp] view
plaincopy





m_heroBullets = CCArray::createWithCapacity(5);

for(size_t i = 0;i < m_heroBullets->capacity();i ++)

{

GameHeroBullet * mybullet = new GameHeroBullet();

mybullet->setIsNotVisable(this);

mybullet->setScale(0.5);

m_heroBullets->addObject(mybullet);

this->addChild(mybullet,3);

}

m_heroBullets->retain();//计数器+1

初始化敌人子弹

[cpp] view
plaincopy





m_enemyBullets = CCArray::createWithCapacity(10);

for(size_t i = 0;i < m_enemyBullets->capacity();i ++)

{

GameEnemyBullet * mybullet = new GameEnemyBullet();

mybullet->setIsNotVisable(this);//若是没加object参数,会发生运行时调用约定错误,原因未知

mybullet->setScale(0.5);

m_enemyBullets->addObject(mybullet);

this->addChild(mybullet,3);

}

m_enemyBullets->retain();

游戏分数

[cpp] view
plaincopy





m_gameMark = new GameMark();

this->addChild(m_gameMark,4);

初始化游戏结束语gameover

[cpp] view
plaincopy





m_gameOver = CCSprite::create("gameover.png");

m_gameOver->setAnchorPoint(ccp(0.5,0.5));

m_gameOver->setPosition(ccp(0,0));

m_gameOver->setPosition(ccp(size.width/2,size.height/2 + 70));

m_gameOver->setVisible(false);

m_gameOver->setScale(0.5);

this->addChild(m_gameOver,5);

游戏结束上一步菜单按键

[cpp] view
plaincopy





CCMenuItemImage *pCloseItem = CCMenuItemImage::create("back.png","back.png",

this,menu_selector(GameMainScene::menuBackCallback) );

pCloseItem->setPosition( ccp(size.width/2,size.height/2 - 50) );

pCloseItem->setScale(0.5);

CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);

pMenu->setPosition( CCPointZero );

this->addChild(pMenu,5,25);

pMenu->setVisible(false);

pMenu->setEnabled(false);

m_isReduce = false;

m_isGameOver = false;



scheduleUpdate();

主角及主角子弹



代码:

主角接收触摸

[cpp] view
plaincopy





CCDirector* pDirector = CCDirector::sharedDirector();

pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);

主角身体动画

[cpp] view
plaincopy





CCAnimation* animation = CCAnimation::create();

animation->addSpriteFrameWithFileName("catBody1.png");

animation->addSpriteFrameWithFileName("catBody2-4.png");

animation->addSpriteFrameWithFileName("catBody3.png");

animation->addSpriteFrameWithFileName("catBody2-4.png");

animation->setDelayPerUnit(0.1f);

animation->setRestoreOriginalFrame(true);

mainsprite->runAction(CCRepeatForever::create(CCAnimate::create(animation)));

this->addChild(mainsprite);

主角尾巴摇摆动画

[cpp] view
plaincopy





CCSprite *tail = CCSprite::create("catTail.png");

tail->setAnchorPoint(ccp(0.5,1));

tail->setPosition(ccp(-5,-29));

tail->setScale(0.5);

tail->setRotation(20);

tail->runAction(CCRepeatForever::create((CCActionInterval*)CCSequence::create(CCRotateBy::create(0.5,-40),CCRotateBy::create(0.5,40),NULL)));

this->addChild(tail);

主角手动画

[cpp] view
plaincopy





m_leftHand = CCSprite::create("catHand1.png");

m_leftHand->setAnchorPoint(ccp(1,0.5));

m_leftHand->setPosition(ccp(-18,-20));

this->addChild(m_leftHand);

m_rightHand = CCSprite::create("catHand2.png");

m_rightHand->setPosition(ccp(18,-20));

m_rightHand->setAnchorPoint(ccp(0,0.5));

this->addChild(m_rightHand);

m_offset = ccp(0,0);

m_isControl = false;

主角定时发射子弹

[cpp] view
plaincopy





schedule(schedule_selector(GameObjHero::releasebullet), 0.8f);

void GameObjHero::releasebullet( float dt )

{

if(m_isControl)//是否触摸了主角,触摸了则发射子弹

{

CCPoint pos = this->getPosition(); //获取主角坐标

GameMainScene *p = (GameMainScene*) this->getParent();//获取父场景调用releaseHeroBullet发射子弹

p->releaseHeroBullet(pos.x,pos.y + 30);

}

}

void GameMainScene::releaseHeroBullet( int x,int y )//参数主角坐标

{

for(size_t i = 0;i < m_heroBullets->capacity();i++)//遍历主角每个子弹

{

if(!((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->getIsvisble())

{

//设置位置,并设置为显示

((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->setPosition(ccp(x,y));//子弹起始位置

((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->setIsVisable();//子弹移动动画

break;

}

}

}

void GameHeroBullet::setIsVisable()

{

this->setVisible(true);

m_isVisable = true;

int a = (-this->getPosition().y + 550)/150;

this->runAction(CCSequence::create(CCMoveTo::create((-this->getPosition().y + 550)/150,ccp(this->getPosition().x,550)),CCCallFuncN::create(this, callfuncN_selector(GameHeroBullet::setIsNotVisable)),NULL));;

}

void GameHeroBullet::setIsNotVisable(CCNode* pSender)

{

this->setVisible(false);

m_isVisable = false;

this->stopAllActions();

}

ccTouchBegan中判断是否点中主角

[cpp] view
plaincopy





if(! containsTouchLocation(touch))//没选中主角

{

return false;

}

else//选中了

{

m_isControl = true;//发射子弹

//获取触摸偏移

CCPoint touchPoint = touch->getLocationInView();

touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);

m_offset.x = touchPoint.x - this->getPosition().x;

m_offset.y = touchPoint.y - this->getPosition().y;

}

//选中的点是否在精灵矩形范围内

bool GameObjHero::containsTouchLocation(CCTouch* touch)

{

return rect().containsPoint(convertTouchToNodeSpaceAR(touch));//

}



CCRect GameObjHero::rect()

{

CCSize s = CCSizeMake(85,90);

CCPoint p = ccp(-s.width / 2, -s.height / 2);

return CCRectMake(-s.width / 2, -s.height / 2, s.width, s.height);

}

敌人及敌人子弹



代码:

创建敌人

[cpp] view
plaincopy





this->setContentSize(CCSizeMake(99,115));

m_mainBody = CCSprite::create("DrDog1.png");

//敌人自身动画

CCAnimation* animation = CCAnimation::create();

animation->addSpriteFrameWithFileName("DrDog1.png");

animation->addSpriteFrameWithFileName("DrDog2.png");

animation->setDelayPerUnit(0.1f);

animation->setRestoreOriginalFrame(true);

m_mainBody->runAction(CCRepeatForever::create(CCAnimate::create(animation)));

this->addChild(m_mainBody);

//初始化爆炸,不可见

m_boom = CCSprite::create("boom1.png");

this->addChild(m_boom);

m_boom->setVisible(false);

m_isLife = true;

敌人移动动画

[cpp] view
plaincopy





int type = CCRANDOM_0_1() * 4;//4种随机移动

//敌人运动轨迹(贝尔曲线)

ccBezierConfig bezier2;

bezier2.controlPoint_1 = CCPointMake(this->getPosition().x - 400,330);

bezier2.controlPoint_2 = CCPointMake(this->getPosition().x + 400,280);

bezier2.endPosition = CCPointMake(this->getPosition().x,-70);

CCBezierTo * bezierBy2 = CCBezierTo::create(6, bezier2);

ccBezierConfig bezier1;

bezier1.controlPoint_1 = CCPointMake(this->getPosition().x + 400,330);

bezier1.controlPoint_2 = CCPointMake(this->getPosition().x - 400,280);

bezier1.endPosition = CCPointMake(this->getPosition().x,-70);

CCBezierTo * bezierBy1 = CCBezierTo::create(6, bezier1);

switch(type)

{

case 0:

case 1:

this->runAction(CCSequence::create(CCMoveBy::create(6,ccp(0,-600)),CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::reStart)),NULL));

break;

case 2:

this->runAction(CCSequence::create(bezierBy2,CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::reStart)),NULL));

break;

case 3:

this->runAction(CCSequence::create(bezierBy1,CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::reStart)),NULL));

break;

}

schedule(schedule_selector(GameObjEnemy::releaseBullet), 1.2f);

当第一波敌人过屏以后,重新设置一波敌人初始位置及移动的动画, 这样敌人就无限循环出现

[cpp] view
plaincopy





void GameObjEnemy::reStart( CCNode* pSender )

{

m_mainBody->setVisible(true);

m_boom->setVisible(false);

CCSize size = CCDirector::sharedDirector()->getWinSize();

this->setPosition(ccp(size.width/4 * m_type,size.height + 50));

m_isLife = true;

this->moveStart();

}

每个敌人发射子弹

[cpp] view
plaincopy





void GameObjEnemy::releaseBullet( float dt )

{

CCSize size = CCDirector::sharedDirector()->getWinSize();

CCPoint pos = this->getPosition();//敌人位置

if(pos.y > 20 && pos.y < size.height && m_isLife)//敌人出在屏幕上才能发

{

GameMainScene *p = (GameMainScene *) this->getParent();

p->releaseEnemyBullet(pos.x,pos.y - 30);//发射子弹

}

}

void GameMainScene::releaseEnemyBullet( int x,int y )

{

for(unsigned int i = 0; i<m_enemyBullets->capacity(); i++)//每个敌人的子弹10发

{

if(!((GameEnemyBullet*)m_enemyBullets->objectAtIndex(i))->getIsvisble())

{

((GameEnemyBullet*)m_enemyBullets->objectAtIndex(i))->setPosition(ccp(x,y));

((GameEnemyBullet*)m_enemyBullets->objectAtIndex(i))->setIsVisable();//子弹动画

break;

}

}

}

void GameEnemyBullet::setIsVisable()

{

this->setVisible(true);

m_isVisable = true;

this->runAction(CCRepeatForever::create(CCRotateBy::create(1,360)));

this->runAction(CCSequence::create(CCMoveTo::create((this->getPosition().y + 50)/150,ccp(this->getPosition().x,-50)),CCCallFuncN::create(this, callfuncN_selector(GameEnemyBullet::setIsNotVisable)),NULL));;

}



void GameEnemyBullet::setIsNotVisable(CCNode* pSender)

{

this->setVisible(false);

m_isVisable = false;

this->stopAllActions();

}



游戏主页面update定时器进行游戏背景动画处理和主角与敌人攻击碰撞检测

游戏背景动画至上往下移动,当第1张图滑过底部时,第2张图连接上,每次移动2

[cpp] view
plaincopy





游戏背景动画至上往下移动,当第1张图滑过底部时,第2张图连接上,每次移动2

m_bg1->setPosition(ccp(m_bg1->getPosition().x,m_bg1->getPosition().y - 2));

m_bg2->setPosition(ccp(m_bg2->getPosition().x,m_bg2->getPosition().y - 2));

if(m_bg2->getPosition().y <= 0)

{

float temp = m_bg2->getPosition().y + 480;

m_bg1->setPosition(ccp(m_bg2->getPosition().x,temp));

}

if(m_bg1->getPosition().y <= 0)

{

float temp = m_bg1->getPosition().y + 480;

m_bg2->setPosition(ccp(m_bg1->getPosition().x,temp));

}

三种碰撞检测

敌人和主角、主角子弹碰撞检测

[cpp] view
plaincopy





CCPoint hpos = m_hero->getPosition();//主角坐标

for(size_t i = 0;i < m_enemys->capacity();i ++)//遍历敌人

{

GameObjEnemy * enemy = ((GameObjEnemy *) m_enemys->objectAtIndex(i));//单个敌人

CCPoint epos = enemy->getPosition();

if(enemy->m_isLife)//子弹击中敌人

{

for(size_t i = 0;i < m_heroBullets->capacity();i ++)//主角子弹

{

if(((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->getIsvisble())

{

if(isHit(((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->getPosition(),epos,5,13,21,28))//主角子弹打中敌人碰撞检测

{

enemy->setDie();//敌人消失,有爆炸动画

m_gameMark->addNumber(200);//加分

break;

}

}

}

}

//敌人和主角碰撞

if(!m_isReduce && enemy->m_isLife && isHit(hpos,epos,21,22.5,21,28))

{

enemy->setDie();

setHeroHurt();//主角掉命

}

}

主角被敌人子弹打中碰撞检测

[cpp] view
plaincopy





if(!m_isReduce)

{

for(size_t i = 0;i < m_enemyBullets->capacity();i ++)//敌人的子弹10发

{

if(isHit(hpos,((GameEnemyBullet *)m_enemyBullets->objectAtIndex(i))->getPosition(),21,22.5,5,13))

{

setHeroHurt();//主角掉命

}

}

}

判断两个矩形是否碰撞

[cpp] view
plaincopy





bool GameMainScene::isHit( CCPoint p1,CCPoint p2,int w1,int h1,int w2,int h2 )

{

if(abs(p1.x - p2.x) < w1 + w2 && abs(p1.y - p2.y) < h1 + h2)

{

return true;

}

return false;

}

主角掉命

[cpp] view
plaincopy





void GameMainScene::setHeroHurt()

{

m_hero->stopAllActions();

switch(m_blood)//初始3

{

case 3:

m_blood1->setVisible(false);//命图标不可见

m_blood --;

break;

case 2:

m_blood2->setVisible(false);

m_blood --;

break;

case 1:

m_blood3->setVisible(false);

m_blood --;

break;

case 0:

if(! m_isGameOver)

{

m_isGameOver = true;

setGameOver();//3条命用完,游戏结束

}

break;

}

CCActionInterval* action = CCBlink::create(5, 10);//3秒内闪烁6次

m_hero->runAction(action);

scheduleOnce(schedule_selector(GameMainScene::resetReduce), 5.0f);//5秒后执行一次

m_isReduce = true;//5秒不受伤害

}

void GameMainScene::resetReduce( float dt )

{

m_isReduce = false;//重新能收到伤害

}

敌人消失后爆炸

[cpp] view
plaincopy





void GameObjEnemy::setDie()

{

//敌人消失

m_isLife = false;

m_mainBody->setVisible(false);

m_boom->setVisible(true);

this->stopAllActions();

//爆炸动画

CCAnimation* boomAnimation = CCAnimation::create();

boomAnimation->addSpriteFrameWithFileName("boom1.png");

boomAnimation->addSpriteFrameWithFileName("boom2.png");

boomAnimation->addSpriteFrameWithFileName("boom3.png");

boomAnimation->addSpriteFrameWithFileName("boom4.png");

boomAnimation->addSpriteFrameWithFileName("boom5.png");

boomAnimation->setDelayPerUnit(0.1f);

boomAnimation->setRestoreOriginalFrame(true);

m_boom->runAction(CCSequence::create(CCAnimate::create(boomAnimation),CCCallFuncN::create(this,

callfuncN_selector(GameObjEnemy::reStart)),NULL));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: