HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Ampelschaltung (https://hx3.de/editing-scripting-167/ampelschaltung-21074/)

Drunken Officer 28.10.2011 13:58

Ampelschaltung
 
Hallo.

Ich habe ein 3D Model. In diesem befindet sich ein großes Tor und daneben eine Ampel.
Diese Ampel soll rot leuchten solange das Tor geschlossen ist oder es im Begriff ist, sich zu öffnen oder zu schliessen.
Die Ampel darf nur grün leuchten wenn das Tor offen ist. (animation = 1)

Die hiddenSelections funktionieren alle. Irgendetwas stimmt mit meinen Script nicht, da ich immer nur eine Farbe angezeigt bekomme. Je nach dem wie ich das script schreibe, wird immer die zuletzt definierte Farbe angezeigt.

der EventHandler in der configg.cpp
Code:

class EventHandlers
          {
              init = "_this exec ""\polizei\data\garagenlicht.sqs""; ";
                          };

Ich starte es, weil ich von Anfang an die Farbe benötige. Würde ich den settexture-befehl erst im Statement aufrufen, würde ich auch erst dann eine Farbe bekommen.
Hier ist mein script:

Code:

hint "los gehts";
_blah = _this select 0;
_anim = _this animationPhase ""door_pb_aussenhof"";
{
while {_anim != 1 and _anim !=0} do
{
if(_anim < 1) then {
_blah setobjecttexture [0, "\polizei\grafik\lichtrot.paa"]
}else{
_blah setobjecttexture [0, "\polizei\grafik\lichtgruen.paa"]
};
};
};

Kann mir jemand helfen?

Pfandgiraffe 28.10.2011 14:22

Grundsätzlich versuchst du hier erstmal ein .sqs zu öffnen in welchem aber .sqf scriptsprache enthalten ist. Ich hab eigentlich keine ahnung von object scripting an selbst erstellten objekten ... habe ich noch nie gemacht. aber nach meinem verständniss sollte das so aussehen:

Aufruf:
Code:

class EventHandlers {
    init = "[_this] execVM '\polizei\data\garagenlicht.sqf';";
};


Script:
Code:

private ["_blah","_anim","_str"];
hint "los gehts";
_blah = _this select 0;
_anim = _blah animationPhase 'door_pb_aussenhof';

waitUntil {_anim == 1 || _anim == 0};
_str = switch (true) do {
    case (_anim == 1) : {'\polizei\grafik\lichtrot.paa'};
    case (_anim == 0) : {'\polizei\grafik\lichtgruen.paa'};
};
_blah setobjecttexture [0, _str];



wie wurden denn deine anim phasen definiert? wo ist die ausgangslage des tores? (oofen/geschlossen) animation speed? ich bin mir mit dem WaitUntil nicht sicher... das ist bestimmt nicht richtig die sache zeitabhängig zu machen.



edit: noch ein stichwort: hiddenSelection?

Drunken Officer 28.10.2011 14:55

Die hiddenSelection funktioniert. es liegt halt am script. Ich werde deine Variante jetzt gleich einmal probieren. Sieht schon mal recht interessant aus.

initPhase=0 (ausgangslage, Tor geschlossen)
initPhase=1 (endlage, Tor offen)
animPeriod=7

Vienna 28.10.2011 18:45

Du nimmst einfache, dann aber doppelte Anführungszeichen.

Versuche einmal dir anzeigen zu lassen was die Variable _anim enthält (fette Zeilen einfügen, falls das so erlaubt ist).

Zuerst einmal nur die erste fette Zeile. Wenn dort ein brauchbarer Wert rauskommt, dann die zweite Zeile einfügen.

Code:

hint "los gehts";
_blah = _this select 0;
_anim = _this animationPhase ""door_pb_aussenhof"";
player groupChat format['_anim = %1',_anim];
{
 while {_anim != 1 and _anim !=0} do
  {
  player groupChat format['_anim = %1',_anim];
  if(_anim < 1) then
    {
    _blah setobjecttexture [0, "\polizei\grafik\lichtrot.paa"]
    }
  else
    {
    _blah setobjecttexture [0, "\polizei\grafik\lichtgruen.paa"]
    };
  };
};


AHTNTEPPOP 28.10.2011 19:33

Ich hab mal eben aus Ameplschaltung Ampelschaltung gemacht.:)

Drunken Officer 28.10.2011 23:07

Da es mein erstes script ist und es immer noch nicht klappt.
Ich arbeite mit Nodpad ++

Muss eine *.SQF eine bestimmte codierung haben?

Die config.cpp ist in UTF-8. Meine *-sqf ist in ANSI. Nicht das da irgendwo der Fehler steckt.

Asso-Loki 28.10.2011 23:27

Zitat:

Zitat von Drunken Officer (Beitrag 392550)
Da es mein erstes script ist und es immer noch nicht klappt.
Ich arbeite mit Nodpad ++

Muss eine *.SQF eine bestimmte codierung haben?

Die config.cpp ist in UTF-8. Meine *-sqf ist in ANSI. Nicht das da irgendwo der Fehler steckt.

Nein, keine Sorge, das ist egal. Du kannst übrigens die Kodierung in Notepad++ problemlos im gleichnamigen Menü nach belieben umstellen und unter Einstellungen auch vorgeben dass alle neuen Dateien die Du damit erstellst automatisch eine bestimmte Kodierung erhalten.

Ein Vorteil der UTF-8- Kodierung ist es, dass damit bei Verwendung von Umlauten bei Ausgaben in ArmA2 (hint, sidechat, cutText, Actionsmenüs, usw.) diese im Game auch so ausgegeben werden. Bei ANSI- Kodierung werden die Umlaute bei Ausgaben im Game nicht angezeigt.
Abgesehen davon funktionieren .sqf / .cpp Files in beiden Kodierungen (ANSI / UTF-8) problemlos.

TeRp 29.10.2011 09:09

Die while-Bedingung ist Murks...

Saint 29.10.2011 09:25

Zitat:

Zitat von TeRp (Beitrag 392566)
Die while-Bedingung ist Murks...

Lieber TeRp,

dann laß uns doch an Deiner unendlichen Weisheit und Güte teilhaben, und erhelle den Horizont für uns Geschmeiß...;)

TeRp 29.10.2011 11:27

Mimimi. Na gut, noch ein heißer Tipp.

Sobald die While-Bedingung nicht erfüllt => While-Schleife wird beendet.

Den Rest müsst ihr schon selber rausfinden. :confused:

Drunken Officer 29.10.2011 17:43

Zitat:

Zitat von TeRp (Beitrag 392577)
Mimimi. Na gut, noch ein heißer Tipp.
Sobald die While-Bedingung nicht erfüllt => While-Schleife wird beendet.
Den Rest müsst ihr schon selber rausfinden. :confused:

Könntest du mir einen Tipp mehr geben. Ich bin blutiger Anfänger, was das scripten angeht.
Ich hatte an eine IF THEN ELSE Schleife gedacht. ICh glaube das muss mittels loop wiederholt werden. Wenn ich den Befehl richtig verstanden habe.

Asso-Loki 29.10.2011 23:52

Bei Deinem Eventhandler in der config.cpp müsste vermutlich ein "this" und nicht ein "_this" verwendet werden. Check das mal ab, indem Du zu Beginn des Scripts folgende Zeile setzt (Viennas Tipp)
Code:

player groupChat format ["%1", (typeOf _this)];
. Wird tatsächlich das benötigte Objekt übergeben? (typeOf liefert den Class- Namen des Objekts zurück. Da Du die Classe ja selbst erstellt hast in der config.cpp, wirst Du sofort wissen, ob dass übergebene Objekt tatsächlich Jenes ist welches Du brauchst).
Nachdem Du sicher bist dass das klappt, kannst Du dieses Zeile wieder aus dem Script löschen.

Verwende sqf statt sqs, sonst klappt es mit den im Script verwendeten Befehlen nicht (siehe Psychobastards Hinweis).
Code:

class Eventhandlers
    {
    init = "this execVM '\polizei\data\garagenlicht.sqf';";
    };

garagenlicht.sqf
Code:

hint "los gehts";
//das Tor ist zu Beginn ja geschlossen, daher ist die Ampel zu beginn auch auf rot
_this setobjecttexture [0, "\polizei\grafik\lichtrot.paa"];
//für Dauerbetrieb wird eine while- Schlaufe gestartet.
// "true" ist eine sehr heikle Bedingung für eine Schlaufe, aber hier sollte es klappen und was anders kommt mir gerade jetzt nicht in den Sinn...es ist schon spät
while {true} do
    {
    // warten bis das Tor ganz offen ist, erst dann wird auf grün geschalten
    waitUntil {(_this animationPhase "door_pb_aussenhof") == 1};
    _this setobjecttexture [0, "\polizei\grafik\lichtgruen.paa"];
    // warten bis sich das Tor beginnt zu schliessen um auf rot zu schalten
    waitUntil {(_this animationPhase "door_pb_aussenhof") < 1};
    _this setobjecttexture [0, "\polizei\grafik\lichtrot.paa"];
    //nun springt das Script wieder an den Beginn der while- Schlaufe und wartet wieder darauf dass das Tor ganz offen ist.
    };


Vienna 29.10.2011 23:54

Hast du nicht ausprobiert was ich dir in Post #4 vorgeschlagen habe?

Du musst einmal prüfen was in der Variablen steht, die du als Bedingung für die while Schleife verwendest.

Dann wirst du vielleicht auch draufkommen, dass du diese Variable in der Schleife aktualisieren musst. Sonst kommst du aus der Schleife nicht mehr raus.

Drunken Officer 30.10.2011 01:04

Vienna, ich habe dein Vorschlag ausprobiert. ich habe die es ausprobiert. Leider blieb das script "hängen". Ich habe zum testen ein zählscript (hint, sleep) eingefügt, dies wurde schon nicht mehr ausgeführt.

Ich werde heute den Vorschlag von "Asso-Loki" prübieren.

Vienna 30.10.2011 09:08

Wenn in dieser Routine nur Befehle wie in einer "echten Funktion" zulässig sind, dann wird auch die while-Schleife auf 10000 Durchläufe begrenzt sein.

In einer "echten Funktion" sind Befehle, welche die Funktion stoppen (wie z.B. sleep, waitUntil) und Befehle die die Funktion "verlassen", nicht erlaubt. While-Schleifen sind auf 10000 Durchläufe begrenzt. Das alles um die Game-Engine stabil zu halten, da solche Funktionen den Programmlauf sonst "blockieren". Da sind auch Kommentare mit // nicht erlaubt.

Das würde bedeuten, es ist nicht möglich ein solches "Skript" an dieser Stelle einzubinden.

Ist aber nur eine Vermutung. Wie das in einem 3D Model zu programmieren ist, da kenne ich mich nicht aus.

Asso-Loki 30.10.2011 09:30

@ Drunken Officer

Es ist Morgen, ich bin ausgeschlafen und entsprechend kann ich auf meinen vollen IQ von 2 (aufgerundet) zurückgreifen.

Ich würde die ganze Sache ganz anders anpacken. Die Zuweisung der Ampellichttextur würde ich ganz normal in der config.cpp des Modells unter class Useractions - class OpenDoor / CloseDoor (oder wie immer Du dieses Classes benannt hast) - statement erledigen.

Bei der class Eventhandlers würde ich dann den init nur dazu verwenden, die Ampellichtextur auf rot zu stellen, damit von Anfang an das passende Licht angeht.

Ich denke das ist die sauberste Lösung.

Edit:
Beispiel
Code:

class Eventhandlers
    {
    init = "this setobjecttexture [0, '\polizei\grafik\lichtrot.paa'];";
    };

Unter class Useractions - class zum öffnen des Tores
Code:

statement = "this animate ['door_pb_aussenhof', 1]; this setobjecttexture [0, '\polizei\grafik\lichtgruen.paa'];";
class zum schliessen des Tores
Code:

statement = "this animate ['door_pb_aussenhof', 0]; this setobjecttexture [0, '\polizei\grafik\lichtrot.paa'];";
Edit:
@ Vienna
Deine Sorgen sind unbegründet. Wohl verwendet das Script den gleichen Syntax wie eine Funktion (sqf), aber es wird eben als Script (execVM) und nicht als Funktion (call / spawn) benutzt. Deshalb sind sleep / waituntil kein Problem, ebenso wenig wie dabei die Kommentare (//) stören, welche er ja hoffentlich eh daraus gelöscht hätte, da sie ja nur quasi als einmalige Erklärung gedacht sind.
Der Status eines Script bleibt unberührt von seinem Aufruf- Ort. Es ist also egal, ob ein Script von einem Auslöser, einer Objektinitzeile, einem anderen Script oder eben einer Modell- config aus gestartet wird.
Die while- Schlaufe würde auch gemäss meines Info- Standes "bloss" 10000 mal durchlaufen, was aber im Kontext dieser Problemstellung nahezu irrelevant ist, da es extremst unwahrscheinlich ist, dass das Tor innerhalb eines Szenariums 10000 mal geöffnet / geschlossen wird.

Abgesehen davon finde ich aber - wie oben schon dargelegt - die bisher hier verfolgten Lösungsansätze - natürlich meinen inklusive - Blödsinn. Selbst wenn eine der bisher vorgeschlagenen Script- Lösungen zum funktionieren kommen würde, fände ich es einen Murks, unsauber, unbefriedigend.

Drunken Officer 30.10.2011 10:24

Wenn ich es im Statement aufrufe, dann wird die Farbe sofort gewechselt. Also würde es schon grün sein, wenn es im Begriff ist zu öffnen. Diesen Versuch habe ich schon hinter mir.

Ich schraube mal noch bissel dran rum. Versuch macht klug.

Vienna 30.10.2011 10:36

Zitat:

Zitat von Asso-Loki (Beitrag 392659)
..., aber es wird eben als Script (execVM) und nicht als Funktion (call / spawn) benutzt. ...

Wenn es als "normales Skript" behandelt wird, dann ist schon seltsam warum keine Textausgaben möglich sind.

Drunken Officer 30.10.2011 11:04

kann man diesen "waituntil" befehl auch ins Statement einarbeiten? Dann sollte die Varinate von Asso-loki funktionieren

Vienna 30.10.2011 11:30

Eher nicht, aber probier es aus. Speichere aber zuvor alles ab! Zumindest Arma wird einfrieren (oder schließen), wenn es nicht erlaubt ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:06 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119