难得遇到一个比较有趣的开源游戏,又是比较偏爱的太空背景,所以打算学习下源码。
Endless Sky的作者是Michael Zahniser,是一个2D太空游戏。整个程序比较简洁明了,数据没有打包,游戏内的物体和任务等都是直接用txt定义,图像和音频分别是png或jpg和wav文件,用到了一些C++11的新功能,所以需要编译器支持该标准。主要依赖为:SDL负责窗口和输入,图像需要OpenGL 3.0+支持(并有texture swizzling功能)以及libpng和libturbojpeg读取图片,声音用OpenAL。
先从main函数入手,梳理程序运行的大体框架:
- 创建空Conversation和PlayerInfo对象;
- 初始化窗口;
- 载入数据、图像和音频;
- 载入存档和个人设置;
- 设置窗口大小,初始化GLEW,载入shader,支持高DPI显示器(需下载官方高DPI插件,载入时会自动替换原图像);
- 初始化UI,UI由Panel按stack方式储存,从下往上读,事件从上往下传;
- 设置帧数为60,设置容许5微秒延迟;
- while(!menuPanels.IsDone())内为主循环,其内的while(SDL_PollEvent(&event))为事件处理循环;
- 事件处理循环结束后设置下一帧;
- 显示当前帧,保持帧数,如果超过延迟限制则跳帧,至此主循环结束;
- 退出时如果停在星球上就存档;
- 保存个人设置;
- 按反创建顺序释放。