Endless Sky源码学习笔记-2
数据载入框架:
void GameData::BeginLoad(const char * const *argv)为数据载入的最上层method,其主要框架为:
- void Files::Init(const char * const *argv)获取数据储存目录,包括images、data、sounds、plugins和存档,其中images、data、sounds为程序目录下的,不包含plugins内的;
- void GameData::LoadSources()获取plugins目录下的插件目录,插件目录下可包含images、data和sounds三个目录;
- void GameData::LoadImages(map<string, string> &images)载入图像,key为文件名,value为文件全路径,文件名唯一,plugins下的会覆盖默认的,land是飞船登录星球时显示的图片,添加到std::multimap<const Sprite *, pair<string, string>>,其他的载入到SpriteQueue(吐槽下New China的图片,那雾霾啊);
- 循环调用void GameData::LoadFile(const string &path, bool debugMode)载入data目录下的txt,data是按node和token方式存储的,包含层次关系,至此所有星球系统载入完毕;
- 循环调用void System::UpdateNeighbors(const Set<System> &systems)确定系统间的相邻关系,飞船有两种跨系统运动方式,Hyperdrive和 Jump Drive,Hyperdrive需要系统间有link存在,这个在游戏中是一条线,Jump Drive不用管link,不过有某种限制,但是实际游戏中Jump Drive除了去没有link的系统有用,其他时候并不见得比Hyperdrive快,反而燃料消耗很大,具体待查;
- 循环调用void Ship::FinishLoading()载入飞船,飞船由两部分组成——船体和装备,装备包括武器、引擎、系统、能源和其他小东西;
- 载入NPC的飞船,这个飞船和人物是一一对应的,且NPC不重复,会在游戏中随机出现;
- 保存当前状态,重置政治关系。
音频载入框架:
void Audio::Init(const vector<string> &sources)为载入音频的最上层method,const vector<string> &GameData::Sources()获取所有资源的目录(包含images、data、sounds的目录),主要框架为:
- 初始化音频设备,朝向设置会影响确定左右;
- 获取当前线程ID;
- 循环获取所有音频文件,存入std::vector<string>;
- 创建载入线程,储存音频名到std::set<string>,音频名去掉了后缀和路径以及循环播放符号,载入音频到std::map<string, Sound>,key为音频名,value为音频对象, void Sound::Load(const string &path)将音频存入buffer。
存档载入框架:
包括玩家游戏中的数据和个人设置,储存在配置文件夹内(包含有plugins和saves文件夹),主要包括:
- void PlayerInfo::LoadRecent()载入最近存档,在配置文件夹内有一个recent.txt(载入数据的时候没有会新建)用来记录最近存档位置,然后调用void PlayerInfo::Load(const string &path)载入该存档;
- void PlayerInfo::ApplyChanges()将存档内容载入到游戏中;
- 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的更多相关文章
- Endless Sky源码学习笔记-1
难得遇到一个比较有趣的开源游戏,又是比较偏爱的太空背景,所以打算学习下源码. Endless Sky的作者是Michael Zahniser,是一个2D太空游戏.整个程序比较简洁明了,数据没有打包,游 ...
- Endless Sky源码学习笔记-5
游戏启动后的UI划分为三个区域,左侧滚动显示credits等信息以及偏好设置和退出按钮,中间显示载入动画,右侧显示玩家信息以及载入存档按钮,调用void MenuPanel::Draw()实现.首先画 ...
- Endless Sky源码学习笔记-4
事件处理: 事件包括:debug模式切换.切换到登陆窗口.退出.窗口大小变化.全屏切换和游戏中的鼠标键盘输入.处理方式分为两类,前几个为简单的if处理,最后一个涉及到游戏中的控制和交互,且事件由每一个 ...
- Endless Sky源码学习笔记-3
文本解析: 将txt存入DataFile,DataFile包含DataNode,每个DataNode是txt中的一行,每个DataNode包含若干token(std::vector<string ...
- Underscore.js 源码学习笔记(下)
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
- Underscore.js 源码学习笔记(上)
版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}()); 这样的东西,我们应该知道这是一个 IIFE(立即执行 ...
- AXI_LITE源码学习笔记
AXI_LITE源码学习笔记 1. axi_awready信号的产生 准备接收写地址信号 // Implement axi_awready generation // axi_awready is a ...
- Hadoop源码学习笔记(6)——从ls命令一路解剖
Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...
- Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构
Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步 ...
随机推荐
- Ejabberd外部组件开发
Ejabberd的基本介绍就不多言了,使用erlang开发的高并发高稳定性XMPP服务器,在whatsapp中得到了应用,算是erlang领域一个杀手级应用.前面的文章中我已经总结了Ejabberd插 ...
- java comet
http://www.javaworld.com/article/2077995/java-concurrency/asynchronous-processing-support-in-servlet ...
- Request与session与application的区别
(1)request的setAttribute与getAttribute方法一般都是成对出现的,首先通过setAttribute方法设置属性与属性值,然后通过getAttribute方法根据属性获取到 ...
- hrbrid需要做的
1 返回并刷新 A webveiw push 到 B webview.当由B返回到A时候, A需要刷新页面.
- Android驱动开发之Hello实例
Android驱动开发之Hello实例: 驱动部分 modified: kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconf ...
- LR12.53—第6课:运行负载测试
第6课:运行负载测试 当你运行一个负载测试,LoadRunner将生成系统上的负载.然后,您可以使用LoadRunner的监控器和图形负载下,观察系统的性能. 在这一课中,你将涵盖以下主题: 一目了然 ...
- 【SSM 5】Mybatis分页插件的使用
一.添加maven依赖项 <span style="font-family:KaiTi_GB2312;font-size:18px;"><dependency&g ...
- Linux环境下安装Oracle 10g 发生错误 You do not have permission to write to the inventory location
关于安装过程中出现的一些错误,我总结一下,路径没权限,不是该用户组下面的需要创建oracle的用户和用户组及目录 ,并对目录赋予相应权限,可参考下面的例子:这个地方如果简单的按照下面的程序做也能安装成 ...
- td的所有style
td.style.clear= td.style.posRight=0 td.style.backgroundRepeat= td.style.borderTopStyle= td.style.mar ...
- 在linux下写一只优雅的爬虫---优雅的获取沈航所有学生的个人信息
一:ubuntu下安装python集成环境pycharm以及免费激活 安装 首先去下载最新的pycharm 2016.2.3,进行安装.可以直接在官网下载.选择自己所对应的版本 PyCharm 的激活 ...