Programming in Space Engineers

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Programming in Space Engineers

      Hallo zusammen,

      bezüglich des neuen Block zum programmieren wollte ich fragen ob ihr vielleicht einen deutschen Guide kennt. Vielleicht könnt ihr aber selber auch ein paar Dinge erklären.
      Heute hatte ich versucht einen Soundblock per Script dazu zu bringen einen Ton auszugeben. Dies hat natürlich bei mir nicht geklappt X( .

      Zu meiner Schande muss ich gestehen, dass ich mit Programmierung nichts am Hut habe.
      Da hab ich schon das Problem der Syntax, wie muss ich ein Programm beginnen, wie spreche einzelne Blocks (z.B. Soundblock) an?
      Was muss ich machen damit eine Funktion in gang gesetzt wird? Welche Regeln muss ich beachten?

      Vielleicht können die Cracks unter euch, für uns Noobs (wie mich :thumbsup: ) ein paar einfache Sachen erklären.
      Oder ihr kennt eine gute Seite/Video die mir das ganze etwas näher bringt.

      Würde mich freuen wenn wir hier ein paar Grundlagen festhalten könnten, damit man in die Materie rein kommt.

      Anbei noch der Offizielle Guide, der für mich allerdings wie spanische Dörfer klingt ?(
      steamcommunity.com/sharedfiles/filedetails/?id=360966557

      Danke und schöne Grüße

      Nigel
    • Also ich hab schon 2 Programme erfolgreich geschrieben, die kannst du hier im Forum auch sehen.
      InGame Programme und Ideen

      Zu dem Soundblock ist es an sich eig recht einfach, wenn man es verstanden hat.

      var Sound = GridTerminalSystem.GetBlockWithName("SoundBlock 1") as IMySoundBlock; // Hier gibst u der Variablen "Sound" den Block "Soundblock 1"
      Sound.GetActionWithName("Play").Apply(Sound); // Hier sagst du dass die Akion "Play" im Soundblock ausgeführt werden soll.
    • Also, wenn du scripten willst, kommst du nicht darum herum dich mit der Syntax der Programmiersprache C# zu beschäftigen. Um erfolgreich ein Script zu schreiben, musst du einfach ein Grundverständnis für das objektorientierte Programmieren mitbringen. Man sollte sich bewusst sein, dass Programmieren keine Sache ist, die man mal eben in 5 Minuten lernt. Wenn man nicht bereit sein sollte einige Stunden in das Erlernen von C# zu stecken, dann wird man sich damit begnügen müssen scripts herunterzuladen und in diesen einige Werte zu verändern.

      Ich will hier niemandem den Spaß am scripten vermiesen, jedoch möchte ich den Eindrück vermeiden, dass dieser Spielinhalt für jeden geeignet ist. Nichtsdestotrotz versuche ich kurz anhand eines kleinen Beispiels einige grundsätzliche Sachen zu erläutern. Diese sind allerdings nur zu verstehen, wenn man Begriffe wie Variable, Anweisung und Methode kennt.

      Quellcode

      1. var global;
      2. void Main()
      3. {
      4. //code here
      5. var local;
      6. }
      7. void OtherMethod()
      8. {
      9. //put other things here
      10. }
      Alles anzeigen


      Zuerst die 'Main()'-Methode:
      Diese wird ausgeführt, wenn das Script ausgeführt wird. Weiterhin kann man beliebig weitere Methoden definieren (im Beispiel 'OtherMethod()').

      Nun zu den Variablen:
      Es wird zwischen zwei Typen unterschieden: Global und Lokal. Global bedeutet, dass die Variable beim Compilieren (also Übernehmen) des Scripts erstellt wird. Sie wird im Gegensatz zu lokalen Variablen nicht jedes Mal neu initialisiert, wenn das Script gestartet wird. Somit kann man Werte über das Ende des Scriptes hinaus speichern. Also beispielsweise einen Zustand, der in einem vorherigen Durchlauf des Scripts erreicht wurde und im nächsten Durchlauf abgefragt werden soll. Die globalen Variablen können natürlich auch in anderen Methoden verändert werden, während die lokalen nur für die jeweilige Methode gelten, in der sie initialisiert werden.

      So weit so gut. An dieser Stelle fragt man sich wohl nun woher man die Blöcke seines Schiffes bekommt. Das geht folgendermaßen:
      Es gibt eine Art Einstiegspunkt, der sich 'GridTerminalSystem' nennt. Dieser ist wie eine globale Variable zu verwenden und bietet folgende Möglichkeiten:
      - List<IMyTerminalBlock> Blocks { get; } = Mit 'GridTerminalSystem.Blocks' kann man eine Liste abfragen, die alle Blöcke des Grids beinhaltet, auf die man Zugriffsrechte hat.
      - List<IMyBlockGroup> BlockGroups { get; } = Mit 'GridTerminalSystem.Blocks' kann man eine Liste abfragen, die alle Gruppen des Grids beinhaltet.
      - void GetBlocksOfType<T>(List<IMyTerminalBlock> blocks, Func<IMyTerminalBlock, bool> collect = null); = Mit 'GridTerminalSystem.GetBlocksOfType<IMyTerminalBlock>(list)' kann man eine Liste (list), die man vorher initialisiert hat mit den Blöcken des angegebenen Typs (IMyTerminalBlock) füllen. Beispiel: 'GridTerminalSystem.GetBlocksOfType<IMySensorBlock>(list)' würde alle Sensoren des Grids in die Liste 'list' schreiben.
      - void SearchBlocksOfName(string name,List<IMyTerminalBlock> blocks, Func<IMyTerminalBlock, bool> collect = null); Ähnlich wie 'GetBlocksOfType'
      - IMyTerminalBlock GetBlockWithName(string name); = Man sollte selbst drauf kommen, was das macht... Ansonsten => Google Translate.

      So, an dieser Stelle hab ich nun keine Lust mehr die Actions zu erklären. Das mach ich evtl. wann anders. Ich kann nur sagen: Die Grundlagen muss man können. Wie man Variablen zuweist und einfache if-else Statements schreibt, werde ich hier nicht erklären. Dazu vielleicht einfach mal 'C# guide' oder 'C# anleitung' oder sowas... Ich hab das jetzt nicht gemacht, aber man sollte fündig werden. Schaden kann es jedenfalls nicht.

      Und ach ja, Quellcode schreibt man üblicherweise in Englisch, also haltet euch dran. Ich lese lieber gebrochenes, halbkorrektes Englisch im Quellcode, als deutsche Variablen- und Methodennamen mit englischen Klassen und Feldern. Was, @ScreechNoizer? :D

      Grüße,
      Space
    • Hey @Spcemarine danke für die tolle Erklärung. Ich bin mir natürlich bewusst das dies nicht einfach ist. Aber ich denke mit dem nötigen Durchhaltevermögen ist alles zu erlernen :D .

      Zumindest habe ich es nun geschafft ein Script zu schreiben mit dem ich meine Türen in Verbindung mit einen Timmerblock automatisch alle paar Sekunden schließen kann.
      Ist schon mal ein Anfang denke ich 8) .

      So kann ich mich nun langsam vorwärts Arbeiten und den Schwierigkeitsgrad erhöhen. Vielleicht später auch mal komplexere Dinge skripten.

      Jedenfalls vielen Dank für die Hilfe.

      Grüße

      Nigel
    • Hallo Zusammen,

      da ich kein neues Thema aufmachen wollte schreibe ich meine Frage einfach hier rein.

      Die Idee ist, dass bei meinem Bergbauschiff ein LCD-Display aufleuchtet, wenn ich den Ejector/ Auswurf aktiviere um beispielsweise überschüssige Steine zu entfernen.

      Bisher habe ich dieses Script zusammengestellt, allerdings klappt das ganze nicht so wie gewollt. Ich bekomme die Fehlermeldung: "Object reference not set to an instance of a object." Vielleicht hat einer von Euch eine zündene Idee oder entdeckt den Fehler:

      ///////

      void Main()
      {
      var LCD1 = GridTerminalSystem.GetBlockWithName("LCD1") as IMyTextPanel;
      var LCD2 = GridTerminalSystem.GetBlockWithName("LCD2") as IMyTextPanel;
      var LCD3 = GridTerminalSystem.GetBlockWithName("LCD3") as IMyTextPanel;
      var Auswurf1 = GridTerminalSystem.GetBlockWithName("Auswurf1") as IMyTerminalBlock;
      var TimerLoop = GridTerminalSystem.GetBlockWithName("TimerAuswurf") as IMyTimerBlock;


      string AuswurfStatus = Auswurf1.DetailedInfo;


      //Auswurf ist an
      if (AuswurfStatus == "Throw Out")
      {
      LCD1.GetActionWithName("OnOff_ON").Apply(LCD1);
      LCD2.GetActionWithName("OnOff_ON").Apply(LCD2);
      LCD3.GetActionWithName("OnOff_ON").Apply(LCD3);
      }



      TimerLoop.GetActionWithName("Start").Apply(TimerLoop);
      }

      ///////

      Danke schonmal im Voraus. :)
    • Sonic schrieb:

      Hallo Zusammen,

      da ich kein neues Thema aufmachen wollte schreibe ich meine Frage einfach hier rein.

      Die Idee ist, dass bei meinem Bergbauschiff ein LCD-Display aufleuchtet, wenn ich den Ejector/ Auswurf aktiviere um beispielsweise überschüssige Steine zu entfernen.

      Hallo Sonic - In deinem Fall geht es doch auch ganz ohne Script:
      Ejectoren auf Auswurf voreinstellen und mit dem LCD-Display in eine Gruppe zusammenfassen.
      Diese Gruppe über Schaltpult, Cockpit etc. on/off toggeln... fertig.

      Will dich nicht unnbedingt vom Scripten abbringen,
      aber manchmal sind die "konventionellen" Methoden recht praktisch. ;)