28.10.2011, 13:58 | #1 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.110
|
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""; "; }; 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"] }; }; }; Geändert von AHTNTEPPOP (28.10.2011 um 19:32 Uhr). |
28.10.2011, 14:22 | #2 (permalink) |
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?
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ Geändert von Pfandgiraffe (28.10.2011 um 14:25 Uhr). |
|
28.10.2011, 14:55 | #3 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.110
|
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 |
28.10.2011, 18:45 | #4 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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"] }; }; }; |
28.10.2011, 23:07 | #6 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.110
|
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. |
28.10.2011, 23:27 | #7 (permalink) |
Registriert seit: 01.06.2009
Beiträge: 103
|
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. |
29.10.2011, 09:25 | #9 (permalink) |
Registriert seit: 04.01.2008
Alter: 50
Beiträge: 314
|
Lieber TeRp, dann laß uns doch an Deiner unendlichen Weisheit und Güte teilhaben, und erhelle den Horizont für uns Geschmeiß...
__________________
"Um nirgends eine gähnende Leere zu lassen, wollen wir uns vorstellen, daß aller Orten und zu jeder Zeit etwas Wahrnehmbares vorhanden ist. Um nicht Materie oder Elektrizität zu sagen, will ich für dieses Etwas das Wort Substanz brauchen." Hermann Minkowski
|
29.10.2011, 17:43 | #11 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.110
|
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. |
29.10.2011, 23:52 | #12 (permalink) |
Registriert seit: 01.06.2009
Beiträge: 103
|
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)]; 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';"; }; 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. }; |
29.10.2011, 23:54 | #13 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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. |
30.10.2011, 01:04 | #14 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.110
|
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. |
30.10.2011, 09:08 | #15 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
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. |
30.10.2011, 09:30 | #16 (permalink) |
Registriert seit: 01.06.2009
Beiträge: 103
|
@ 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'];"; }; Code:
statement = "this animate ['door_pb_aussenhof', 1]; this setobjecttexture [0, '\polizei\grafik\lichtgruen.paa'];"; Code:
statement = "this animate ['door_pb_aussenhof', 0]; this setobjecttexture [0, '\polizei\grafik\lichtrot.paa'];"; @ 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. Geändert von Asso-Loki (30.10.2011 um 10:14 Uhr). |
30.10.2011, 10:24 | #17 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.110
|
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. |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|