笔记-通过C++脚本实现SpaceEngine自动截图

  1. 1. 介绍
  2. 2. 思路分析
  3. 3. 程序实现
    1. 3.1. 搜索行星系
    2. 3.2. 遍历行星系

本文为使用C++编写SpaceEngine截图脚本的个人笔记,思路十分简单直接,如果你有任何想法,欢迎留下评论


介绍

SpaceEngine(下称SE)是一款大空模拟程序,它使用人类目前已知的天体信息目录以及程序生成创建了一个虚拟三维天文馆,天文馆存放有恒星,行星,星云和黑洞等不同类型的天体。组成了较为完整的星体索引。(SE0.98前的版本免费,有兴趣的建议去玩一下)

思路分析

本文对脚本的要求为需要自动寻找恒星系,并对其中的大部份天体进行截图,并记录信息用于分类。根据我们的目标进行任务分解,可简单划分为搜索行星系和搜索系内天体以及截图三个部份。

分解任务后,我们便需根据对应的任务编写脚本,但使用任何脚本程序实现的特定目标前,我们都应深入分析对像程序特点以针对性地编写程序。

由此我们先考察SE的内置快捷操作能如何协助我们。通过检索快捷键列表我们可以找到SE内罝的恒星浏览器和天体系统浏览器,前者可以帮助我们分类搜索不同的恒星,后者侧提供了行星系内的天体目彔。

恒星浏览器

天体系統浏览器

不难发现,恒星浏览器已经为我们提供了搜索恒星的图形API,我们只需预先通过滑鼠操作恒星浏览器便可以实现搜索行星系的目的。

随后是遍历行星系内的天体,可借助天体系统浏览器,通过它我们可直接检索行星系目录和系内行星的子目录。此外它提供了前往天体和查看二级目彔的方式。对应的按钮分别位于右上和右下角,可借此直接前往天体。

此外,通过测量发现SE的界面的像素与屏幕分辨率无关而仅与系统缩放相关,可通过测量界面按键的像素值以定位按键位置,由此考虑可通过测量100%缩放下的按键位置并乘以系统缩放比例适应不同分办率和系统缩放值的运行环境。

基于此我们可以编写脚本自动进行搜索和搜索。整理我们的分析思路,自此本文的分析内容已经结束,接下来是程序实现的内容。

流程图

程序实现

搜索行星系

通过在恒星浏览器的过滤器中进行筛选,我们可在简化程序的同时达到较好的效果。星系随机化选取可通过随机化鼠标坐标和滚轮滚动二者组合而成。记录下其搜索框的顶部和低部坐标后。可通过mouse_event()函数在该区域中模拟点击实现。

附注:需注意恒星浏览器窗口可被拖动,可自行拖动至特定位置再执行脚本,或是在初始化时通过读入滑鼠坐标人为记录它的位置。

遍历行星系

选择星系后通过F2打开天体系统浏览器,它已预先为我们提供"前往天体"和"次级目彔"按键,通过画图软件进行测量,得到"前往天体"按键的100%分辨率坐标值为(140,20),"次级目彔"按键的坐标值为(140,140),各天体的按键间距为(120,0)。且按键的亮度和环境亮度有显著差异,考虑通过像素的灰度或颜色判断按键是否存在。(判断(140+120*i , 20)位置的灰度值)

可见天体上的两个按键与背景有明显灰度差异

遍历二级,三级目录同理,仅需把判断对象改为"次级目彔"按键,即判断(140+120*i,140)位置的灰度值。

附注:判断按键前需要先移动滑鼠至浏览器中的天体上並等待一小段时间,否则程序不会显示按键。


附注:有关的C++编写脚本实现方式可参考笔記-使用C++编写Windows脚本
感谢观看,祝安康幸运。