Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

26.04.2014, 15:16

Dir wird definitiv besser geholfen, wenn du cpp-tags benutzt und uns entweder sagst, was "object7", "object8", "Path2", "path_position", etc. ist.
Wenn du uns mehr Code gibts, können wir das vllt. auch besser erkennen!

Welche Programmiersprache ist das überhaupt?
Möglicherweise eine Programmiersprache, in der es einen Unterschied zwischen Vergleichs und Zuweisungsoperator gibt? Dann wäre (path_position = 1) immer wahr.

Weitere Information zum Debuggen findest du hier:
http://www.dotnetperls.com/debugging
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

22

26.04.2014, 15:21

Die Objekte sind eigentlich nicht von Bedeutung: Object0 ist das Auto selbst, die anderen Elemente sind nur die Buttons im Menü und die funktionieren einwandfrei.

Die Programmiersprache ist soweit ich das weiß eine eigens (weiter) entwickelte. Ich zitiere hierfür einfach mal wiki: "Game Maker Language (GML) is the primary scripting language that is interpreted similarly to Java's Just-In-Time compilation used in GameMaker"

Vom Gefühl her was zwischen Basic und Java. Aber es geht eh nur um Variablen (bei meinem Problem). Das einzige Element, das programmiertechnisch interessant ist, ist wohl die "Path_position", die von 0 bis 1 zählt, je nach dem wie weit fortgeschritten das Fahrzeug (Object0) auf dem Pfad ist (0 = Anfang der Runde, 1 = Ende).

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

23

26.04.2014, 15:28

Sorry, aber ganz ehrlich? Wenn Du mit dem Debugger durchgehen würdest und die Werte der Variablen überwachen würdest, dann würdest Du ganz eindeutig erkennen wo deine Werte plötzlich Mist werden und warum. Eventuell solltest Du auch überlegen, ob Du hier tatsächlich Werte zuweist oder nur Referenzen verschiebst. Denn dann wäre ganz schnell Ärger unterwegs, wenn Du Referenzen verschiebst und irgendwo anders neue Werte zuweist. Dann ändern sich plötzlich nämlich mehrere Variablen auf einmal.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

24

26.04.2014, 15:45

Also ich verstehe echt nicht was du meinst. Ich habe den Debugger benutzt und so das erfahren, was ich bereits vermutete: TyreUse3 wird Null, weil beide Summanden (TyreUse3 selbst, das zuvor noch einen positiven Wert hatte sowie TyreUse2, was ich nachvollziehen kann, weil es von TyreUse abhängt und dieser bei Path = 0 auch kurzzeitig 0 wird) 0 ergeben, was jedoch keinen Sinn ergibt, weil ich doch extra diese ganzen TyreUse-Variablen eingeführt habe (deshalb auch keine "Namen", da sie alle für den gleichen Prozess da sind, nur eine Variable von zuvor speichern), damit der Wert von davor gesichert und mit in die nächste Runde übernommen wird. Das funktioniert aber nicht und ich habe gehofft, dass ihr spontan seht warum das so ist (entweder aus einem logischen Grund oder einem der Engine).

Wenn ihr es auch nicht herausfindet, dann ist das ja auch eine Antwort. Dann werde ich mal den Support der Game Maker anschreiben, vielleicht hat es wirklich was mit der Path_position zu tun.

25

26.04.2014, 16:26

Was mir grad spontan auffällt:

Quellcode

1
2
3
4
timer7 = 2
if timer7 = 0 {
Path2 = 0 //Pfad-Variable wird zurückgesetzt, um bei der nächsten Veränderung wieder auf 0 zu sein
}


was soll denn das? Die Bedingung wird nie erfüllt.

Erkunde dich bitte darüber, wie man mit dem Debugger in GM:S umgeht:
http://www.yoyogames.com/tech_blog/35

Setze Breakpoints auf jede Zeile und sage uns, welchen Wert jede einzelne Variable in jeder einzelnen Zeile hat.

Ansonsten kommen wir durch raten hier nicht weiter.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

26

26.04.2014, 16:42

Ach den Teil des Codes habe ich vergessen (hier zu schreiben). Die Timer nehmen natürlich für jeden Step ab, die Bedingung wird erfüllt, sonst würde der Summand ja auch nie 0 werden.

Ich sehe doch wann die Werte sich wie entwickeln: Ich lasse sie direkt auf den Screen ausgeben. Ich kann auch ein Video davon machen, das wird aber an meiner Aussage nichts ändern: DIE VARIABLE WIRD NULL WENN DAS AUTO DIE LINIE ÜBERQUERT, ALSO EINE NEUE RUNDE GESTARTET WIRD, ALSO PATH_POSITION = 0 WIRD.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Razor« (26.04.2014, 16:54)


Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

27

26.04.2014, 17:15

Es gibt zwei Möglichkeiten.
Entweder willst du dir nicht helfen lassen, weil du darauf beharrst, dass du keine Fehler machst und dass ein Bug in der Engine vorliegt. Dann erstelle ein reproduzierbares Minimalbeispiel und melde den Bug beim Entwickler.

Oder du willst dir helfen lassen und hörst auf erfahrenere Stimmen, die dir sagen, dass es wahrscheinlicher ist, dass du einen Fehler machst als dass ein Fehler in der Engine vorliegt. Und mir ist klar, dass du den Debugger benutzt hast, aber das heißt eben nicht, dass du ihn auch richtig benutzt hast. Wenn Variablen plötzlich Werte annehmen, die sie nicht annehmen sollen und man nicht weiß woher diese Werte kommen, dann ist ein Debugger genau das Mittel der Wahl, um herauszufinden *warum* das so ist. Es geht also nicht darum, dass du dir ansiehst, dass es passiert, sondern dass du mit dem Debugger nachvollziehen kannst warum es passiert und du dann auch schneller den Fehler findest, den du gemach hast.

Zitat von »Razor«


Ach den Teil des Codes habe ich vergessen (hier zu schreiben). Die Timer nehmen natürlich für jeden Step ab, die Bedingung wird erfüllt, sonst würde der Summand ja auch nie 0 werden.

Ich kenne diese GM-Language nicht wirklich, aber der Code, den iSmokiieZz gepostet hat, ist in jeder anderen Programmiersprache absolut sinnlos. Wenn dazwischen nichts mehr passiert, dann wird diese Bedinung nie erfüllt und dann wird die Variable (an dieser Stelle) auch nicht auf 0 zurückgesetzt.

28

26.04.2014, 17:28

Zitat

DIE VARIABLE WIRD NULL WENN DAS AUTO DIE LINIE ÜBERQUERT, ALSO EINE NEUE RUNDE GESTARTET WIRD, ALSO PATH_POSITION = 0 WIRD


Das wissen wir jetzt bereits. Die Frage, die dich beschäftigen sollte ist, WARUM diese Variable null wird.
Dazu musst du herausfinden, WANN die Variable null wird um zu sehen, von was die Variable abhängig ist. Daher solltest du folgende Fragen stellen:

Was für einen Wert hat die Variable VOR und NACH der if Anweisung. Welchen Summanden bekommt sie?
Wann wird die Variable ausgegeben? Kann es sein, dass sie in der Zwischenzeit nochmal geändert wird (zum Beispiel vom Compiler, weil das Script beendet ist und der Speicher gefreit wird)?

Auch ich kenne GML nicht, wage es aber, da ich gerne helfe, dennoch eine banale Vermutung aufzustellen, um die Ansätze zu geben.

  1. Du verwendest einmal object0.path_position und einmal nur path_position. Haben diese Variablen möglicherweise unterschiedliche Werte (zum Beispiel weil sie aus unterschiedlichem Scope kommen)?
  2. Deine Grundformel ist: TyreUse = ((object0.path_position-global.Path2)*TyreSave.
    Wenn du jetzt sagst, dass path_position am Anfang einer Runde 0 ist, dann möchte ich einfach mal irgendwelche werte einsetzen und ausrechnen:

    Quellcode

    1
    
    x = ((0 - 0) * 2) = 0

  3. Du verwendest TyreUse3 in deinem Script. Danach wird dieses beendet. Möglicherweise verwirft die Engine die Werte der Variablen, wenn das Script beendet ist
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

29

26.04.2014, 17:31

Sie wird erfüllt, glaube es mir bitte. Im Code davor (in einem Step Event) steht:

global.timer6 -= 1
global.timer7 -= 1
global.timer8 -= 1
global.timer9 -= 1

Das heißt, dass für jeden Frame der Wert des timerX um einen abnimmt.

Nein ich halte einen logischen Fehler nach wie vor für am wahrscheinlichsten, aber eben auch die Funktion mit der Path_Position und genau so ist es auch: Ich habe eine andere if-Bedingung (nicht mehr wenn das Auto den Pfad beendet, sondern wenn es mit einem Objekt auf der Ziellinie kollidiert, was vom Prinzip her das gleiche sein sollte) erstellt und siehe da: Es funktioniert. Jedoch wieder nur die 10 ms bis die Path_Position wieder auf Null zurückgesetzt wird und demzufolge dann auch die TyreUse3 (was einfach überhaupt keinen Sinn ergibt, sagt ihr ja auch letztlich). Aber das ist schon ein Fortschritt, da die Path_Funktion vorher überhaupt nicht funktionierte.

EDIT zu iSmokiieZz: Naja sie wird genau in dem Moment Null, wenn die Path_Position auch Null wird. In der Folge dürfte dann nur die TyreUse und die TyreUse2 auch Null werden, nicht aber der Endwert TyreUse3, da ich (denke ich zumindest) dessen Wert mit der Anweisung: TyreUse3 += TyreUse2 immer speichere (da TyreUse und TyreUse2 und 3 WÄHREND der Runde wunderbar berechnet wird) und nur NEUE werte addiert werden sollten. TyreUse2 kann auch meines Wissens nach niemals kleiner als Null werden, was der Blick in den Debugger bestätigt: Weder während der Runde noch am Ende noch am Anfang der nächsten wird TyreUse2 kleiner Null.

1. Das Object0 in der Formel wäre unnötig, da sich das Script ohnehin in dem Event Object0 befindet und er aufgrund dessen automatisch die Path_position des Object0 nimmt. Habe es geändert, ändert aber nichts.

2. Genau bei deinen Werten ergibt TyreUse2 Null, was auch gut so ist: Denn eine Null für die Path_position bedeutet, dass sich das Fahrzeug ganz am Anfang der Runde befindet und deshalb am Anfang dieser Runde noch kein Reifenabrieb erfolgen konnte. Alle anderen Variablen sind > 0.

3. Das Script befindet sich in einem sog. "Step-Event", wird also fortlaufend zu jedem Frame der Engine neu berechnet. Es endet demnach nie.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Razor« (26.04.2014, 17:49)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

30

26.04.2014, 17:44

Wenn dazwischen nichts mehr passiert, dann wird diese Bedinung nie erfüllt und dann wird die Variable (an dieser Stelle) auch nicht auf 0 zurückgesetzt.
Außer natürlich es ist kein Vergleich, sondern eine Zuweisung. :rolleyes:

Naja sie wird genau in dem Moment Null, wenn die Path_Position auch Null wird.
Referenz-Typen? :rolleyes:

Beispiel:
var foo = 5;
var bar = foo;
bar = 7;
Mögliche Werte für foo an dieser Stelle sind 5 oder 7, je nachdem, was die Sprache da eben tut.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige