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

 转自:http://blog.csdn.net/oyangyufu/article/details/26942311

ccp文件介绍:

GameMenuScene.cpp游戏主菜单

GameMainScene.cpp游戏主页面

GameObjHero.cpp主角

GameHeroBullet.cpp主角的子弹

GameObjEnemy.cpp敌人

GameEnemyBullet.cpp敌人的子弹

GameAboutScene.cpp关于页面

GameMark.cpp游戏分数

 

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

代码:

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCSprite* back = CCSprite::create("bg.png");  
  2. back->setScale(0.5);  
  3. back->setPosition(ccp(size.width/2,size.height/2));  
  4. this->addChild(back,0,0);  


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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCSprite* bgstar = CCSprite::create("moon.png");  
  2. bgstar->setAnchorPoint(ccp(0.5,0));  
  3. bgstar->setScale(0.5);  
  4. bgstar->setPosition(ccp(size.width/3 * 2, 0));  
  5. this->addChild(bgstar,1,1);  


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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCNode* title = CCNode::create();  
  2. title->setContentSize(CCSizeMake(0,0));  
  3. CCSprite* ptmLabel = CCSprite::create("meowstar.png");  
  4. ptmLabel->setScale(0.5);  
  5. ptmLabel->setPosition(ccp(0,30));  
  6. title->addChild(ptmLabel);  
  7. CCSprite *ptbLabel = CCSprite::create("battle.png");  
  8. ptbLabel->setScale(0.5);  
  9. ptbLabel->setPosition( ccp(0,-30) );  
  10. title->addChild(ptbLabel);  
  11. title->setPosition(ccp(size.width / 2, size.height - 80));  
  12. this->addChild(title,2,2);  

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCMenuItemImage *newGameItem = CCMenuItemImage::create("newgameA.png""newgameB.png",this,menu_selector(GameMenuScene::menuNewGameCallback));//newgame菜单项  
  2. newGameItem->setScale(0.5);  
  3. newGameItem->setPosition(ccp(size.width / 2,size.height / 2 - 20));  
  4. newGameItem->setEnabled(false);  
  5. CCMenuItemImage *continueItem = CCMenuItemImage::create("continueA.png""continueB.png",this,menu_selector(GameMenuScene::menuContinueCallback));//continue菜单项  
  6. continueItem->setScale(0.5);  
  7. continueItem->setPosition(ccp(size.width / 2,size.height / 2 - 80));  
  8. continueItem->setEnabled(false);  
  9. CCMenuItemImage *aboutItem = CCMenuItemImage::create("aboutA.png""aboutB.png",this,menu_selector(GameMenuScene::menuAboutCallback));//aboutA菜单项  
  10. aboutItem->setScale(0.5);  
  11. aboutItem->setPosition(ccp(size.width / 2,size.height / 2 - 140));  
  12. aboutItem->setEnabled(false);  
  13. m_soundItem = CCMenuItemImage::create("sound-on-A.png""sound-on-B.png",this,menu_selector(GameMenuScene::menuSoundCallback));//设置声音菜单项  
  14. m_soundItem->setScale(0.5);  
  15. m_soundItem->setEnabled(false);  
  16. m_soundItem->setPosition(ccp(40,40));  
  17.   
  18. CCMenuItemImage *pCloseItem = CCMenuItemImage::create(  
  19.     "CloseNormal.png",  
  20.     "CloseSelected.png",  
  21.     this,  
  22.     menu_selector(GameMenuScene::menuCloseCallback));  
  23. pCloseItem->setPosition(ccp(size.width - 20, 20));  
  24. //使用按钮创建菜单  
  25. CCMenu* mainmenu = CCMenu::create(newGameItem,continueItem,aboutItem,m_soundItem,pCloseItem,NULL);  
  26. mainmenu->setPosition(ccp(0,0));  
  27. this->addChild(mainmenu,1,3);  

初始化背景音乐

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_isSound = true;//是否开启声音标识  
  2. CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCFileUtils::sharedFileUtils()->fullPathForFilename("background.mp3").c_str() );  
  3. CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);  
  4. CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic(CCFileUtils::sharedFileUtils()->fullPathForFilename("background.mp3").c_str(), true);  

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameMenuScene::onEnter()  
  2. {  
  3.     CCLayer::onEnter();  
  4.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  5.   
  6.     CCNode* mainmenu = this->getChildByTag(3);//主菜单  
  7.     mainmenu->setPositionX(-200);  
  8.     mainmenu->runAction(CCSequence::create(CCEaseElasticOut::create(CCMoveTo::create(1,ccp(0,0))),CCCallFuncN::create(this, callfuncN_selector(GameMenuScene::menuEnter)),NULL));//终点有弹力  
  9.   
  10.     CCNode* title = this->getChildByTag(2);//标题  
  11.     title->setPositionY(size.height + 20);  
  12.     title->runAction(CCEaseElasticOut::create(CCMoveBy::create(1,ccp(0,-100))));  
  13.   
  14.     CCNode* bgstar = this->getChildByTag(1);//星球  
  15.     bgstar->setPositionX(size.width/3);  
  16.     bgstar->runAction(CCMoveBy::create(0.5,ccp(size.width/3,0)));  
  17. }  
  18. void GameMenuScene::menuEnter( CCNode* pSender )  
  19. {  
  20.     //菜单项可见  
  21.     CCNode* mainmenu = this->getChildByTag(3);  
  22.     CCArray* temp = mainmenu->getChildren();  
  23.     for(unsigned int i = 0;i < temp->count();i ++)  
  24.     {  
  25.         ((CCMenuItemImage *)temp->objectAtIndex(i))->setEnabled(true);  
  26.     }  
  27. }  


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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameMenuScene::menuNewGameCallback( CCObject* pSender )  
  2. {  
  3.     CCDirector::sharedDirector()->replaceScene(GameMainScene::scene());  
  4. }  
  5.   
  6. void GameMenuScene::menuContinueCallback( CCObject* pSender )  
  7. {  
  8.     CCDirector::sharedDirector()->replaceScene(GameMainScene::scene());  
  9. }  


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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameMenuScene::menuAboutCallback( CCObject* pSender )  
  2. {  
  3.     CCDirector::sharedDirector()->replaceScene(GameAboutScene::scene());  
  4. }  


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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameMenuScene::menuSoundCallback( CCObject* pSender )  
  2. {  
  3.     if(!m_isSound)//声音开  
  4.     {  
  5.         m_soundItem->setNormalImage(CCSprite::create("sound-on-A.png"));  
  6.         m_soundItem->setDisabledImage(CCSprite::create("sound-on-B.png"));  
  7.         CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic(CCFileUtils::sharedFileUtils()->fullPathForFilename("background.mp3").c_str(), true);  
  8.         m_isSound = true;  
  9.     }  
  10.     else//声音关  
  11.     {  
  12.         m_soundItem->setNormalImage(CCSprite::create("sound-off-A.png"));  
  13.         m_soundItem->setDisabledImage(CCSprite::create("sound-off-B.png"));  
  14.         CocosDenshion::SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();  
  15.         m_isSound = false;  
  16.     }  
  17. }  

 

关于页面

代码:

初始化关于页面

背景

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCSprite* bg = CCSprite::create("bg.png");  
  2. bg->setScale(0.5);  
  3. bg->setPosition( ccp(size.width/2, size.height/2) );  
  4. this->addChild(bg, 0,0);  

星球

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCSprite*bgstar = CCSprite::create("moon.png");  
  2. bgstar->setAnchorPoint(ccp(0.5,0));  
  3. bgstar->setScale(0.5);  
  4. bgstar->setPosition(ccp(size.width/3 * 1, 0));  
  5. this->addChild(bgstar,1,1);  

关于页面的信息

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCSprite*kuang = CCSprite::create("tb.png");  
  2. kuang->setScale(0.5);  
  3. kuang->setPosition(ccp(size.width/2, size.height/2));  
  4. this->addChild(kuang,2,2);  
  5. char inf[256];  
  6. sprintf(inf,"游戏名称:喵星战争\n\n作者:\n\n公司:\n\n使用工具:cocos2D-x");  
  7. CCLabelTTF * myjineng = CCLabelTTF::create(inf,"Marker Felt",40,CCSizeMake(400,400),kCCTextAlignmentLeft);  
  8. myjineng->setAnchorPoint(ccp(0,1));  
  9. myjineng->setColor(ccc3(255,200,0));  
  10. myjineng->setPosition(ccp(50,600));  
  11. kuang->addChild(myjineng);//将标签加入关于框  

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCMenuItemImage *back = CCMenuItemImage::create("backA.png""backB.png",this,menu_selector(GameAboutScene::menuBackCallback));  
  2. back->setScale(0.5);  
  3. back->setPosition(ccp(size.width - 20,size.height - 20));  
  4. back->setEnabled(false);  
  5. CCMenu* mainmenu = CCMenu::create(back,NULL);  
  6. mainmenu->setPosition(ccp(0,0));  
  7. this->addChild(mainmenu,3,4);  

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameAboutScene::menuBackCallback( CCObject* pSender )  
  2. {  
  3.      CCDirector::sharedDirector()->replaceScene(GameMenuScene::scene());  
  4. }  

进入关于页面时的动画

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameAboutScene::onEnter()  
  2. {  
  3.      CCLayer::onEnter();  
  4.       //菜单进入后,菜单项点击有效  
  5.      CCSize size = CCDirector::sharedDirector()->getWinSize();  
  6.      CCNode* mainmenu = this->getChildByTag(4);//返回键  
  7.      mainmenu->setPositionX(-100);  
  8.      mainmenu->runAction(CCSequence::create(CCEaseElasticOut::create(CCMoveBy::create(0.5,ccp(100,0))),CCCallFuncN::create(this, callfuncN_selector(GameAboutScene::menuEnter)),NULL));//终点弹力效果  
  9.      //  
  10.      CCNode* title = this->getChildByTag(3);//关于页面标题  
  11.      title->setPositionY(size.height+20);  
  12.      title->runAction(CCEaseElasticOut::create(CCMoveBy::create(0.5,ccp(0,-40))));  
  13.   
  14.      CCNode*bgstar = this->getChildByTag(1);  
  15.      bgstar->setPositionX(size.width/3 * 2);  
  16.      bgstar->runAction(CCMoveBy::create(0.5,ccp(-size.width/3,0)));  
  17.   
  18.      CCNode*kuang = this->getChildByTag(2);//关于框  
  19.      kuang->setPositionX(-200);  
  20.      kuang->runAction(CCEaseElasticOut::create(CCMoveTo::create(0.5,ccp(size.width/2,size.height/2))));  
  21. }  

 

 

进入主页面

代码:

初始化游戏主页面

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_bg1 = CCSprite::create("bg.png");  
  2. m_bg1->setScale(0.5);  
  3. m_bg2 = CCSprite::create("bg.png");  
  4. m_bg2->setScale(0.5);  
  5. m_bg1->setAnchorPoint(ccp(0,0));//设置锚点  
  6. m_bg2->setAnchorPoint(ccp(0,0));  
  7. m_bg1->setPosition( ccp(0,0) );  
  8. m_bg2->setPosition( ccp(0,size.height) );  
  9. this->addChild(m_bg1, 0);  
  10. this->addChild(m_bg2, 0);  

创建主角及出场动画

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_hero = new GameObjHero();  
  2. m_hero->setPosition(ccp(size.width/2,-50));  
  3. m_hero->setScale(0.5);  
  4. this->addChild(m_hero,2,1);  
  5. m_hero->runAction(CCMoveBy::create(0.5,ccp(0,150)));  


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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_enemys = CCArray::createWithCapacity(3);  
  2. for(int i = 0;i < 3;i ++)  
  3. {  
  4.     int type = i + 1;  
  5.     GameObjEnemy* enemy = new GameObjEnemy();  
  6.     enemy->setPosition(ccp(size.width/4 * type,size.height + 50));  
  7.     enemy->setScale(0.5);  
  8.     enemy->setType(type);  
  9.     m_enemys->addObject(enemy);  
  10.     this->addChild(enemy,1);  
  11.     enemy->moveStart();  
  12. }  


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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_blood = 3;  
  2. CCSpriteBatchNode* ui = CCSpriteBatchNode::create("cat.png");  
  3. //CCNode *ui = CCNode::create();  
  4. m_blood1 = CCSprite::createWithTexture(ui->getTexture());  
  5. m_blood1->setPosition(ccp(20,size.height - 20));  
  6. m_blood1->setScale(0.2f);  
  7. ui->addChild(m_blood1);  
  8. m_blood2 = CCSprite::createWithTexture(ui->getTexture());  
  9. m_blood2->setPosition(ccp(50,size.height - 20));  
  10. m_blood2->setScale(0.2f);  
  11. ui->addChild(m_blood2);  
  12. m_blood3 = CCSprite::createWithTexture(ui->getTexture());  
  13. m_blood3->setPosition(ccp(80,size.height - 20));  
  14. m_blood3->setScale(0.2f);  
  15. ui->addChild(m_blood3);  
  16. addChild(ui,4);  

初始化主角子弹

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_heroBullets = CCArray::createWithCapacity(5);  
  2. for(size_t i = 0;i < m_heroBullets->capacity();i ++)  
  3. {  
  4.     GameHeroBullet * mybullet = new GameHeroBullet();  
  5.     mybullet->setIsNotVisable(this);  
  6.     mybullet->setScale(0.5);  
  7.     m_heroBullets->addObject(mybullet);  
  8.     this->addChild(mybullet,3);  
  9. }  
  10. m_heroBullets->retain();//计数器+1  

初始化敌人子弹

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_enemyBullets = CCArray::createWithCapacity(10);  
  2. for(size_t i = 0;i < m_enemyBullets->capacity();i ++)  
  3. {  
  4.     GameEnemyBullet * mybullet = new GameEnemyBullet();  
  5.     mybullet->setIsNotVisable(this);//若是没加object参数,会发生运行时调用约定错误,原因未知  
  6.     mybullet->setScale(0.5);  
  7.     m_enemyBullets->addObject(mybullet);  
  8.     this->addChild(mybullet,3);  
  9. }  
  10. m_enemyBullets->retain();  

游戏分数

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_gameMark = new GameMark();  
  2. this->addChild(m_gameMark,4);  


初始化游戏结束语gameover

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_gameOver = CCSprite::create("gameover.png");  
  2. m_gameOver->setAnchorPoint(ccp(0.5,0.5));  
  3. m_gameOver->setPosition(ccp(0,0));  
  4. m_gameOver->setPosition(ccp(size.width/2,size.height/2 + 70));  
  5. m_gameOver->setVisible(false);  
  6. m_gameOver->setScale(0.5);  
  7. this->addChild(m_gameOver,5);  

游戏结束上一步菜单按键

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCMenuItemImage *pCloseItem = CCMenuItemImage::create("back.png","back.png",  
  2.     this,menu_selector(GameMainScene::menuBackCallback) );  
  3. pCloseItem->setPosition( ccp(size.width/2,size.height/2 - 50) );  
  4. pCloseItem->setScale(0.5);  
  5. CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);  
  6. pMenu->setPosition( CCPointZero );  
  7. this->addChild(pMenu,5,25);  
  8. pMenu->setVisible(false);  
  9. pMenu->setEnabled(false);  
  10. m_isReduce = false;  
  11. m_isGameOver = false;  
  12.   
  13. scheduleUpdate();  



主角及主角子弹

代码:

主角接收触摸

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCDirector* pDirector = CCDirector::sharedDirector();  
  2. pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);  


主角身体动画

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCAnimation* animation = CCAnimation::create();  
  2. animation->addSpriteFrameWithFileName("catBody1.png");  
  3. animation->addSpriteFrameWithFileName("catBody2-4.png");  
  4. animation->addSpriteFrameWithFileName("catBody3.png");  
  5. animation->addSpriteFrameWithFileName("catBody2-4.png");  
  6. animation->setDelayPerUnit(0.1f);  
  7. animation->setRestoreOriginalFrame(true);  
  8. mainsprite->runAction(CCRepeatForever::create(CCAnimate::create(animation)));  
  9. this->addChild(mainsprite);  

主角尾巴摇摆动画

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCSprite *tail = CCSprite::create("catTail.png");  
  2.     tail->setAnchorPoint(ccp(0.5,1));  
  3.     tail->setPosition(ccp(-5,-29));  
  4. tail->setScale(0.5);  
  5. tail->setRotation(20);  
  6. tail->runAction(CCRepeatForever::create((CCActionInterval*)CCSequence::create(CCRotateBy::create(0.5,-40),CCRotateBy::create(0.5,40),NULL)));  
  7. this->addChild(tail);  

主角手动画

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. m_leftHand = CCSprite::create("catHand1.png");  
  2. m_leftHand->setAnchorPoint(ccp(1,0.5));  
  3. m_leftHand->setPosition(ccp(-18,-20));  
  4. this->addChild(m_leftHand);  
  5. m_rightHand = CCSprite::create("catHand2.png");  
  6. m_rightHand->setPosition(ccp(18,-20));  
  7. m_rightHand->setAnchorPoint(ccp(0,0.5));  
  8. this->addChild(m_rightHand);  
  9. m_offset = ccp(0,0);  
  10. m_isControl = false;  

主角定时发射子弹

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. schedule(schedule_selector(GameObjHero::releasebullet), 0.8f);  
  2. void GameObjHero::releasebullet( float dt )  
  3. {  
  4.     if(m_isControl)//是否触摸了主角,触摸了则发射子弹  
  5.     {  
  6.         CCPoint pos = this->getPosition(); //获取主角坐标  
  7.         GameMainScene *p = (GameMainScene*) this->getParent();//获取父场景调用releaseHeroBullet发射子弹  
  8.         p->releaseHeroBullet(pos.x,pos.y + 30);  
  9.     }  
  10. }  
  11. void GameMainScene::releaseHeroBullet( int x,int y )//参数主角坐标  
  12. {  
  13.     for(size_t i = 0;i < m_heroBullets->capacity();i++)//遍历主角每个子弹  
  14.     {  
  15.         if(!((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->getIsvisble())  
  16.         {  
  17.             //设置位置,并设置为显示  
  18.             ((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->setPosition(ccp(x,y));//子弹起始位置  
  19.             ((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->setIsVisable();//子弹移动动画  
  20.             break;   
  21.         }  
  22.     }  
  23. }  
  24. void GameHeroBullet::setIsVisable()  
  25. {  
  26.     this->setVisible(true);  
  27.     m_isVisable = true;  
  28.     int a = (-this->getPosition().y + 550)/150;  
  29.     this->runAction(CCSequence::create(CCMoveTo::create((-this->getPosition().y + 550)/150,ccp(this->getPosition().x,550)),CCCallFuncN::create(this, callfuncN_selector(GameHeroBullet::setIsNotVisable)),NULL));;  
  30. }  
  31. void GameHeroBullet::setIsNotVisable(CCNode* pSender)  
  32. {  
  33.     this->setVisible(false);  
  34.     m_isVisable = false;  
  35.     this->stopAllActions();  
  36. }  


ccTouchBegan中判断是否点中主角

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if(! containsTouchLocation(touch))//没选中主角  
  2. {  
  3.     return false;   
  4. }  
  5. else//选中了  
  6. {  
  7.     m_isControl = true;//发射子弹  
  8.     //获取触摸偏移  
  9.     CCPoint touchPoint = touch->getLocationInView();  
  10.     touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);  
  11.     m_offset.x = touchPoint.x - this->getPosition().x;  
  12.     m_offset.y = touchPoint.y - this->getPosition().y;  
  13. }  
  14. //选中的点是否在精灵矩形范围内      
  15. bool GameObjHero::containsTouchLocation(CCTouch* touch)  
  16. {  
  17.     return rect().containsPoint(convertTouchToNodeSpaceAR(touch));//  
  18. }  
  19.   
  20. CCRect GameObjHero::rect()  
  21. {  
  22.     CCSize s = CCSizeMake(85,90);  
  23.     CCPoint p = ccp(-s.width / 2, -s.height / 2);  
  24.     return CCRectMake(-s.width / 2, -s.height / 2, s.width, s.height);  
  25. }  


敌人及敌人子弹

代码:

创建敌人

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. this->setContentSize(CCSizeMake(99,115));  
  2.     m_mainBody = CCSprite::create("DrDog1.png");  
  3.     //敌人自身动画  
  4.     CCAnimation* animation = CCAnimation::create();  
  5.     animation->addSpriteFrameWithFileName("DrDog1.png");  
  6.     animation->addSpriteFrameWithFileName("DrDog2.png");  
  7.     animation->setDelayPerUnit(0.1f);  
  8.     animation->setRestoreOriginalFrame(true);  
  9.     m_mainBody->runAction(CCRepeatForever::create(CCAnimate::create(animation)));  
  10.     this->addChild(m_mainBody);  
  11.     //初始化爆炸,不可见  
  12.     m_boom = CCSprite::create("boom1.png");  
  13.     this->addChild(m_boom);  
  14.     m_boom->setVisible(false);  
  15.     m_isLife = true;  

敌人移动动画

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int type = CCRANDOM_0_1() * 4;//4种随机移动  
  2. //敌人运动轨迹(贝尔曲线)  
  3. ccBezierConfig bezier2;  
  4. bezier2.controlPoint_1 = CCPointMake(this->getPosition().x - 400,330);  
  5. bezier2.controlPoint_2 = CCPointMake(this->getPosition().x + 400,280);  
  6. bezier2.endPosition = CCPointMake(this->getPosition().x,-70);  
  7. CCBezierTo * bezierBy2 = CCBezierTo::create(6, bezier2);  
  8. ccBezierConfig bezier1;  
  9. bezier1.controlPoint_1 = CCPointMake(this->getPosition().x + 400,330);  
  10. bezier1.controlPoint_2 = CCPointMake(this->getPosition().x - 400,280);  
  11. bezier1.endPosition = CCPointMake(this->getPosition().x,-70);  
  12. CCBezierTo * bezierBy1 = CCBezierTo::create(6, bezier1);  
  13. switch(type)  
  14. {  
  15. case 0:  
  16. case 1:  
  17.     this->runAction(CCSequence::create(CCMoveBy::create(6,ccp(0,-600)),CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::reStart)),NULL));  
  18.     break;  
  19. case 2:  
  20.     this->runAction(CCSequence::create(bezierBy2,CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::reStart)),NULL));  
  21.     break;  
  22. case 3:  
  23.     this->runAction(CCSequence::create(bezierBy1,CCCallFuncN::create(this, callfuncN_selector(GameObjEnemy::reStart)),NULL));  
  24.     break;  
  25. }  
  26. schedule(schedule_selector(GameObjEnemy::releaseBullet), 1.2f);  

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameObjEnemy::reStart( CCNode* pSender )  
  2. {  
  3.     m_mainBody->setVisible(true);  
  4.     m_boom->setVisible(false);  
  5.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  6.     this->setPosition(ccp(size.width/4 * m_type,size.height + 50));  
  7.     m_isLife = true;  
  8.     this->moveStart();  
  9. }  

每个敌人发射子弹

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameObjEnemy::releaseBullet( float dt )  
  2. {  
  3.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  4.     CCPoint pos = this->getPosition();//敌人位置  
  5.     if(pos.y > 20 && pos.y < size.height && m_isLife)//敌人出在屏幕上才能发  
  6.     {  
  7.         GameMainScene *p = (GameMainScene *) this->getParent();  
  8.         p->releaseEnemyBullet(pos.x,pos.y - 30);//发射子弹  
  9.     }  
  10. }  
  11. void GameMainScene::releaseEnemyBullet( int x,int y )  
  12. {  
  13.     for(unsigned int i = 0; i<m_enemyBullets->capacity(); i++)//每个敌人的子弹10发  
  14.     {  
  15.         if(!((GameEnemyBullet*)m_enemyBullets->objectAtIndex(i))->getIsvisble())  
  16.         {  
  17.             ((GameEnemyBullet*)m_enemyBullets->objectAtIndex(i))->setPosition(ccp(x,y));  
  18.             ((GameEnemyBullet*)m_enemyBullets->objectAtIndex(i))->setIsVisable();//子弹动画  
  19.             break;   
  20.         }  
  21.     }  
  22. }  
  23. void GameEnemyBullet::setIsVisable()  
  24. {  
  25.     this->setVisible(true);  
  26.     m_isVisable = true;  
  27.     this->runAction(CCRepeatForever::create(CCRotateBy::create(1,360)));  
  28.     this->runAction(CCSequence::create(CCMoveTo::create((this->getPosition().y + 50)/150,ccp(this->getPosition().x,-50)),CCCallFuncN::create(this, callfuncN_selector(GameEnemyBullet::setIsNotVisable)),NULL));;  
  29. }  
  30.   
  31. void GameEnemyBullet::setIsNotVisable(CCNode* pSender)  
  32. {  
  33.     this->setVisible(false);  
  34.     m_isVisable = false;  
  35.     this->stopAllActions();  
  36. }  



 

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

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 游戏背景动画至上往下移动,当第1张图滑过底部时,第2张图连接上,每次移动2  
  2.     m_bg1->setPosition(ccp(m_bg1->getPosition().x,m_bg1->getPosition().y - 2));  
  3.     m_bg2->setPosition(ccp(m_bg2->getPosition().x,m_bg2->getPosition().y - 2));  
  4.     if(m_bg2->getPosition().y <= 0)  
  5.     {  
  6.         float temp = m_bg2->getPosition().y + 480;  
  7.         m_bg1->setPosition(ccp(m_bg2->getPosition().x,temp));  
  8.     }  
  9.     if(m_bg1->getPosition().y <= 0)  
  10.     {  
  11.         float temp = m_bg1->getPosition().y + 480;  
  12.         m_bg2->setPosition(ccp(m_bg1->getPosition().x,temp));  
  13.     }  


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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CCPoint hpos = m_hero->getPosition();//主角坐标  
  2.     for(size_t i = 0;i < m_enemys->capacity();i ++)//遍历敌人  
  3.     {  
  4.         GameObjEnemy * enemy = ((GameObjEnemy *) m_enemys->objectAtIndex(i));//单个敌人  
  5.         CCPoint epos = enemy->getPosition();  
  6.         if(enemy->m_isLife)//子弹击中敌人  
  7.         {  
  8.             for(size_t i = 0;i < m_heroBullets->capacity();i ++)//主角子弹  
  9.             {  
  10.                 if(((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->getIsvisble())  
  11.                 {  
  12.                     if(isHit(((GameHeroBullet *)m_heroBullets->objectAtIndex(i))->getPosition(),epos,5,13,21,28))//主角子弹打中敌人碰撞检测  
  13.                     {  
  14.                         enemy->setDie();//敌人消失,有爆炸动画  
  15.                         m_gameMark->addNumber(200);//加分  
  16.                         break;  
  17.                     }  
  18.                 }  
  19.             }  
  20.         }  
  21.         //敌人和主角碰撞  
  22.         if(!m_isReduce && enemy->m_isLife && isHit(hpos,epos,21,22.5,21,28))  
  23.         {  
  24.             enemy->setDie();  
  25.             setHeroHurt();//主角掉命  
  26.         }  
  27.     }  


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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if(!m_isReduce)  
  2. {  
  3.     for(size_t i = 0;i < m_enemyBullets->capacity();i ++)//敌人的子弹10发  
  4.     {  
  5.         if(isHit(hpos,((GameEnemyBullet *)m_enemyBullets->objectAtIndex(i))->getPosition(),21,22.5,5,13))  
  6.         {  
  7.             setHeroHurt();//主角掉命  
  8.         }  
  9.     }  
  10. }  

判断两个矩形是否碰撞

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. bool GameMainScene::isHit( CCPoint p1,CCPoint p2,int w1,int h1,int w2,int h2 )  
  2. {  
  3.     if(abs(p1.x - p2.x) < w1 + w2 && abs(p1.y - p2.y) < h1 + h2)  
  4.     {  
  5.         return true;  
  6.     }  
  7.     return false;  
  8. }  

主角掉命

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameMainScene::setHeroHurt()  
  2. {  
  3.     m_hero->stopAllActions();  
  4.     switch(m_blood)//初始3  
  5.     {  
  6.     case 3:  
  7.         m_blood1->setVisible(false);//命图标不可见  
  8.         m_blood --;  
  9.         break;  
  10.     case 2:  
  11.         m_blood2->setVisible(false);  
  12.         m_blood --;  
  13.         break;  
  14.     case 1:  
  15.         m_blood3->setVisible(false);  
  16.         m_blood --;  
  17.         break;  
  18.     case 0:  
  19.         if(! m_isGameOver)  
  20.         {  
  21.             m_isGameOver = true;  
  22.             setGameOver();//3条命用完,游戏结束  
  23.         }  
  24.         break;  
  25.     }  
  26.     CCActionInterval*  action = CCBlink::create(5, 10);//3秒内闪烁6次  
  27.     m_hero->runAction(action);  
  28.     scheduleOnce(schedule_selector(GameMainScene::resetReduce), 5.0f);//5秒后执行一次  
  29.     m_isReduce = true;//5秒不受伤害  
  30. }  
  31. void GameMainScene::resetReduce( float dt )  
  32. {  
  33.     m_isReduce = false;//重新能收到伤害  
  34. }  


敌人消失后爆炸

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void GameObjEnemy::setDie()  
  2. {  
  3.     //敌人消失  
  4.     m_isLife = false;  
  5.     m_mainBody->setVisible(false);  
  6.     m_boom->setVisible(true);  
  7.     this->stopAllActions();  
  8.     //爆炸动画  
  9.     CCAnimation* boomAnimation = CCAnimation::create();  
  10.     boomAnimation->addSpriteFrameWithFileName("boom1.png");  
  11.     boomAnimation->addSpriteFrameWithFileName("boom2.png");  
  12.     boomAnimation->addSpriteFrameWithFileName("boom3.png");  
  13.     boomAnimation->addSpriteFrameWithFileName("boom4.png");  
  14.     boomAnimation->addSpriteFrameWithFileName("boom5.png");  
  15.     boomAnimation->setDelayPerUnit(0.1f);  
  16.     boomAnimation->setRestoreOriginalFrame(true);  
  17.     m_boom->runAction(CCSequence::create(CCAnimate::create(boomAnimation),CCCallFuncN::create(this,   
  18.       callfuncN_selector(GameObjEnemy::reStart)),NULL));  
  19. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值