2015-01-07 10:08:58 k73游戏之家 作者:噬嗑饕餮
太空工程师已经推出了很长时间了,但是为了方便玩家们能够更好的理解ApI的使用,下面小编就跟玩家们介绍下关于太空工程师简易时钟教程。
先来看一下结构外观。当然,由于本教程以程序为主,外观结构并不重要,主要是将12盏灯排好,放上一个计时器,一个可编程方块加一个能源即可
在游戏内的编程中,功能方块的名称是最主要的查找方式,所以在命名时一定要小心。
在这里,我的所有聚光灯都以“Spotlight 1”、“Spotlight 2”。。。的格式命名,共12个。
然后这里是最重要的了程序代码
内附详细讲解
如果图片看不清的话这里附上文字版的代码,不过由于没有颜色区分,看起来不方便
/*
* 该程序为一个简易时钟,将作为一个可编程方块的范例。
* 本程序目标是在一个计时器方块的辅助下,使12个聚光灯逐一亮起,如此循环。
* 其间隔由计时器方块控制,聚光灯必须以"Spotlight 1"、"Spotlight 2"...的方式按顺序命名
* 点亮顺序即为编号顺序
* */
int CurrentIndex, NextIndex; // 在循环中记录当前灯的编号与下一灯的编号。
int[] ID; // 记录每一个编号的灯在方块列表中的位置。
void Main()
{
// 声明一个方块列表,目前只支持IMyTerminalBlock,即功能方块列表
//(其实也支持方块组 IMyBlockGroup, 不过目前没有开放该类的端口),
//不支持装甲方块与装饰方块。
List Lights = new List();
// GridTerminalSystem 是调用方块的基本类,其中存放了所有的功能
//方块与调取方块的方法。
GridTerminalSystem
.GetBlocksOfType(Lights);// 该方法将所有<>内类型的方块
//放入()中的列表里,这里我们获得了一个所有聚光灯的列表。
ID = new int[Lights.Count]; // 简单起见,这里直接当我们没有多余的灯。
// 同上,获取一个计时器的列表。
List Clock = new List();
GridTerminalSystem
.GetBlocksOfType(Clock);
for(int i = 0; i < Lights.Count; i++){ // 开始循环,逐一检查。
//将当前的灯的信息cast入该方块最表层的Interface:IMyReflectorLight。
IMyReflectorLight Light = (IMyReflectorLight)Lights;
//拆分该灯的名称,用以获取该灯编号。
String[] LightName = Light.CustomName.Split(" "[0]);
//获取当前编号。
CurrentIndex = Convert.ToInt32(LightName[1])-1;
//记录该编号在列表中的位置。
ID[CurrentIndex] = i;
if(Light.Enabled){ //判断哪一盏灯处于开启状态(假设只有1盏)。
//如果该灯开启,则将其关闭。
Light
.GetActionWithName("OnOff_Off")//GetActionWithName返回一个IMyTerminalAction参数,即一个动作。
.Apply(Light);//Apply为一void方法,即将该动作施加于输入的方块。
//计算下一盏灯的编号(即需要点亮的那盏)。
if(CurrentIndex < 11){
NextIndex = CurrentIndex + 1;
}
else{
NextIndex = 0;
}
}
}
//通过在循环中记录的ID参数提取下一盏灯。
IMyReflectorLight LightN = (IMyReflectorLight)Lights[ID[NextIndex]];
//同样的,开启该灯。
LightN
.GetActionWithName("OnOff_On")
.Apply(Lights[ID[NextIndex]]);
//计时器开始计时,计时截止时其将再次激活本程序。
Clock[0]//假设计时器唯一,直接调用列表中第一个计时器。
.GetActionWithName("Start")
.Apply(Clock[0]);
}