Endless Sky源码学习笔记-4
事件处理:
事件包括:debug模式切换、切换到登陆窗口、退出、窗口大小变化、全屏切换和游戏中的鼠标键盘输入。处理方式分为两类,前几个为简单的if处理,最后一个涉及到游戏中的控制和交互,且事件由每一个panel来处理,包括快捷键以及鼠标单击、悬停、拖动和滚动,而不同的panel对同一事件的响应不尽相同,所以Panel类事件处理的函数大多时虚函数,由不同panel继承后重写。多数事件处理时会改变UI,所以需要push/pop相应的panel到stack,统一由void UI::PushOrPop()
处理,这就需要先将每个panel的push/pop存储起来,所以用两个std::vector来存储需要push/pop的panel,然后在void UI::PushOrPop()依次在stack中加入或弹出。需要注意的是不管是erase还是clear只是删除指针,不会删除指向的对象。事件主要有:
- Drag,拖动,需按下鼠标左键并移动。
- Hover,悬停,需移动鼠标。
- ZoneClick,触发区域响应,需在定义的范围内左键单击鼠标。
- Click,左键单击响应,需在某一位置左键单击鼠标。
- RClick,右键单击响应,需在某一位置右键单击鼠标。
- Release,释放响应,需在某一位置释放已单击的鼠标。
- Scroll,滚轮响应,需滚动鼠标滚轮。
- KeyDown,键盘响应,需按下某按键。
储存个人设置和游戏进度:
游戏会在特定的时刻储存进度,包括:玩家在星球上时退出游戏,玩家在星球上时呼出载入界面,玩家离开星球,玩家接受的任务要求自动存档。实际上进度只能在登陆星球后才能储存。首先要更新recent.txt中的存档位置,然后比较当前游戏时间是否在已有最新存档里的游戏时间之后,若是则将当前状态存档,并更新3个snapshot存档。实际存档是由 void PlayerInfo::Save(const string &path) const 完成,写入到最新存档,所以除了最新存档需要该函数写,其他的snapshot都是从上一个中复制。存档中的内容非常多,按缩进确定层次关系,以key-value的形势写入txt。有几个数据比较多的需要调用自己的save函数,避免PlayerInfo访问其他类的成员,包括玩家的飞船、货物、银行账户、任务(这个比较复杂)、事件和物价。个人设置的储存同上。
Endless Sky源码学习笔记-4的更多相关文章
- Endless Sky源码学习笔记-1
难得遇到一个比较有趣的开源游戏,又是比较偏爱的太空背景,所以打算学习下源码. Endless Sky的作者是Michael Zahniser,是一个2D太空游戏.整个程序比较简洁明了,数据没有打包,游 ...
- Endless Sky源码学习笔记-5
游戏启动后的UI划分为三个区域,左侧滚动显示credits等信息以及偏好设置和退出按钮,中间显示载入动画,右侧显示玩家信息以及载入存档按钮,调用void MenuPanel::Draw()实现.首先画 ...
- Endless Sky源码学习笔记-3
文本解析: 将txt存入DataFile,DataFile包含DataNode,每个DataNode是txt中的一行,每个DataNode包含若干token(std::vector<string ...
- Endless Sky源码学习笔记-2
数据载入框架: void GameData::BeginLoad(const char * const *argv)为数据载入的最上层method,其主要框架为: void Files::Init(c ...
- 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,则可以进一步 ...
随机推荐
- java删除文件
public boolean deleteFile(String fileName) { File file = new File("D:/NovaPluto/xml/"+file ...
- ndk-stack 使用(分析native代码stack)
简介: ndk r6 版本之后开始提供该功能. 作用: ndk-stack可以把不认识的内存地址信息转换成可读的信息. 比如,把下列内容 I/DEBUG ( ): *** *** *** *** ** ...
- Microsoft Dynamics AX 2012: How to get Company,Customer and Vendor address in AX 2012
Scenario: “How to get Addresses of “Customer, Vendor and Company” 1) First we need to identify ...
- JAVA 教程推荐
JAVA 教程 学习地址:http://www.manongjc.com/mysql/mysql_tutorial.html Java 简介 Java是由Sun Microsystems公司于1995 ...
- [翻译练习]密码学1小时入门 (Everything you need to know about cryptography in 1 hour)
原文:http://www.daemonology.net/papers/crypto1hr.pdf [密码学简介] 很多人都误用了密码学 一般可归为三类: 1. 愚蠢 比如Google ...
- VC++动态链接库(DLL)编程深入浅出(zz)
VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...
- C# Socket简单例子(服务器与客户端通信)
这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信. 注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序.在这个例子中,实际上还有很多问题没有解决,如消 ...
- ssh 的搭建
struts包的下载:http://struts.apache.org/download.cgi#struts252 string包的下载: http://repo.spring.io/release ...
- Linux SAMBA Practical
Samba配置 on Ap1-10.*.16.81首先,判斷samba服務是否安裝?[root@ap01 ~]# rpm -qa|grep sambasamba-client-3.5.10-125.e ...
- 2016-11-02: boost::enable_shared_from_this
使用场景 当类对象被shared_ptr管理时,需要在类自己定义的函数中把当前对象作为参数传递给其他函数时,必须传递一个shared_ptr,否则就不能保持shared_ptr管理这个类对象的语义.因 ...