HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-187/)
-   -   Speed (https://hx3.de/editing-scripting-187/speed-23108/)

JSR 04.11.2013 20:49

Speed
 
Hey! :)

Probiere grade mich in das scripting von Arma reinzufuchsen, weil es einiges leichter macht.
Jetzt probiere ich grade ein bestimmten Sound abzuspielen, wenn der Spieler in einem bestimmten Fahrzeug eine gewisse Geschwindigkeit erreicht hat.
Auf der BIS WIKI habe ich diesen Eintrag dazu gefunden:

http://community.bistudio.com/wiki/speed

Jedoch weiß ich nicht, was dass mit dem Fragezeichen aufsich hat.

"? (speed _truck1) >= 100 : hint "You're going too fast!""

Frage mich sowieso, wieso die ein Fragezeichen in einem Beispiel setzen. Ist ja gar nicht verwirrend für Anfänger! :)


Wozu das Fragezeichen ist weiß ich jedenfalls nicht. Habe den Script jetzt mal in eine Testmission integriert und die Aussage "You're going to fast" kommt andauernd. Egal wie schnell ich bin.

Da ich den Script Command von einer offiziellen BIS WIKI Seite habe, frage ich mich wa sich als Anfänger falsch mache.

Habe auch schon ein wenig rumprobiert. Also das > verändert usw..

Buliwyf 04.11.2013 21:38

? bedeutet if
: bedeutet then

:ugly:

JanIs 04.11.2013 21:39

Das ist offensichtlich noch ein "altes" sqs Script.
Das "?" stand für das "wenn", ist also das Gleiche wie das "if" in einem sqf Script.

Sieh mal hier ...

JSR 04.11.2013 21:43

Erstmal danke für die schnellen Antworten und danke für den Link! :daumen:

Okay verstehe! Also muss die Config so aussehen?

Zitat:

_vehicle=vehicle (_this select 0);

if (speed _vehicle) >= 100 then {hint "You're going too fast!"};

PS: Funktionieren tut es mit dieser Eingabe in die Script.sqf nämlich nicht.

Mir gehen die TrynError Versuche langsam aus, weil mir nichts mehr einfällt.

JanIs 04.11.2013 21:54

Völlig korrekt ...

Du kannst aber auch die Abfrage etwa in einem Auslöser direkt durch Eingabe des Fahrzeugnahmes abfragen.
Also wenn dein Fahrzeug den Namen Truck1 hat dann einfach:

als Bedingung: (speed Truck1) >= 100
bei Akt: hint "You're going too fast!"

oder in einem Script, etwa einer Film-Zwischensequenz, Intro, Outro oder was auch immer:
if (speed Truck1) >= 100 then {hint "You're going too fast!"};

JSR 04.11.2013 22:01

Mh, wieso funktioniert es nicht?

Vielleicht weil _Vehicle=Vehicle (ich probiere es im Little Bird aus) nicht präzise genug definiert ist für den Script?
Muss ich noch woanders irgendwas zuweisen?

PS: @JanIs,

Ich will es eigentlich weiter über SQF machen, weil ich später wenn ich mehr Erfahrung habe, den Script über eine Config aktivieren will.

JanIs 04.11.2013 22:08

Erstmals siehe meine Antwort über deiner Frage.

Zweitens kommt es drauf an wie du das Script aufrufst.
Wenn du es aufrufst, dein Littlebird aber langsamer ist, dann kann sich ja auch nichts tun, da die Bedingung (schneller oder gleich 100 km/h) zu fliegen noch nicht zutrifft.
So gesehen müsstest du es entweder in eine Auslöser packen oder die Bedingung oder Abfrage im Script in einer Schleife laufen lassen damit die hint-Meldung ausgegeben kann, wenn dann tatsächlich die Geschwindigkeit erreicht oder überschritten wurde.

Ich hoffe das war verständlich genug.

Greetz
Jan

JSR 04.11.2013 22:12

Ja aber ich erreiche ja die Geschwindigkeit über 100. Habe sie jetzt auf 50 verändert. Habe halt eine Testmission mit einem LittleBird erstellt.

Dein Post habe ich übrigens gesehen aber ich möchte das lieber doch gerne in einer SQF machen, weil ich dadrauf später angewiesen bin. Möchte nämlich über die Configs Scripte aktivieren. Wie in einem Addon. :)

Und "If (speed _vehicle) >100 then {hint "Test"}; ist doch die Script Schleife, die du meinst, oder?

JanIs 04.11.2013 22:22

Pass mal auf:

1. Erstelle das Script mit folgendem Inhalt:
Code:

_vehicle = vehicle (_this select 0);
while {speed _vehicle < 50} do {
    sleep 1;
};
hint "You're going too fast!";

Dieses rufst du per Eingabe in die Initzeile des Littlebirds folgendermaßen auf:
gogo=[this] execVM "name_deines_scriptes.sqf"

Jetzt prüft er in einer Schleife von einer Sekunde ob die Geschwindigkeit von 50 km/h erreicht ist. Wenn ja springt das Script aus der Schleife und gibt die Hint-Meldung aus.

Alternativ ginge auch statt der Sekundenschleife ein
Code:

waitUntil {speed _vehicle > 50};
Dabei wird eigentlich statt der Abfrage alle Sekunden in einem Millisekundenabstand geprüft ob die Bedingung erfüllt ist.
In beiden Fällen pausiert das Script bis die Geschwindigkeit überschritten wurde ...


So wie in deiner Zeile KANN es nicht funktionieren, da in dem Moment, indem das Script die Abfrage erstellt, die Geschwindigkeit ja nicht erreicht sein kann und dementsprechend die Meldung wegen der nicht zutreffenden Abfrage nicht ausgegeben wird.
Außer du rufst das Script erst auf wenn du über 100 fliegst. Dazu benötigst du aber wiederum einen Auslöser ;-)

JSR 04.11.2013 22:30

Okay cool, der erste Test hat funktioniert. War über 50 und dann hats funktioniert! Werde jetzt erstmal ein wenig rumprobieren damit, danke für die Bereitschaft zu helfen! Super. :daumen: :cool:

Muss mich da erstmal richtig reinfuchsen und die Logik und die Befehle verstehen. Das dauert natürlich ein wenig.

Was bedeutet denn eig. "(_this select 0)"?

JanIs 04.11.2013 22:38

Ich hoffe ich verzapfe jetzt keinen Schmarrn, aber _this select 0 steht für das erste Argument, welches das Script ausführt.
Im vorliegenden Fall das [this] oder [Littlebird].
Begonnen wird nicht mit 1 sondern immer mit 0. Beeinhaltet das Script ein weiteres Argument, beispielsweise die Geschwindigkeit, wäre das dann _this select 1

Code:

_vehicle = vehicle (_this select 0);
_maxtempo = _this select 1;

while {speed _vehicle < _maxtempo} do {
        sleep 1;
};
hint "You're going too fast!";

aufgerufen dann als gogo = [this,100] execVM "dein_script.sqf";


Das Ganze macht aber nur Sinn, wenn das Script für mehrere Fahrzeuge verwendet wird. Bei einmaliger Verwendung in einer Filmsequenz oder dergleichen genügt eigentlich wie oben schon angeführt die direkte Ansprache per
Code:

while {speed littlebird1 < 100} do {   
    sleep 1;
};
hint "You're going too fast!";


Ich denke aber, du hast jetzt das Prinzip der while-Schleife verstanden und auch, warum dein Script die Hint-Meldung nicht ausgegeben hatte.

JSR 04.11.2013 22:42

Okay, also eine Art Inhaltsverzeichnes für Variabeln?


Ja, so zum Teil schon. Mir ist zwar klar was du meinst aber das If und Then Prinzip ist seitdem etwas unverständlich für mich.
Für mich hieß es

Falls _vehicle eine Geschwindigkeit über 50 KmH erreicht, so hint "Text";

Aber While und Do sind also allgemein für Schleifen verantwortlich, oder?

JanIs 04.11.2013 22:51

Ja genau.

Du musst dir einfach folgende Situation vorstellen:

1. Du rufst dein Script am Beginn der Mission oder mittels Auslöser auf
2. Dein Script fragt nach ob eine Bedingung zutrifft
3. Wenn ja --> Hint, wenn nein passiert logischerweise gar nichts.

Da du keine Schlaufe hattest, die Geschwindigkeit beim Start des Scripts jedoch niedriger war, konnte auch keine Meldung kommen.
Aus dem Grunde die Schlaufe damit das Script so lange läuft und warten kann, bis das Argument eintritt.

Praktisch wie ein Auslöser der die Hint-Meldung ja auch erst ausgeben wird, wenn die Geschwindigkeit tatsächlich erreicht wurde. Die Prüfung der Bedingung im Auslöser läuft ja auch ständig im Hintergrund ...

JSR 04.11.2013 22:55

Okay ich verstehe! :)
Nochmal Danke für deine Mühe.

Mein Ziel ist eigentlich über einen Script einen bestimmten Sound im Cockpit des LBs abzuspielen, sobald eine bestimmte Geschwindigkeit in einer gewissen Höhe erreicht ist. Bin seit über einem Jahr beschäftigt eine Sound Mod herzustellen und alleine und ohne Scripterfahrung ist das ganz schön mühsam, wenn man sich so manche Ziele gesetzt hat.
Deswegen finde ich es immer gut wenn mir hier geholfen wird.

JanIs 04.11.2013 22:58

Na Bumm, da hast du dir ja was vorgenommen ...
Gleich einen Mod zu basteln finde ich schon als recht hochgestecktes Ziel.

Wünsche dir viel Glück und gutes Gelingen.
Viel Zeit und Geduld hast du ja offensichtlich, nachdem du schon so lange daran herumwerkelst. :daumen:

Greetz
Jan

JSR 04.11.2013 23:01

Ja und leider nie was rausgebracht.
Hab bestimmte Ziele und bin aufgrund der fehlenden Kenntnisse manchmal demotiviert oder weiß einfach nicht weiter.
Habe halt manchmal die Nase voll gehabt und dann aber doch immer wieder angefangen. Deswegen ist es mir manchmal schon peinlich hier nach Hilfe zu fragen. :zahn:

PS: Danke! :)

JeeperCreeper 05.11.2013 00:21

Zitat:

Zitat von JSR (Beitrag 463146)
Erstmal danke für die schnellen Antworten und danke für den Link! :daumen:

Okay verstehe! Also muss die Config so aussehen?
Zitat:

_vehicle=vehicle (_this select 0);

if (speed _vehicle) >= 100 then {hint "You're going too fast!"};

PS: Funktionieren tut es mit dieser Eingabe in die Script.sqf nämlich nicht.

Mir gehen die TrynError Versuche langsam aus, weil mir nichts mehr einfällt.

Hallo erstmal, da ich auch erst ungefähr vor einem Monat angefangen habe mit dem Scripten, würde ich Dir gerne einen Tipp geben der das Scripten um einiges leichter macht, falls Du ihn nicht schon kennst.
Wenn du deine Arma.exe mit dem angehängten Parameter "-showScriptErrors" startest, dann werden Dir sofort alle deine Scriptfehler die du im Script hast mit Angabe der Line angezeigt. Somit weisst du sofort wo der Fehler steckt und manchmal steht dort sogar was falsch ist.

Nun zu der if-Bedingung. Eine if-Bedingung erwartet zwingend ein Boolean Wert in den runden Klammern. Das heißt, entweder ein "true" oder ein "false".
Du hast jetzt hingeschrieben, wenn (geschwindigkeit _auto) >= 100 dann.....
Wie gesagt braucht die if-Bedingung einen Wahrheitswert in den Klammern. Und bei (geschwindigkeit _auto) kann ja kein Wahrheitswert rauskommen. Also müsstest du auch noch die Zahl mit rein nehmen in die Klammer und richtig wäre dann.
Wenn (geschwindigkeit _auto >= 100) dann....
So kriegst du ja ein "true" oder "false" raus.

Am besten du guckst mal hier rein. Da steht alles super genau beschrieben. Damit hab ich schon jede Menge gelernt, obwohl ich nix mit Programmieren am Hut hatte vorher. Da wird auch erklärt wie man sich auf der Wiki-Seite zurecht findet, wo die ganzen Befehle erklärt sind.
Ja dann mal Viel Erfolg noch:daumen:

JSR 05.11.2013 00:28

Danke für die Tipps und sehr vielen Dank für das Tutorial! :) Werde ein wenig rumprobieren und dann wieder Feedback hier geben! Thx! :daumen:

JSR 05.11.2013 22:11

Okay, soweit so gut! :)

Wenn ich das ganze wiederholen will... Sprich, der Spieler erreicht im LB die Geschwindigkeit 50, der Ton wird abgespielt, er geht mit der Geschwindigkeit runter auf 40 und dann wieder auf 50 und der Ton wird wieder abgespielt, muss ich dann die _i commands verwenden?

Mit while und do klappt zwar alles, der script bleibt aber einmalig. Bei nochmaligen überschreiten des Tempos passiert nichts mehr.

JeeperCreeper 06.11.2013 00:41

Ich weiss jetzt nicht wie du das mit dem Ton machst, aber hier mal ein Beispiel wie es ohne geht, gerade getestet klappt wunderbar mehrmals.

In die Init des Vehicles kommt das rein:
Code:

temp = [this] execVM "tempo.sqf";
Das Script heißt "tempo.sqf" und da rein kommt folgendes:
Code:

if (!isServer) exitWith {};
 
private ["_veh"];
 
_veh = _this select 0;
 
while {true} do
{
  if (speed _veh >= 50) then {hint "Du fährst zu schnell!"; sleep 5; hint ""}
};

Sobalt man jetzt mit dem Vehicle über 50 km/h kommt, kriegst du die Meldung für 5 Sek. eingeblendet. Über sleep kannst du die Meldung natürlich auch länger einblenden lassen.
Wenn du jetzt wieder unter die 50km kommst und nochmal drüber, kriegst du die Meldung wieder angezeigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 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