仿《雷霆战机美高梅4688.com》飞行射鼓掌游开发–能源预加载

品类首页:https://www.oschina.net/p/raiden

骨骼动画

骨骼动画也是近似的加载方法,先选拔addArmatureFileInfoAsync()函数加载骨骼动画的图纸、合图音信(plist文件)、动画消息(ExportJson文件),然后回调函数asynLoadingArmatureDone()。

 1     std::vector<std::string> m_armatureArray;
 2     m_armatureArray.push_back("Anim/Anim_Plane_01");
 3     m_armatureArray.push_back("Anim/Anim_Plane_02");
 4     m_armatureArray.push_back("Anim/Anim_Plane_03");
 5 
 6 void Preload::asynLoadingArmature()
 7 {
 8     auto p = m_armatureArray[m_iArmatureCnt];
 9     DEBUG_LOG("Preload::asynLoadingArmature: %s", p.c_str());
10     ArmatureDataManager::getInstance()->addArmatureFileInfoAsync(
11         std::string(p).append("0.png"),
12         std::string(p).append("0.plist"),
13         std::string(p).append(".ExportJson"),
14         this,
15         CC_SCHEDULE_SELECTOR(Preload::asynLoadingArmatureDone));
16 }
17 
18 void Preload::asynLoadingArmatureDone(float dt)
19 {
20     this->notifyProgress(++m_iTmpProgress);
21 
22     m_iArmatureCnt++;
23     if (m_armatureArray.size() == m_iArmatureCnt)
24     {
25         m_bArmatureLoaded = true;
26         this->loadingDone(PreloadType::Armature);
27     }
28     else
29     {
30         asynLoadingArmature();
31     }
32 }

Win32

双击proj.win32\Raiden.sln,系统即会用VS二零一一开辟全部项目(如下图),点击工具栏中“本地Windows调节和测试器”,将展开编写翻译,经过漫长的等候后,游戏会自动运营运作。

 美高梅4688.com 1

加载方法

游玩介绍

   
本游戏是一款应用cocos2d-x支出的纵版飞行射击单机游戏,开发语言是C++。玩家能够操纵一架飞机与敌机实行对阵,飞机能够发射子弹、导弹甚、激光,除此之外,玩家仍是能够对协调的飞行器实行深化改造,进步基础属性。当玩家形成钦赐的天职后,仍是可以够博得各系列型的道具奖励。游戏操作简单,上手简单,画面逼真炫酷,并有各个道具可供使用。

本游戏扶助二种游戏形式:闯关形式、无尽形式、迅速方式。

  • 闯关情势

  那是一种最常见的玩法,即游戏给玩家多少个关卡,各种关卡面对的敌人不一样,职务也不比,随着职分的成功,传说剧情也会稳步呈以后玩家面前。

  • 无尽情势

  所谓无尽即是指那么些格局的游玩永远不会终止,除非玩家的战机被击落。那种方式能提须求玩家一种心旷神怡淋漓的游乐体验,因为在玩耍中玩家不会蒙受其余东西的烦扰,自慰一次性打个够。

  • 急促形式

  此娱乐情势考验的是玩家的反馈能力。在此玩耍形式中,玩家操纵的战机会以较高的速度飞行,同时,周围还有飞鸟、山川、陨石等障碍物,玩家需集中注意力神速的规避那一个障碍物才能顺遂实行游戏。同时,战机的飞行速度也会越来越快,永无尽头。

游玩试玩:http://apk.hiapk.com/appinfo/com.thorqq.RaidenV2.baidu

加载界面

美高梅4688.com 2

 

在此加载界面中,大家使用1个仪表盘和旋转的指针来报告用户眼下的加载进程。那么,后台加载义务与前台的指针转动是何等关联起来的呢?我们采纳了观看者形式。上边上一张百度找出的观看者方式的图:

美高梅4688.com 3
Observer格局的角色:
Subject(被观望者)
    被观望的对象。当要求被考察的场合发生变化时,供给文告队列中装有观望者对象。Subject需求保持(添加,删除,布告)2个观望者对象的行列列表。
ConcreteSubject
    被阅览者的现实贯彻。包涵部分主导的习性状态及其他操作。
Observer(观察者)
    接口或抽象类。当Subject的处境产生变化时,Observer对象将经过一个callback函数得到文告。
ConcreteObserver
    旁观者的实际达成。获得关照后将做到部分有血有肉的事务逻辑处理。

 

在本游戏中完结了一个简化版的观看者格局:

壹 、首先,大家定义一个被观望者抽象类。个中定义了起来、进程、错误、警告、结束等接口。

1 class PreloadListener
2 {
3 public:
4     virtual void onStart() = 0;
5     virtual void onProgress(int percent) = 0;
6     virtual void onError(const char* info) = 0;
7     virtual void onWarning(const char* info) = 0;
8     virtual void onEnd(PreloadError errorCode) = 0;
9 };

二 、定义载入界面场景,继承自PreloadListener,并贯彻onXXX接口。

 1 class LoadingLayer :
 2     public Layer, public PreloadListener
 3 {
 4 public:
 5     static Scene* scene();
 6 
 7     LoadingLayer();
 8     virtual ~LoadingLayer();
 9 
10     virtual bool init();
11     virtual void update(float dt) override;
12 
13     CREATE_FUNC(LoadingLayer);
14 
15     void initUI();
16     void ToMainMenu();
17 
18     virtual void onStart() override;
19     virtual void onProgress(int percent) override;
20     virtual void onError(const char* info) override;
21     virtual void onWarning(const char* info) override;
22     virtual void onEnd(PreloadError errorCode) override;
23 
24 private:
25     Node* m_pRootNode;
26 
27     Sprite* m_pNeedle;
28     ui::LoadingBar* m_pLoadingBar;
29     ui::Text* m_pTxtErrorInfo;
30 
31     long m_iBeginTime;
32     long m_iEndTime;
33 
34     int m_iStart;
35 };

尤其注意一下onProgress接口,那里必要贯彻指针转动的逻辑:

1 void LoadingLayer::onProgress(int percent)
2 {
3     float degree = LoadingLayerConstant::NeedleMinDegree +
4         (LoadingLayerConstant::NeedleMaxDegree - LoadingLayerConstant::NeedleMinDegree) * percent / 100;
5     m_pNeedle->setRotation(degree);
6 }

叁 、在加载职务中添加上报载入进程的函数。这样,每当载入一张图纸或然专断2个财富文件的时候,就能够调用notifyProgress函数以使得界面上的指针转动了。

1 void Preload::notifyProgress(int progress)
2 {
3     //这里的m_pListener其实就是LoadingLayer的实例
4     if (m_pListener)
5     {
6         m_pListener->onProgress((int)(progress * 100.f / m_iAllProgress));
7     }
8 }

 下载源代码

 

转发请注脚:http://www.cnblogs.com/thorqq/p/5639022.html 

下一篇,大家将分析游戏的宗旨:“飞机”

Android

双击make_game.bat即举行编写翻译,当编写翻译完毕后,将应运而生”编写翻译成功”的字样,如下图所示。

 美高梅4688.com 4

终极的揭露包将应运而生在bin\release\android目录中

 美高梅4688.com 5

 转发请评释:http://www.cnblogs.com/thorqq/p/5638397.html

 

下一篇,大家将起来接触该类型工程,并逐年放出源代码

 

场景

现象并从未特殊的异步加载函数,只可以通过CSLoader::createNode()和CSLoader::createTimeline()依照csd文件生成node,然后保留到自定义的map中,以往要选用情形数据时,从map中获取。

瞩目,此加载方法在cocos2dx-3.4中得以健康运营,在3.第88中学会并发错误,原因未知。然则加载单个场景文件的年月非常短,一般并不会影响游戏的心得,所以本游戏的最新版本中并没有预加载场景文件。

 1     std::vector<std::string> m_uiArray;
 2     std::map<std::string, Node*> m_uiMap;
 3 
 4     //菜单
 5     m_uiArray.push_back("Bag.csb");
 6     m_uiArray.push_back("Daily.csb");
 7     m_uiArray.push_back("Instruction.csb");
 8 
 9 void Preload::syncLoadingUI()
10 {
11     //不能在非主线程中调用CSLoader::createNode,否则会导致OpenGL异常
12     for (auto file : m_uiArray)
13     {
14         auto node = Preload::getUI(file);
15         node->retain();
16         m_uiMap.insert(std::map<std::string, Node*>::value_type(file, node));
17 
18         auto timeLine = CSLoader::createTimeline(file);
19         timeLine->retain();
20         m_actionMap.insert(std::map<std::string, cocostudio::timeline::ActionTimeline*>::value_type(file, timeLine));
21 
22         DEBUG_LOG("Preload::syncLoadingUI: %s", file.c_str());
23         this->notifyProgress(++m_iTmpProgress);
24     }
25 
26     m_bUILoaded = true;
27     this->loadingDone(PreloadType::Ui);
28 }
29 
30 Node* Preload::getUI(const std::string& filename)
31 {
32     DEBUG_LOG("Preload::getUI: %s", filename.c_str());
33     return CSLoader::createNode(filename);;
34 
35     //cocos2dx-3.8 不支持以下操作。3.4支持
36     //auto ui = m_uiMap.find(filename);
37     //if (ui != m_uiMap.end())
38     //{
39     //    return ui->second;
40     //}
41     //else
42     //{
43     //    auto csb = CSLoader::createNode(filename);
44     //    csb->retain();
45     //    m_uiMap.insert(std::map<std::string, Node*>::value_type(filename, csb));
46 
47     //    return csb;
48     //}
49 }

编写翻译运行

 

界面突显

玩耍菜单如下图所示:

 美高梅4688.com 6 美高梅4688.com 7

打闹界面如下图所示:

 美高梅4688.com 8 美高梅4688.com 9

长途数据

远程数据一般是透过发送异步http或许其他tcp请求来落实数据的加载,依据互连网协议的不等,相关的接口也各差异,那里不再详述。

转发请申明:http://www.cnblogs.com/thorqq/p/5638397.html

能源的花色

预加载的指标是为了继承读取的高效,所以,一般会预加载这几个较大较复杂的文书,例如以下这几个:

  • 单张大图:背景大图
  • 合成图:可多幅图片合成的大图,这里我们接纳TexturePacker合成plist+png文件
  • 骨骼动画:使用Cocos Skeletal Animation
    艾德itor创制的骨骼动画文件,ExportJson+plist+png文件
  • 场景:使用Cocos Studio创建的csd文件
  • 动静:ogg音乐文件
  • 当地数据:游戏存档数据(格式为json文件)、游戏配置数据(例如关卡、飞机质量、子弹属性等固定的多寡,格式为sqlite数据库文件)
  • 长距离数据:由于本游戏是弱联网游戏,所以保存在服务器上的数额不多。那里唯有完成了用户登录、获取时间的作用

上边,大家将依次介绍分化财富载入的章程。

   
某年某月某日,在好友的“蛊惑”下,自身参与了手游开发阵容,做着月流水100000百万的幻想。由于自家是个上班族,白天要在公司做事,所以游戏支付只好放在午夜和周三。经过了五个月的劳动加班,达成了本游戏的率先个版本的开销,休整了多少个月后,又成本了四个月,实现了第①个版本的支付,也正是及时要介绍的这一个本子。那款游戏是自个儿成立的第壹款游戏,为何用cocos?很简单,因为用他的人多。为啥选取C++?因为本身只会C++和Java。由于并未娱乐开发经历,同时也为了赚快钱(可以吗,尽情的的鄙视本身吧…….),所以选用了单机游戏,玩法、界面都以效仿的同类有名娱乐。本身是一个码农,所以,代码是温馨写的,美术工作是请人做的。最后,美梦破碎,只捞回了一点点廉价的加班费。今后,本身将偏离游戏行业,所以,打算在那边留下一点团结的阅历,为入门者提供一些支援。

地方数据

本土数据包含了:存档数据、游戏配置数据,及其他部分定制化的数目。那里我们得以选择cocos提供的异步任务接口+回调加载结果来拓展预加载。

 1 void Preload::asynLoadingDatabase()
 2 {
 3     auto loadEnd = [this](void*)
 4     {
 5         DEBUG_LOG("asynLoadingDatabase OK");
 6 
 7         m_bOtherLoaded = true;
 8         this->loadingDone(PreloadType::Other);
 9     };
10 
11     AsyncTaskPool::getInstance()->enqueue(AsyncTaskPool::TaskType::TASK_IO, loadEnd, (void*)NULL, [this]()
12     {
13         if (!GlobalData::getInstance()->initialize(this))
14         {
15             CCLOG("Initialize globla data failed");
16             this->notifyError("Initialize globla data failed");
17             return;
18         }
19 
20         m_iTmpProgress += PreloadProgress::GlobalData;
21         this->notifyProgress(m_iTmpProgress);
22 
23         if (!GameData::getInstance()->loadData())
24         {
25             CCLOG("Initialize game data failed");
26             this->notifyError("Initialize game data failed");
27             return;
28         }
29 
30         m_iTmpProgress += PreloadProgress::GameData;
31         this->notifyProgress(m_iTmpProgress);
32 
33         if (!AchievementMgr::getInstance()->init())
34         {
35             CCLOG("Initialize achievement data failed");
36             this->notifyError("Initialize achievement data failed");
37             return;
38         }
39 
40         m_iTmpProgress += PreloadProgress::AchievementMgr;
41         this->notifyProgress(m_iTmpProgress);
42 
43         Sound::preload(this);
44 
45         m_iTmpProgress += PreloadProgress::Sound;
46         this->notifyProgress(m_iTmpProgress);
47     });
48 }

 

单张大图

  1. 定义std::vector<std::string>
    m_imageArray,将必要加载的图形路径放到容器中
  2. 对种种图片每一个调用Director::getInstance()->getTextureCache()->addImageAsync()函数进行加载,注意她的第一个参数CC_CALLBACK_1(Preload::asynLoadingImageDone,
    this,
    m_imageArray[i]),当一张图片加载截至后,系统就会调用Preload::asynLoadingImageDone函数,同时传入图片的不二法门作为输入参数。
  3. 在回调函数asynLoadingImageDone中,首先要公告界面加载进程,然后依照图片的总和和待加载数判断是或不是曾经全副记载完毕,若一切加载成功,则公告loadingDone(PreloadType::Image)

详尽的代码如下所示:

 1     //1、需要加载的png或jpg
 2     m_imageArray.push_back("BigImg/Bag_Bg.png");
 3     m_imageArray.push_back("BigImg/BigScreen_Bg.png");
 4     m_imageArray.push_back("BigImg/Daily_Bg.png");
 5     m_imageArray.push_back("BigImg/MainUI_Bg.jpg");
 6 
 7 
 8 void Preload::asynLoadingImage()
 9 {
10     //2、将图片加入全局cache中
11     m_iImageCnt = m_imageArray.size();
12     for (unsigned i = 0; i < m_imageArray.size(); i++)
13     {
14         Director::getInstance()->getTextureCache()->addImageAsync(
15             m_imageArray[i],
16             CC_CALLBACK_1(Preload::asynLoadingImageDone, this, m_imageArray[i]));
17     }
18 }
19 
20 //3、单张图片加载成功后的回调函数
21 void Preload::asynLoadingImageDone(Texture2D* texture, const std::string& filename)
22 {
23     //通知观察者加载进度
24     this->notifyProgress(++m_iTmpProgress);
25     m_iImageCnt--;
26     //全部加载完成
27     if (0 == m_iImageCnt)
28     {
29         m_bImageLoaded = true;
30         this->loadingDone(PreloadType::Image);
31     }
32 }

 

支付环境设置配置

本游戏在六10人Windows7系统下行使C++支付,因而需安装如下软件(可在http://pan.baidu.com/s/1slTChrR下载)

  • 安装VS2013
  • 安装cocos2d-x
    3.8。注意,假使下载的是3.8.1,请在装置后将引得名3.8.1改为3.8,因为在vs工程中头文件目录写的是3.8。
  • 安装jdk
  • 安装android-sdk
  • 安装android-ndk
  • 下载本项目源代码(源代码尚正在整理中,后续将视意况逐年开源)
  • 开拓Cocos Studio的”偏好设置“,设置jdk、android-sdk和ndk路径

 美高梅4688.com 10

合成图

合成图的加载与单张图片的加载类似,区别之处在于在回调函数中多了一步加载plist文件:

SpriteFrameCache::getInstance()->addSpriteFramesWithFile(file.append(“.plist”),
texture);

 1     //plist图片
 2     std::vector<std::string> m_plistArray;
 3 
 4     //1、需要加载的图片,不包含后缀名
 5     m_plistArray.push_back("Bag");
 6     m_plistArray.push_back("Common");
 7     m_plistArray.push_back("Daily");
 8 
 9 void Preload::asynLoadingPlist()
10 {
11     //2、加载图片文件
12     m_iImagePlistCnt = m_plistArray.size();
13     for (unsigned i = 0; i < m_plistArray.size(); i++)
14     {
15         Director::getInstance()->getTextureCache()->addImageAsync(
16             std::string(m_plistArray[i]).append(".png"),
17             CC_CALLBACK_1(Preload::asynLoadingPlistDone, this, m_plistArray[i]));
18     }
19 }
20 
21 void Preload::asynLoadingPlistDone(Texture2D* texture, const std::string& filename)
22 {
23     this->notifyProgress(++m_iTmpProgress);
24 
25     //3、加载plist文件
26     std::string file = filename;
27     SpriteFrameCache::getInstance()->addSpriteFramesWithFile(file.append(".plist"), texture);
28     m_iImagePlistCnt--;
29 
30     if (0 == m_iImagePlistCnt)
31     {
32         //全部加载完成
33         m_bImagePlistLoaded = true;
34         this->loadingDone(PreloadType::Plist);
35     }
36 }

声音

是因为cocos提供了新老三种音频接口,所以声音文件的预加载也分为二种。

对此老的接口,需区分音乐和音响效果文件,并且函数没有重临值;

对于新的接口,不区分音乐和音响效果文件,通过回调来判断加载的结果。

//老的音频接口
CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic(filename);
CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect(filename);

//新的音频接口
AudioEngine::preload(filename, [filename](bool isSuccess){
    if (!isSuccess)
    {
        DEBUG_LOG("Load fail: %s", path.c_str());
    }
});

   
绝半数以上游乐在开发银行后第②出现的是3个“载入中”的现象,此场景的用途是将游戏所需的图形、音乐、数据等财富从存款和储蓄卡(或磁盘、闪存)读入内部存储器,那样,前面须求用到那一个财富时,能够从来从内部存款和储蓄器读取,以加快游戏的周转,升高流畅性。上边,就对能源的预加运载飞机制做多个介绍。

花色首页:https://www.oschina.net/p/raiden

转发请表明:http://www.cnblogs.com/thorqq/p/5639022.html 

发表评论

电子邮件地址不会被公开。 必填项已用*标注