数据载入框架:

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. the import javax.servlet

    问题: 在eclipse中编写servlet时出现“the import javax.servlet unresolved” 问题原因: 缺少servlet-api.jar架包. 问题解决办法: 在e ...

  2. javascript属性标签

  3. Unreal Engine 4 一些小技巧或提示

    怎样获取当前地图的名字 在任意Actor类里,GetWorld()->GetName()就可以获得当前地图的名字

  4. StackPanel在增加控件的问题

    今天遇到这样一个问题,就是我做了一个自定义控件.然后加到StackPanel中, <StackPanel Height="676" HorizontalAlignment=& ...

  5. zookeeper分布式部署-mac先测试

    由于平台马上要引入zookeeper+dubbo,为了解决zookeeper单个实例运行的风险,需要做个集群. 1,先说配置:zoo.cfg十分简单,分两种情况: 一种是在一台机器采用不同的端口配置多 ...

  6. tiny中文乱码问题,不过仅适用于windows,所以xml不可以出现中文

    我是在SetAttribute() 函数之前使用的 SetAttribute(const char* name,const char * _value) 首先得到了一个CString 类型的变量 st ...

  7. django 项目的文件说明

    参见官方教程的mysite项目 mysite--- manage.py db.sqlite3 #数据库文件 mysite--- #项目文件夹 __init__.py settings.py urls. ...

  8. This kind of launch is configured to open the Debug perspective when it suspends.

    This kind of launch is configured to open the Debug perspective when it suspends. 因为设置了断点才会弹出这个,不需要调 ...

  9. hyper-v虚拟化管理

    一.  什么是Hyper-V? —    Hyper-V是微软的一款虚拟化产品,是微软第一个采用类似Vmware和Citrix开源Xen一样的基于hypervisor的技术. —    Hyper-V ...

  10. Pycharm注册码

    name : newasp===== LICENSE BEGIN =====09086-1204201000001EBwqd8wkmP2FM34Z05iXch1AkKI0bAod8jkIffywp2W ...