事件处理:
事件包括: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访问其他类的成员,包括玩家的飞船、货物、银行账户、任务(这个比较复杂)、事件和物价。个人设置的储存同上。
浙公网安备 33010602011771号