【小作品】常规引擎随动式重力引擎编码
太空工程师吧
全部回复
仅看楼主
level 13
以下是一个自动地和常规引擎随动的重力引擎,即重力引擎的推进分数和常规引擎推进分数相一致,从而不需要额外操作重力引擎。不知哪个版本的推进器API改动使得这种设计成为可能。
这一计算需要一个推力向前的引擎,命名为Forward,一个推力向后的引擎命名为Backward,一组名字中带有FrontGravity的重力发生器,重力发生器顶部指向舰船前部。一块命名为Engine Pad的文字面板,放在容易看到的位置,人工质量可以任意地放在重力发生器力场内。推力向其他方向的引擎可以类似地安排,只要按照下面给出的格式加上相关的变量即可。
float FrontThrustValue = 0f;
float BackThrustValue = 0f;
private IMyLightingBlock lcd = null;
private IMyThrust FrontThrust = null;
private IMyThrust BackThrust = null;
//private List<IMyThrust> BackThrust = new List<IMyThrust>();
private IMyTextPanel Engine = null;
private List<IMyTerminalBlock> FrontGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> FrontMass = new List<IMyTerminalBlock>();
private List<IMyFunctionalBlock> BackGravity = new List<IMyFunctionalBlock>();
private List<IMyFunctionalBlock> BackMass = new List<IMyFunctionalBlock>();
void Main(string argument)
{
//List<IMyTerminalBlock> Buffer = new List<IMyTerminalBlock>();
GridTerminalSystem.SearchBlocksOfName("FrontGravity", FrontGravity);
FrontThrust = GridTerminalSystem.GetBlockWithName("Forward") as IMyThrust;
BackThrust = GridTerminalSystem.GetBlockWithName("Backward") as IMyThrust;
Engine = GridTerminalSystem.GetBlockWithName("Engine Pad") as IMyTextPanel;
//lcd = GridTerminalSystem.GetBlockWithName("LCD") as IMyLightingBlock;
//lcd.ApplyAction("OnOff");
FrontThrustValue = FrontThrust.CurrentThrust / FrontThrust.MaxEffectiveThrust;
BackThrustValue = BackThrust.CurrentThrust / BackThrust.MaxThrust;
string[] EngineHUD = { FrontThrustValue.ToString(), BackThrustValue.ToString(), FrontGravity[0].GetValueFloat("Gravity").ToString() };
string EngineHUDString = string.Join(" ", EngineHUD);
Engine.WritePublicText(EngineHUDString);
//string EngineText = string.
for (int i = 0; i < FrontGravity.Count; i++)
{
if (FrontThrustValue >= 0 && BackThrustValue == 0)
FrontGravity[i].SetValueFloat("Gravity", -9.81f * FrontThrustValue);
if (FrontThrustValue == 0 && BackThrustValue >= 0)
FrontGravity[i].SetValueFloat("Gravity", 9.81f * BackThrustValue);
}
}
缺点:
没有专用的初始化函数,每次调用都要初始化,而且不能避免某个组出现空对象调用,如果重力引擎出现战损整个程序会停转。
没有专用的循环功能,要用时间方块辅助循环
上述缺点下个版本会修正。
明天考量子,祝我好运。
2017年05月08日 05点05分 1
level 9
膜拜[大拇指]
2017年05月08日 09点05分 2
level 13
这个就非常屌了啊
2017年05月08日 10点05分 3
level 13
现在编程模块已经可以直接读取wsad按键了,所以不需要常规引擎作为引导,可以直接用wsad引导重力引擎
2017年05月08日 19点05分 4
求问具体方法,或者发个说明链接也行
2017年05月11日 07点05分
level 12
厉害啊 虽然我不懂
2017年05月08日 22点05分 5
level 13
太6
2017年05月09日 08点05分 6
level 13
float FrontThrustValue,BackThrustValue,LeftThrustValue,RightThrustValue,UpThrustValue,DownThrustValue = 0f;
private StringBuilder ** = new StringBuilder();
//float BackThrustValue = 0f;
//private IMyLightingBlock lcd = null;
private List<IMyThrust> FrontThrusts = new List<IMyThrust>();
private List<IMyThrust> RearThrusts = new List<IMyThrust>();
private List<IMyThrust> LeftThrusts = new List<IMyThrust>();
private List<IMyThrust> RightThrusts = new List<IMyThrust>();
private List<IMyThrust> UpThrusts = new List<IMyThrust>();
private List<IMyThrust> DownThrusts = new List<IMyThrust>();
private List<IMyThrust>[] Thrusters = { };
bool[] ThrustReady = { false, false, false, false, false, false };//用数组管理六个方向推进器的前期尝试
private IMyThrust FrontThrust = null;
private IMyThrust BackThrust = null;
//private List<IMyThrust> BackThrust = new List<IMyThrust>(); private IMyTextPanel Engine = null;
private MyDetectedEntityInfo Self; private List<IMyTerminalBlock> FrontGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> BackGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> LeftGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> RightGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> UpGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> DownGravity = new List<IMyTerminalBlock>();
void Initialize ()
{
List<IMyTerminalBlock> buffer = new List<IMyTerminalBlock>();
GridTerminalSystem.GetBlocksOfType<IMyThrust>(buffer);
if (buffer.Count!=0)
{
for(int i=0;i<buffer.Count;i++)
{
if (buffer[i].CustomName.Contains("Forward"))
FrontThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].CustomName.Contains("Backward"))
RearThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].CustomName.Contains("Up"))
UpThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].CustomName.Contains("Down"))
DownThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].CustomName.Contains("Left"))
LeftThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].CustomName.Contains("Right"))
RightThrusts.Add(buffer[i] as IMyThrust);
}
}//初始化函数。我本来想尝试“每次方块受到伤害是重新调用初始化”,但是这游戏没有类似eventhandler的功能所以做不到,肯定必须每帧调用一次并且比较。
else
{
Echo("No Thrusters Onboard");//不确定控制台是不是这样写的
}
GridTerminalSystem.SearchBlocksOfName("FrontGravity", FrontGravity);
GridTerminalSystem.SearchBlocksOfName("BackGravity", BackGravity);
GridTerminalSystem.SearchBlocksOfName("LeftGravity", LeftGravity);
GridTerminalSystem.SearchBlocksOfName("RightGravity", RightGravity);
GridTerminalSystem.SearchBlocksOfName("UpGravity", UpGravity);
GridTerminalSystem.SearchBlocksOfName("DownGravity", DownGravity);
Engine = GridTerminalSystem.GetBlockWithName("Engine Pad") as IMyTextPanel;
}
void Main(string argument)
{
FrontThrustValue = FrontThrust.CurrentThrust / FrontThrust.MaxEffectiveThrust;
BackThrustValue = BackThrust.CurrentThrust / BackThrust.MaxEffectiveThrust;
LeftThrustValue = LeftThrusts[0].CurrentThrust / LeftThrusts[0].MaxEffectiveThrust;
//…………部分未完成
string[] EngineHUD = { FrontThrustValue.ToString(), BackThrustValue.ToString(), FrontGravity[0].GetValueFloat("Gravity").ToString() };
string EngineHUDString = string.Join(" ", EngineHUD);//TODO:改成StringBuilder
Engine.WritePublicText(EngineHUDString);
//string EngineText = string.
for (int i = 0; i < FrontGravity.Count; i++)
{
if (FrontThrustValue >= 0 && BackThrustValue == 0&&FrontGravity.Count!=0)
FrontGravity[i].SetValueFloat("Gravity", -9.81f * FrontThrustValue);
if (FrontThrustValue == 0 && BackThrustValue >= 0)
FrontGravity[i].SetValueFloat("Gravity", 9.81f * BackThrustValue);
//TODO:加上防止重力发生器NRE的语句
}
}
2.0版,我自己也不知道我写的什么。
2017年05月10日 20点05分 7
level 13
float FrontThrustValue, BackThrustValue, LeftThrustValue, RightThrustValue, UpThrustValue, DownThrustValue = 0f; private StringBuilder ** = new StringBuilder();
//float BackThrustValue = 0f;
//private IMyLightingBlock lcd = null; private List<IMyThrust> FrontThrusts = new List<IMyThrust>();
private List<IMyThrust> BackThrusts = new List<IMyThrust>();
private List<IMyThrust> LeftThrusts = new List<IMyThrust>();
private List<IMyThrust> RightThrusts = new List<IMyThrust>();
private List<IMyThrust> UpThrusts = new List<IMyThrust>();
private List<IMyThrust> DownThrusts = new List<IMyThrust>();
private List<IMyThrust>[] Thrusters = { };
bool[] ThrustReady = { false, false, false, false, false, false };
//private List<IMyThrust> BackThrust = new List<IMyThrust>(); private IMyTextPanel Engine = null;
private MyDetectedEntityInfo Self; private List<IMyTerminalBlock> FrontGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> BackGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> LeftGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> RightGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> UpGravity = new List<IMyTerminalBlock>();
private List<IMyTerminalBlock> DownGravity = new List<IMyTerminalBlock>();
void Initialize()
{
List<IMyTerminalBlock> buffer = new List<IMyTerminalBlock>();
GridTerminalSystem.GetBlocksOfType<IMyThrust>(buffer);
if (buffer.Count != 0)
{
for (int i = 0; i < buffer.Count; i++)
{ if (buffer[i].Orientation.ToString().Contains("Forward:Up"))
FrontThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].Orientation.ToString().Contains("Forward:Down"))
BackThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].Orientation.ToString().Contains("Forward:Forward"))
UpThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].Orientation.ToString().Contains("Forward:Backward"))
DownThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].Orientation.ToString().Contains("Forward:Left"))
LeftThrusts.Add(buffer[i] as IMyThrust);
else if (buffer[i].Orientation.ToString().Contains("Forward:Right"))
RightThrusts.Add(buffer[i] as IMyThrust);
}
}
else
{
Echo("No Thrusters Onboard");
}
GridTerminalSystem.SearchBlocksOfName("Gravity Generator", buffer);
if (buffer.Count != 0)
{
for (int i = 0; i < buffer.Count; i++)
{
if (buffer[i].Orientation.ToString().Contains("Up:Up"))
BackGravity.Add(buffer[i]);
else if (buffer[i].Orientation.ToString().Contains("Up:Down"))
FrontGravity.Add(buffer[i]);
else if (buffer[i].Orientation.ToString().Contains("Up:Left"))
RightGravity.Add(buffer[i]);
else if (buffer[i].Orientation.ToString().Contains("Up:Right"))
FrontGravity.Add(buffer[i]);
else if (buffer[i].Orientation.ToString().Contains("Up:Forward"))
DownGravity.Add(buffer[i]);
else if (buffer[i].Orientation.ToString().Contains("Up:Backward"))
UpGravity.Add(buffer[i]);
}
} Engine = GridTerminalSystem.GetBlockWithName("Engine Pad") as IMyTextPanel; }
2017年05月10日 23点05分 8
level 13
void Main(string argument)
{
Initialize();
if (FrontThrusts.Count != 0){
for (int i = 0; i < FrontThrusts.Count; i++){
if (FrontThrusts[i].IsFunctional){
FrontThrustValue = FrontThrusts[i].CurrentThrust / FrontThrusts[i].MaxEffectiveThrust;
break;
}
}
} if (BackThrusts.Count != 0){
for (int i = 0; i < BackThrusts.Count; i++){
if (BackThrusts[i].IsFunctional){
BackThrustValue = BackThrusts[i].CurrentThrust / BackThrusts[i].MaxEffectiveThrust;
break;
}
}
}
if (LeftThrusts.Count != 0){
for (int i = 0; i < LeftThrusts.Count; i++){
if (LeftThrusts[i].IsFunctional){
LeftThrustValue = LeftThrusts[i].CurrentThrust / LeftThrusts[i].MaxEffectiveThrust;
break;
}
}
}
if (RightThrusts.Count != 0){
for (int i = 0; i < RightThrusts.Count; i++){
if (RightThrusts[i].IsFunctional){
RightThrustValue = RightThrusts[i].CurrentThrust / RightThrusts[i].MaxEffectiveThrust;
break;
}
}
}
if (UpThrusts.Count != 0){
for (int i = 0; i < UpThrusts.Count; i++){
if (UpThrusts[i].IsFunctional){
UpThrustValue = UpThrusts[i].CurrentThrust / UpThrusts[i].MaxEffectiveThrust;
break;
}
}
}
if (DownThrusts.Count != 0){
for (int i = 0; i < DownThrusts.Count; i++){
if (DownThrusts[i].IsFunctional){
DownThrustValue = DownThrusts[i].CurrentThrust / DownThrusts[i].MaxEffectiveThrust;
break;
}
}
}
**.Clear();
Engine.WritePublicText(**.ToString()); //string EngineText = string.
if (FrontGravity.Count != 0){
**.Append(FrontThrustValue.ToString("0.000") + " " + FrontGravity[0].GetValueFloat("Gravity").ToString("0.000"));
**.AppendLine();
for (int i = 0; i < FrontGravity.Count; i++){
if (FrontGravity.Count != 0){
if (FrontThrustValue > 0)
FrontGravity[i].SetValueFloat("Gravity", -9.81f * FrontThrustValue);
else FrontGravity[i].SetValueFloat("Gravity", 9.81f * BackThrustValue);
}
}
}
if (BackGravity.Count != 0){
**.Append(BackThrustValue.ToString("0.000") + " " + BackGravity[0].GetValueFloat("Gravity").ToString("0.000"));
**.AppendLine();
for (int i = 0; i < BackGravity.Count; i++){
if (BackGravity.Count != 0){
if (BackThrustValue > 0)
BackGravity[i].SetValueFloat("Gravity", -9.81f * BackThrustValue);
else BackGravity[i].SetValueFloat("Gravity", 9.81f * FrontThrustValue);
}
}
}
if (LeftGravity.Count != 0){
**.Append(LeftThrustValue.ToString("0.000") + " " + LeftGravity[0].GetValueFloat("Gravity").ToString("0.000"));
**.AppendLine();
for (int i = 0; i < LeftGravity.Count; i++){
if (LeftGravity.Count != 0){
if (LeftThrustValue > 0)
LeftGravity[i].SetValueFloat("Gravity", -9.81f * LeftThrustValue);
else LeftGravity[i].SetValueFloat("Gravity", 9.81f * RightThrustValue);
}
}
}
if (RightGravity.Count != 0){
**.Append(RightThrustValue.ToString("0.000") + " " + RightGravity[0].GetValueFloat("Gravity").ToString("0.000"));
**.AppendLine();
for (int i = 0; i < RightGravity.Count; i++){
if (RightGravity.Count != 0){
if (RightThrustValue > 0)
RightGravity[i].SetValueFloat("Gravity", -9.81f * RightThrustValue);
else RightGravity[i].SetValueFloat("Gravity", 9.81f * LeftThrustValue);
}
}
}
if (UpGravity.Count != 0){
**.Append(UpThrustValue.ToString("0.000") + " " + UpGravity[0].GetValueFloat("Gravity").ToString("0.000"));
**.AppendLine();
for (int i = 0; i < UpGravity.Count; i++){
if (UpGravity.Count != 0){
if (UpThrustValue > 0)
UpGravity[i].SetValueFloat("Gravity", -9.81f * UpThrustValue);
else UpGravity[i].SetValueFloat("Gravity", 9.81f * DownThrustValue);
}
}
}
if (DownGravity.Count != 0{
**.Append(DownThrustValue.ToString("0.000") + " " + DownGravity[0].GetValueFloat("Gravity").ToString("0.000"));
**.AppendLine();
for (int i = 0; i < DownGravity.Count; i++ {
if (DownGravity.Count != 0{
if (DownThrustValue > 0)
DownGravity[i].SetValueFloat("Gravity", -9.81f * DownThrustValue);
else DownGravity[i].SetValueFloat("Gravity", 9.81f * UpThrustValue);
}
}
}
}
2017年05月10日 23点05分 9
level 13
以上两段是3.0版,半自动地解决了找推进器方向的问题,找重力引擎方向的问题,所有推进器/重力引擎分组的问题,“标杆引擎”被击毁的问题等等。应该不会再出问题了,只是电脑声称其过于复杂,我的解决方案是分成三个程序块分别控制前后左右上下六组引擎动力。
注意方块的Orientation其实因船而异,游戏并没有强制给出哪边是前,所以每次造新的船最好用别的程序读一遍
正确的
orientation。
2017年05月11日 00点05分 10
level 13
之前的代码中每次循环都要执行初始化。去掉这一做法后运行速度提高到原本水平。
2017年05月11日 01点05分 11
level 1
膜拜一下,顺便求基友一起玩啊,服务器名:NEW EVE3
2017年05月11日 02点05分 12
level 8
水一波经验,可以一键签到666
2017年05月11日 02点05分 13
1