数据载入框架:

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. XE6 & IOS开发之免证书真机调试(2):连接真机并运行App(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 连接真机前,请先确保真机 ...

  2. rpm命令

    RPM 安装.卸载.升级.查询和验证. RPM 安装 命令: rpm -i 文件名 如: rpm -i example.rpm 安装 example.rpm 包: rpm -iv example.rp ...

  3. [python实现设计模式]-3.简单工厂模式-触宝开放平台

    预备知识: 开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open ...

  4. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  5. 对restful的理解

    最近在学习web api,从而涉及到了restful风格,我的理解是restful风格,每个链接都会对资源进行相应的操作(CRUD),如果一个链接不包含资源,则可能不符合restful风格,借此想请教 ...

  6. KindEditor 编辑器使用方法

    http://kindeditor.net/docs/usage.html 编辑器使用方法 1. 下载编辑器 下载 KindEditor 最新版本,下载之后打开 examples/index.html ...

  7. 许小年:宁可踏空,不可断粮<转>

    http://www.daonong.com/g/25/xsqy/2014/0716/51074.html 文│许小年 中欧国际工商学院教授 为什么我们企业的创新能力长期处于低水平呢? 深入观察,内心 ...

  8. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  9. 《Unix/Linux网络日志分析与流量监控》获2015年度最受读者喜爱的IT图书奖

    <Unix/Linux网络日志分析与流量监控>获2015年度最受读者喜爱的IT图书奖.刊登在<中华读书报>( 2015年01月28日 19 版) 我的2015年新作刊登在< ...

  10. java面试题个人总结

    1.重载和重写的区别重写:发生在父子类中,方法名.参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类:如果父类方法访问修饰符为private则子类中就不是重写.2.j ...