hab zufällig gerade das Video entdeckt. Nur mal ein paar Anmerkungen zur Ergänzung - kann sein das einiges inzwischen schon geklärt ist oder später auftaucht. Ich schaue gerade die Videos an und notiere mal chronologisch was mir auffällt...
- update(dt) wird auf einem Durchschnittlichen PC 20-30x pro Sekunde ausgeführt. Abhängig von der Rechenleistung und der Anzahl der Mods.
- updateTick(dt) wird nur ca. 2-3x pro Sekunde ausgeführt abhängig von der Multiplayer-Verbindungsgeschwindigkeit. Im SinglePlayer läuft updateTick fast genauso schnell wie update.
- draw(dt) wird 50 bis 60x pro Sekunde ausgeführt - abhängig von den aktuellen FPS (draw wird 1x pro Frame ausgelöst) Die Laufzeit der Draw Routinen beeinflusst damit auch maßgeblich die maximalen FPS - da sollte wirklich nur rein was nötig ist (Bildschirmausgaben)
- die Sache mit dem elseif wurde von bassaddict bereits angesprochen. Ich würde hier ebenfalls auf else setzten - zum Einen um Fehler zu minimieren - denn eine elseif-Variante hat einen unbekannten Ausgang (wenn weder die erste noch die zweite Bedingung zB aufgrund eines Schreibfehlers erfüllt würde) und kostet unnötige Performance da ein zweiter Vergleich notwendig wird.
- die Lösung im update() Bereich ist ineffizient und sollte von Anfang an vermieden werden - in diesem Beispiel ist der Performanceverlust minimal , bei größeren Spezis oder gar MP-Anbindungen kann soetwas böse Folgen haben.
Erklärung: du prüfst erst auf Tastendruck und setzt entsprechend die Variable self.wheelScaleState. Anschliessend skalierst du basierend auf eben der genannten Variable deine Räder. Bei einem oneRun Script kein Problem. Aber hier wird die update() Routine mehrfach pro Sekunde durchlaufen und du skalierst damit unnötigerweise mehrfach pro Sekunde die Räder - auch wenn es der selbe Wert ist, wird das Rad doch skaliert. Sinnvoller wäre es hier den Skalierungsvorgang direkt in die if-Abfrage des Tastendrucks zu integrieren um sicher zu stellen, dass das Rad nur skaliert wird wenn es notwendig ist.
if InputBinding.hasEvent(InputBinding.TASTE_TUTORIALWHEELSCALE) then
self.wheelScaleState = not self.wheelScaleState;
if self.wheelScaleState == true then
setScale(self.wheelToScaleLeft, 0.7,1,1);
setScale(self.wheelToScaleRight, 0.7,1,1);
setScale(self.wheelToScaleLeft, 1,1,1);
setScale(self.wheelToScaleRight, 1,1,1);
- Wichtig wäre darauf hinzuweisen dass das was du im Video als Beispiel getan hast prinzipiell falsch ist. Denn die repr-Node eines Rades darf nicht skaliert werden - weder im GE noch im späteren Spielverlauf. Wenn du die Räder im Spielverlauf skalieren möchtest, solltest du die driveNode dafür verwenden. Also eine tiefer liegende Node - ansonsten gibt es probleme mit der Physik.
- Ergänzend würde ich - um Redundanzen zu vermeiden - einfach auf die direkten Variablen der Wheels - also self.wheels[2].driveNode und self.wheels[3].driveNode zurück greifen anstatt eine eigene Variable dafür zu verschwenden. Allerdings ist mir durchaus bewusst dass dies nur zu Beispiel-Zwecken diente.