数据载入框架:

void GameData::BeginLoad(const char * const *argv)为数据载入的最上层method,其主要框架为:

    1. void Files::Init(const char * const *argv)获取数据储存目录,包括images、data、sounds、plugins和存档,其中images、data、sounds为程序目录下的,不包含plugins内的;
    2. void GameData::LoadSources()获取plugins目录下的插件目录,插件目录下可包含images、data和sounds三个目录;
    3. void GameData::LoadImages(map<string, string> &images)载入图像,key为文件名,value为文件全路径,文件名唯一,plugins下的会覆盖默认的,land是飞船登录星球时显示的图片,添加到std::multimap<const Sprite *, pair<string, string>>,其他的载入到SpriteQueue(吐槽下New China的图片,那雾霾啊);
    4. 循环调用void GameData::LoadFile(const string &path, bool debugMode)载入data目录下的txt,data是按node和token方式存储的,包含层次关系,至此所有星球系统载入完毕;
    5. 循环调用void System::UpdateNeighbors(const Set<System> &systems)确定系统间的相邻关系,飞船有两种跨系统运动方式,Hyperdrive和 Jump Drive,Hyperdrive需要系统间有link存在,这个在游戏中是一条线,Jump Drive不用管link,不过有某种限制,但是实际游戏中Jump Drive除了去没有link的系统有用,其他时候并不见得比Hyperdrive快,反而燃料消耗很大,具体待查;
    6. 循环调用void Ship::FinishLoading()载入飞船,飞船由两部分组成——船体和装备,装备包括武器、引擎、系统、能源和其他小东西;
    7. 载入NPC的飞船,这个飞船和人物是一一对应的,且NPC不重复,会在游戏中随机出现;
    8. 保存当前状态,重置政治关系。

音频载入框架:

void Audio::Init(const vector<string> &sources)为载入音频的最上层method,const vector<string> &GameData::Sources()获取所有资源的目录(包含images、data、sounds的目录),主要框架为:

  1. 初始化音频设备,朝向设置会影响确定左右;
  2. 获取当前线程ID;
  3. 循环获取所有音频文件,存入std::vector<string>;
  4. 创建载入线程,储存音频名到std::set<string>,音频名去掉了后缀和路径以及循环播放符号,载入音频到std::map<string, Sound>,key为音频名,value为音频对象, void Sound::Load(const string &path)将音频存入buffer。

存档载入框架:

包括玩家游戏中的数据和个人设置,储存在配置文件夹内(包含有plugins和saves文件夹),主要包括:

    1. void PlayerInfo::LoadRecent()载入最近存档,在配置文件夹内有一个recent.txt(载入数据的时候没有会新建)用来记录最近存档位置,然后调用void PlayerInfo::Load(const string &path)载入该存档;
    2. void PlayerInfo::ApplyChanges()将存档内容载入到游戏中;
    3. void Preferences::Load()载入个人设置,上面这些都需要解释txt文件。

Shader载入框架:

  Void GameData::LoadShaders()载入shaders,实际还包括了字体和键盘功能映射。Shader主要包括Fill、Fog、Line、Outline、Point、Ring、Sprite六种。最后载入星空背景,主要为一个黑色图片加随机分布的亮点,分布并不均匀,周期为4096个像素。

UI初始化框架:

  UI分为menuPanels(游戏登录)和gamePanels(游戏中),均由panel按stack方式储存,是作为管理类来管理panel的显示和事件处理。void UI::Push(Panel *panel)将panel加入std::vector<std::shared_ptr<Panel>>,这里首先建立登录界面,包含credits和玩家基本资料,加入的panel为MenuPanel,包含有指向player和gamePanels的指针,credits在主目录下的txt中,会滚动显示在左边的panel里,按行存入std::vector<std::string> 中。

Endless Sky源码学习笔记-2的更多相关文章

  1. Endless Sky源码学习笔记-1

    难得遇到一个比较有趣的开源游戏,又是比较偏爱的太空背景,所以打算学习下源码. Endless Sky的作者是Michael Zahniser,是一个2D太空游戏.整个程序比较简洁明了,数据没有打包,游 ...

  2. Endless Sky源码学习笔记-5

    游戏启动后的UI划分为三个区域,左侧滚动显示credits等信息以及偏好设置和退出按钮,中间显示载入动画,右侧显示玩家信息以及载入存档按钮,调用void MenuPanel::Draw()实现.首先画 ...

  3. Endless Sky源码学习笔记-4

    事件处理: 事件包括:debug模式切换.切换到登陆窗口.退出.窗口大小变化.全屏切换和游戏中的鼠标键盘输入.处理方式分为两类,前几个为简单的if处理,最后一个涉及到游戏中的控制和交互,且事件由每一个 ...

  4. Endless Sky源码学习笔记-3

    文本解析: 将txt存入DataFile,DataFile包含DataNode,每个DataNode是txt中的一行,每个DataNode包含若干token(std::vector<string ...

  5. Underscore.js 源码学习笔记(下)

    上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...

  6. Underscore.js 源码学习笔记(上)

    版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}());  这样的东西,我们应该知道这是一个 IIFE(立即执行 ...

  7. AXI_LITE源码学习笔记

    AXI_LITE源码学习笔记 1. axi_awready信号的产生 准备接收写地址信号 // Implement axi_awready generation // axi_awready is a ...

  8. Hadoop源码学习笔记(6)——从ls命令一路解剖

    Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...

  9. Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构

    Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步 ...

随机推荐

  1. 对想进入Unity开发新人的一些建议

    提前声明:本文只是写给那些非职业游戏开发人士,只面向那些在校本科生,或已就业但无unity背景的同学们,当然是面对程序员方向的.本人刚工作也没多久,资历尚浅,之前在网上有一位同学让我谈谈一些想法,所以 ...

  2. HttpContextBase转换成HttpContext对象

    有以下方法: 主要是方式就是通过context获取HttpApplication,然后通过Application获取相应的HttpContext ①HttpContext context=HttpCo ...

  3. sql里面的分页

    SELECT TOP 5 * FROM hos_house WHERE HMID NOT IN( SELECT TOP 5 HMID FROM hos_house WHERE PRICE>250 ...

  4. python download

    今天下载 python3 , 从官网下 速度 平均 十几K,网上 搜了下.提供的下载地址 几乎都是 官网的. 于是 下了个 百度同步盘,做 公开分享. 提供给 大家下载,速度 有 300 多K,提高了 ...

  5. STL set使用例子

    #include<iostream>#include<set>using namespace std; #include<stdlib.h> #define ran ...

  6. Silverlight 页面传值问题(转)

    共有两种方式来传递初始化参数 1)在html或者aspx页面中object对象中加入一下代码 参数格式:参数名 = 值,参数名 = 值,... <param name="initPar ...

  7. iOS开发-- RunLoop的基本概念与例子分析

    看了一下,上一篇貌似5个月前的

  8. C# 访问MongoDB 通用方法类

    using MongoDB.Driver; using System; namespace MongoDBDemo { public class MongoDb { public MongoDb(st ...

  9. 加载AssetBundle方法

    先介绍一种常用的加载AssetBundle方法 using UnityEngine; using System.Collections; using System.IO; public class L ...

  10. php 判断文件/目录是否存的方法

    涉及函数 is_file(), is_dir() , file_exists() is_file() 判断文件是否存在 is_dir() 判断目录是否存在 file_exists() 既可用于判断文件 ...