Armed-Assault.de Twitter
 
 
Themen-Optionen Ansicht
Alt 03.08.2013, 15:16   #1 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Icon5 Script wird nicht vollständig ausgeführt

Hallo Zusammen, habe zwei kleine Problemchen und hoffe mir kann jemand helfen.

Ich habe ein kleines Script für ein Auto geschrieben das diesem eine neue Aktion hinzufügt "Licht Flackern". Das Script funktioniert, es schaltet in einer Endlosschleife das Licht ein und wieder aus, funktioniert soweit ganz gut.

Problem I:
Ich dachte mir ich versuche es das diese Aktion genau dann automatisch ausgeführt wird, wenn ich mit dem Auto einen bestimmten Auslöser betrete.

Doch leider wird das Script nach dem betreten des Auslösers nur bis an die Stelle ausgeführt wo die Bildschirmausgabe "LICHTER FLACKERN" erscheint? Es kommt keine Fehlermeldung, das Script wird wie gesagt gestartet, aber die For-Schleife wird scheinbar zu keinem Zeitpunkt betreten, ansonsten würden die Lichter doch flackern?

Kann mir bitte jemand verraten weshalb das Script vom Auto aus ausgelöst komplett funktioniert, aber vom Auslöser ausgelöst aufeinmal nicht??? :/

Der Auslöser ist wie folgt konfiguriert:
Das Auto ist an den Auslöser gruppiert.
Unter "On Activate" steht folgendes:

[] exec "script.sqf";

Hier das Script:
Code:
//Variablen deklarieren und initialisieren
_i = 0;

player globalChat format["%1","LICHTER FLACKERN!"];

for [{_i=1}, {_i < 10}, {_i=_i+1}] do 
{

    player action ["lightOn", Auto];
    
    //Verzögerungsschleife
    for [{_i=1}, {_i < 5000}, {_i=_i+1}] do 
    {
    };
    
    player action ["lightOff", Auto];

    //Verzögerungsschleife
    for [{_i=1}, {_i < 5000}, {_i=_i+1}] do 
    {
    };

        //Schleife zu einer Endlosschleife machen
        If (_i > 8) then
        {
            _i = 1;                    
        };
};

//Variablen zerstören
_i = nil;
Problem II:
Wie ihr bestimmt schon gesehen habt ist dieses Script eine Endlosschleife, da ich möchte dass das Licht NICHT nach einer gewissen Zeit ausgeht.

Hat jemand eine Idee wie ich ich das Flackern wieder beenden kann, vielleicht mit einer Aktion "Flackern beenden"?

Danke für jede Hilfe!

Geändert von MagicStyle (03.08.2013 um 17:39 Uhr).
MagicStyle ist offline  
Alt 03.08.2013, 20:11   #2 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Icon2 Problem I. Gelöst

Habe ein paar Stunden recherchiert und bin dann doch noch in einem englischem Forum auf die Lösung gestoßen ||

Das Problem liegt an der Anweisung im Auslöser die richtig so lauten muss:

_variable = [Name_des_Autos] execVM "scriptname.sqf";

LG MagicStyle

PS: Mit Problem II. kämpfe ich leider noch immer.

Geändert von MagicStyle (03.08.2013 um 20:25 Uhr).
MagicStyle ist offline  
Alt 05.08.2013, 01:45   #3 (permalink)
Newbie
 
Registriert seit: 14.02.2013
Beiträge: 28
Standard

Dann werde ich mich mal um Problem 2 kümmern.

Code:
aus = 0;

player globalChat "LICHTER FLACKERN!";

while {aus == 0} do //bis der Spieler das Licht ausschaltet, wird das Licht flackern
{
    player action ["lightOn", Auto];
    sleep random 0.5;
    player action ["lightOff", Auto];
    sleep random 0.5;
};
Ich glaube dein Skript war etwas komplizierter, als es nötig war.
Ich weiß ehrlich gesagt nicht, was es mit den Verzögerungswarteschleifen auf sich hatte, aber die sleep Befehle sind eine erheblich simplere Methode. Außerdem habe ich keine feste Wartezeit eingestellt, sondern eine zufällige, wodurch es mehr nach einem Flackern, als nach einem Alarmanlagenblinken aussieht.

Falls unerwünscht, dann einfach das random entfernen und den gewünschten Wert hin schreiben (anstelle 0.5).

Damit sich diese Schleife auflöst, muss die Variable "aus" auf eine andere Zahl als 0 gestellt werden.
Dafür fügst du in den Auslöser, der das Licht auslöst, (oder in einen anderen) das ein:

player addAction ["Flackern beenden!", "aus.sqf"];

In der aus.sqf steht dann Folgendes drin:
Code:
aus = 1;
player removeAction 0;
Somit ist die Schleife beendet und die Action dem Spieler wieder entzogen.
BlitzPacman ist offline  
Alt 07.08.2013, 15:57   #4 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Standard

Hi, Danke für deine Hilfe !

Hatte nicht daran gedacht eine while Schleife zu verwenden. "Sleep" war mit meiner For-Schleife irgendwie nicht kompatibel deswegen habe ich Verzögerungsschleifen eingesetzt.

Achtung Noobfragen! Kannst du mir bitte erklären warum hinter random, "0.5" steht? Ich dachte der Wert ist doch eh zufällig wieso muss man dann noch 0.5 angeben?

Ach ja, und weshalb benötige ich im script "aus.sqf" die zweite Zeile, also: "player removeAction 0;" ? Es reicht doch vollkommen wenn man nur "aus = 1;" schreibt, oder nicht?

Danke nochmal!

Geändert von MagicStyle (07.08.2013 um 16:06 Uhr).
MagicStyle ist offline  
Alt 08.08.2013, 09:51   #5 (permalink)
Newbie
 
Registriert seit: 14.02.2013
Beiträge: 28
Standard

0.5 steht dafür, dass ein Zufallswert von 0 bis 0.5 Sekunden ausgewählt wird. Da kannst du natürlich auch jede andere Zahl einsetzen.

Ansonsten steht noch beim Player da, die Aktion nochmal einzusetzen (ich meine dieses Aktionsfeld), obwohl es nichts bringt, daher ist es doch besser die Aktion wieder zu entfernen, nachdem sie verwendet wurde.

PS: Keine Sorge, ich bin auch bloß ein Noob

Geändert von BlitzPacman (08.08.2013 um 13:23 Uhr).
BlitzPacman ist offline  
Alt 09.08.2013, 05:13   #6 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Icon14 Gelöst

So, jetzt sind alle Fragen geklärt, hab alles verstanden Ich danke dir nochmals herzlich!!
MagicStyle ist offline  
Alt 09.08.2013, 08:54   #7 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 05.11.2011
Beiträge: 235
Icon7 Das Skript

Hallo MagicStyle,

wenn Du dein Skript fertig hast, kannst Du mir das dann bitte mal zeigen? Was Du machst, könnte ich auch ganz gut gebrauchen :-)

Grüße
Sol.LrMartyn
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung
------
https://www.sol-diers.com
Sol.LrMartyn ist offline  
Alt 09.08.2013, 18:13   #8 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Icon5 Brauch doch noch Hilfe .(

Hi Sol.LrMartyn,
ich habe dieses Script nur erstellt um diverse dinge zu begreifen. Da ist nichts interessantes dabei.
Habe lediglich mehrere Fahrzeuge aufgestellt und die Lichter beginnen aufeinmal alle zu flackern sobald ich einen Auslöser betrete.

Habe das mit den mehreren Autos außerdem primitiv gelöst da ich leider noch nicht weiss wie ich es besser machen könnte, vielleicht könntest du oder jemand anderes mir hierbei kurz helfen ?

Hier das Script, nochmal danke an BlitzPacman :
Code:
aus = 0;

player globalChat "LICHTER FLACKERN!";

while {aus == 0} do //bis der Spieler das Licht ausschaltet, wird das Licht flackern
{
player action ["lightOn", Auto01];
player action ["lightOn", Auto02];
player action ["lightOn", Auto03];
player action ["lightOn", Auto04];
player action ["lightOn", Auto05];
player action ["lightOn", Auto06];
player action ["lightOn", Auto07];
player action ["lightOn", Auto08];
player action ["lightOn", Auto09];
player action ["lightOn", Auto10];
player action ["lightOn", Auto11];
player action ["lightOn", Auto12];
player action ["lightOn", Auto13];
player action ["lightOn", Auto14];
player action ["lightOn", Auto15];
    sleep random 0.5;
player action ["lightOff", Auto01];
player action ["lightOff", Auto02];
player action ["lightOff", Auto03];
player action ["lightOff", Auto04];
player action ["lightOff", Auto05];
player action ["lightOff", Auto06];
player action ["lightOff", Auto07];
player action ["lightOff", Auto08];
player action ["lightOff", Auto09];
player action ["lightOff", Auto10];
player action ["lightOff", Auto11];
player action ["lightOff", Auto12];
player action ["lightOff", Auto13];
player action ["lightOff", Auto14];
player action ["lightOff", Auto15];
    sleep random 0.5;
};
Wie Ihr seht habe ich jedes Auto einzeln eingetragen, was sehr mühsam ist weiss jemand wie ich das besser lösen kann? Ich dachte da an eine For Schleife die hinter Auto jeweils eine Zahl anhängt, habe ich mal bei C++ so gemacht um die Hintergrundfarbe eines Konsolenfensters sich wechseln zu lassen ^^, aber weiss nicht wie es hier geht.

Gruß M.S.

Geändert von MagicStyle (09.08.2013 um 18:15 Uhr).
MagicStyle ist offline  
Alt 10.08.2013, 05:53   #9 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Code:
Licht_ein_aus = true;
player globalChat "LICHTER FLACKERN!";
_autos = [Auto01,Auto02,Auto03, usw.];
while {Licht_ein_aus} do //bis der Spieler das Licht ausschaltet, wird das Licht flackern
 {
  {player action ["lightOn", _x]} forEach _autos;
  sleep random 0.5;
  {player action ["lightOff", _x]} forEach _autos;
  sleep random 0.5
 };
http://community.bistudio.com/wiki/Control_Structures
Vienna ist offline  
Alt 10.08.2013, 11:35   #10 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Standard

THX ! So geht das also!
Das Problem das man für Array alle Autos durchnummerieren muss besteht aber leider weiterhin. Vielleicht schreibe ich später mal nen Visual Basic Programm das mir das löst.

Danke!

Geändert von MagicStyle (10.08.2013 um 12:21 Uhr).
MagicStyle ist offline  
Alt 10.08.2013, 12:49   #11 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Es geht natürlich noch einfacher, aber sich wollte dich nicht überfordern. Mit call compile kann man einen String als Code ausführen.

Du musst deine Autos von Auto1 bis Auto15 durchnummerieren.

Code:
for "_i" from 1 to 15 do 
 {
  call compile (format["player action ['lightOn', Auto%1]",_i])
 };
Vienna ist offline  
Alt 10.08.2013, 15:51   #12 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Standard

Das ist genau das was ich wollte ! ) BIG THX!
MagicStyle ist offline  
Alt 12.08.2013, 07:09   #13 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 05.11.2011
Beiträge: 235
Icon5

Code:
for "_i" from 1 to 15 do
Optional dazu löse ich das imme, indem ich das Array pflege und einfach den Inhalt zählen lasse. Ist ja eig auch kein allzugroßes Problem. Gibt es denn nach "Bohemia Interactive" sowas wie "Best Practies" wie von Microsoft für alles was es rausbringt?
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung
------
https://www.sol-diers.com
Sol.LrMartyn ist offline  
Alt 12.08.2013, 10:00   #14 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Standard

"Optional dazu löse ich das imme, indem ich das Array pflege und einfach den Inhalt zählen lasse."

Stimmt, das wäre sogar noch klüger. Könntest du vielleicht ein kleines Beispiel machen? Wäre nice
MagicStyle ist offline  
Alt 12.08.2013, 14:27   #15 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 05.11.2011
Beiträge: 235
Standard

Beispiel kommt sobald ich wieder daheim bin :-)
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung
------
https://www.sol-diers.com
Sol.LrMartyn ist offline  
Alt 12.08.2013, 22:53   #16 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Standard

Danke Wäre super.

Geändert von MagicStyle (12.08.2013 um 23:16 Uhr).
MagicStyle ist offline  
Alt 01.09.2013, 11:51   #17 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 05.11.2011
Beiträge: 235
Icon3

Also wenn ich mich jetzt noch recht entsinne () dann könnte Dir folgendes Beispiel helfen:

PHP-Code:
_array_position = [[17625667], [17665680]];
_int_upperlimit count _array_position;
for [{
_i_temp 0}, {_i_temp _int_upperlimit}, {_i_temp _i_temp 1}] do
{
 
_position_temp _array_position select _i_temp;
 
_unit_temp "B_Heli_Attack_01_F" createVehicle (_position_temp);
 
_unit_temp setDir -70.9884;
}; 
Ich nutze dies deswegen, weil ich ja die Autos in deinem Fall ja mit einem Skript spawnen würde, also wieso dann nochmal manuell zählen?

Hinweis: In diesem Skript ist grade ein Helikopter von ArmA 3 "eingebaut".
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung
------
https://www.sol-diers.com
Sol.LrMartyn ist offline  
Alt 04.09.2013, 09:38   #18 (permalink)
50 Beiträge100 Beiträge
 
Benutzerbild von MagicStyle
 
Registriert seit: 26.09.2012
Beiträge: 120
Standard

Okay danke, kommt zwar ein bisschen spät, aber ich nehme es in meine Dokumentation mit auf
__________________
o
L_
OL
This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat
MagicStyle ist offline  
Alt 04.09.2013, 11:12   #19 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 05.11.2011
Beiträge: 235
Standard

Ich hab ja extra gemeint -> Wenn ich wieder daheim bin...
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung
------
https://www.sol-diers.com
Sol.LrMartyn ist offline  
Alt 04.09.2013, 14:11   #20 (permalink)
50 Beiträge
 
Benutzerbild von [GNC]JamesRyan
 
Registriert seit: 04.11.2009
Ort: Ober-Ramstadt
Beiträge: 79
[GNC]JamesRyan eine Nachricht über ICQ schicken [GNC]JamesRyan eine Nachricht über MSN schicken [GNC]JamesRyan eine Nachricht über Skype™ schicken
Standard

Jop das Beispiel sieht gut aus, Standardfall für eine Schleife über alle Inhalte eines Elementes. Du kannst alternativ die Kurzschreibweise für die for-Schleife nehmen, die finde ich inzwischen schöner und soll ja angeblich auch schneller sein

also

Code:
for "_i" from 0 to (count array)-1 do
{
  wasauchimmer;
};
Und was mir eben einfällt: Noch besser wäre eine for-Each-Schleife, denn dafür ist sie da. Dazu kannst du mit der magischen Variable _forEachIndex die aktuelle Position der Schleife auslesen:

Code:
{
position_temp = _x;
machewasauchimmer;

} forEach array;
Geht ja sogar ohne _forEachIndex, denn du hast die Position ja direkt durch das _x...also echt

Fazit: Du würdest Sol.LrMartyn Codes niemals mit einer for-Schleife machen *g*

Aber das weißt du ja schon, hier wird der Thread langsam unübersichtlich, es ging ja darum, das Array automatisch durch eine for-Schleife erstellen zu lassen, damit du quasi die Variablen Auto1 bis Auto15 automatisch anlegen kannst, ohne sie per Hand schreiben zu müssen. Da hilft dir auch Sol.LrMartyn Code nicht weiter, denn auch da zähle ich ja nur den Inhalt.

Also am besten bei mehreren Objekten:

1. Im Editor einen gleichen Namen mit einer laufenden Nummer geben
2. im Skript oder in der Init.sqf einmal das Array durch eine for-Schleife anlegen mithilfe von format.
3. Im weiteren Verlauf nur mit der Länge über count array arbeiten.
__________________
~[3.JgKp]James~
Kompaniechef | Autor SQF-Handbuch | 3.Jägerkompanie

Geändert von [GNC]JamesRyan (04.09.2013 um 14:17 Uhr).
[GNC]JamesRyan ist offline  
 

Stichworte
auslöser, auto, endlosschleife, flackern, licht


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Beta-Patch für OpA erschienen det99 Community 1429 18.07.2014 16:51
Script wirklich nur auf Server ausgeführt? Sol.LrMartyn Editing & Scripting 1 02.08.2013 14:11
Day & Weather Script Moerderhoschi Editing & Scripting 13 02.12.2012 10:29
Ammobox Script problem G36Firestorm Editing & Scripting 11 18.07.2011 15:04
marker über script erzeugen hypercop Editing & Scripting 2 28.08.2010 22:40


Kontakt - HX3.de - Archiv - Nach oben

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