豪华版飞机大战系列(六)--附源代码
生活随笔
收集整理的這篇文章主要介紹了
豪华版飞机大战系列(六)--附源代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最后一篇講一下游戲中的主要邏輯推斷,在上面的工作都做充分準備后,游戲主要邏輯將變得特別清晰,接下來你會看到全部的邏輯都是那么的清晰自然,由于前面已經做好了充分的準備工作,這里僅僅是整合了前面的工作,略微增加了一些游戲推斷元素。
同一時候源代碼會在文章最后給出鏈接地址,源代碼托管在github上,全部的東西都是開源免費的,在如今的大環境下。開源才是王道,分享才干雙贏,我始終認為這是對的。你有一種思想我有一種思想,交流分享后我們都有了兩種思想,何樂而不為呢。
好了,回歸正題。游戲主要推斷邏輯都在GameScene場景中,當中包含了GameLayer層。在層中進行游戲的邏輯推斷。
來看一下GameScene.h的內容:
#include "cocos2d.h" #include "PlaneLayer.h" #include "BulletSprite.h" #include "EnemyLayer.h"USING_NS_CC;class GameLayer: public cocos2d::Layer { public://創建GameLayer層所屬的場景static cocos2d::Scene* createScene();virtual bool init();//在onEnter運行完畢之后調用此函數virtual void onEnterTransitionDidFinish();CREATE_FUNC(GameLayer);public://依據每幀來更新游戲void gameUpdate(float dt);//子彈碰撞檢測bool bulletCollisionEnemy(Sprite* pBullet);//飛機碰撞檢測bool enemyCollisionPlane();//menu回調函數void menuCloseCallback(cocos2d::Ref* pSender); public:PlaneLayer *planeLayer;//飛機層BulletSprite *bulletSprite;//子彈層EnemyLayer *enemyLayer;//敵機層int getRand(int start, int end);//獲取從start到end的隨機數 };
不做太多解釋,直接看各個函數的詳細實現,GameScene.cpp#include "GameScene.h"/*** 創建場景,并加入GameLayer層*/ cocos2d::Scene* GameLayer::createScene() {auto scene = Scene::create();auto layer = GameLayer::create();scene->addChild(layer);return scene; }bool GameLayer::init() {if (!Layer::init()) {return false;}this->setTouchEnabled(true);//設置層中可觸摸點擊Size winSize = Director::getInstance()->getWinSize();/*** 隨即載入背景圖片,*/char buff[15];int id = getRand(1, 5);//返回1~5之間的隨機數sprintf(buff, "img_bg_%d.jpg", id);auto over = Sprite::create(buff);over->setPosition(Point(winSize.width / 2, winSize.height / 2));this->addChild(over);return true; } /*** 返回從start到end的隨機整數*/ int GameLayer::getRand(int start, int end) {struct timeval tv;gettimeofday(&tv, NULL);unsigned long int rand_seed = tv.tv_sec * 1000 + tv.tv_usec / 1000;//隨機數種子srand(rand_seed);float i = CCRANDOM_0_1() * (end - start + 1) + start;return (int) i; } /*** 在onEnter函數之后調用* 功能:創建飛機、子彈、敵機并加入到層中*/ void GameLayer::onEnterTransitionDidFinish() {planeLayer = PlaneLayer::create();this->addChild(planeLayer);bulletSprite = BulletSprite::create();this->addChild(bulletSprite);enemyLayer = EnemyLayer::create();this->addChild(enemyLayer);//設置每幀時都調用gameUpdate函數this->schedule(schedule_selector(GameLayer::gameUpdate));//加入menu,并設置回調函數Size visibleSize = Director::getInstance()->getVisibleSize();Point origin = Director::getInstance()->getVisibleOrigin();auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(GameLayer::menuCloseCallback, this));closeItem->setPosition(Point(origin.x + visibleSize.width- closeItem->getContentSize().width / 2,origin.y + closeItem->getContentSize().height / 2));auto menu = Menu::create(closeItem, NULL);menu->setPosition(Point::ZERO);this->addChild(menu, 1); } /*** menu的回調函數*/ void GameLayer::menuCloseCallback(Ref* pSender) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");return; #endifDirector::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)exit(0); #endif }/*** 子彈和敵機碰撞檢測函數*/ bool GameLayer::bulletCollisionEnemy(Sprite* pBullet) {//遍歷場景中的全部敵機,看子彈是否和敵機的包裝矩形有重疊for (auto& eEnemy : enemyLayer->vecEnemy) {EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;//推斷矩形是否有重疊if (pBullet->boundingBox().intersectsRect(pEnemySprite->getBoundingBox())) {if (1 == pEnemySprite->getLife()) {pEnemySprite->loseLife();enemyLayer->blowupEnemy(pEnemySprite);} else {pEnemySprite->loseLife();}//有重疊則移除子彈bulletSprite->removeBullet(pBullet);return true;}}return false; }/*** 在每幀時都進行游戲邏輯檢測,* 檢測子彈和敵機是否有碰撞* 檢測主角飛機和敵機是否有碰撞*/ void GameLayer::gameUpdate(float dt) {bool bMoveButt = false;for (auto& eButtle : bulletSprite->vecBullet) {Sprite* pBullet = (Sprite*) eButtle;bMoveButt = bulletCollisionEnemy(pBullet);if (bMoveButt) {return;}}enemyCollisionPlane(); } /*** 敵機和主角飛機是否有碰撞* 遍歷全部敵機進行檢測*/ bool GameLayer::enemyCollisionPlane() {Sprite* pPlane = (Sprite*) planeLayer->getChildByTag(AIRPLANE);for (auto& eEnemy : enemyLayer->vecEnemy) {EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;if (pPlane->boundingBox().intersectsRect(pEnemySprite->getBoundingBox())&& pEnemySprite->getLife() > 0) {//TODO,DO WHAT YOU WANT // this->unscheduleAllSelectors(); // this->bulletLayer->StopBulletShoot(); // this->planeLayer->blowUp();return true;}}return false; } 在各個關鍵的地方都有詳細凝視,了解引擎的都應該能夠看明確的。有詳細問題的能夠留言。
最后附上源代碼的下載鏈接。托管在github上,本人最煩的就是下載個東西還TM的須要積分,比方CSDN上的資源,你分享就分享吧,還得給你個積分來下載,要不你就別上傳,既然開源,就不要想為自己謀多少利,可能又要被噴,可是我始終堅信開源才是王道,不喜務噴。
點擊打開鏈接
轉載于:https://www.cnblogs.com/yxwkf/p/5087684.html
總結
以上是生活随笔為你收集整理的豪华版飞机大战系列(六)--附源代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#window服务程序
- 下一篇: Linux下安装Tomcat7