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.. |
? bedeutet if
: bedeutet then :ugly: |
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 ... |
Erstmal danke für die schnellen Antworten und danke für den Link! :daumen:
Okay verstehe! Also muss die Config so aussehen? Zitat:
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. |
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!"}; |
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. |
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 |
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? |
Pass mal auf:
1. Erstelle das Script mit folgendem Inhalt: Code:
_vehicle = vehicle (_this select 0); 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}; 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 ;-) |
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)"? |
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); 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 { Ich denke aber, du hast jetzt das Prinzip der while-Schleife verstanden und auch, warum dein Script die Hint-Meldung nicht ausgegeben hatte. |
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? |
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 ... |
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. |
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 |
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! :) |
Zitat:
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: |
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:
|
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. |
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"; Code:
if (!isServer) exitWith {}; 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