wie wäre es wenn du sobald der held enter drückst einfach das bild löschst? dann kannst du diese teilstrecken ersparen, es sei denn du willst eine ani des pics durchführen wenn die entertaste gedrückt wird. du könntest auch machen das das pild pixel um pixel ( was aber wohl bei gewissen winkel nicht geht (wenn x und y verhältnis nicht passt),
was ist wenn du bestimmst das die strecke durch irgendeine zahl teilbar sein soll, bestimme die koordinate des ziels, gehe von dieser zufällig in eine richtung aber zb. nur 5 pixel nach x und y, und das zielpunkt des bildes ist dann halt auf der anderen seite vom ziel, dh. du könntest die strecke in 10*1 pixel teilen ( ist nur ein beispiel)
und der Zielpunkt ist dann quasi die "gespiegelte" Strecke, sodass der Gegner wirklich exakt in der Mitte steht.
Es wäre theoretisch möglich, als Zufallszahlen nur Vielfache von 20 zuzulassen (also 20, 40, 80 etc.), damit die Differenz in JEDEM Fall durch 20 teilbar ist, aber da 40 Pixel mir schon zu weit entfernt sind, fällt diese Methode leider auch flach.
@Makenshi:
*Runden* kann der Maker ja richtig (also mathematisch). Das ist nicht das Problem. Das Problem ist, dass beim Runden eine Ungenauigkeit entsteht, die bei mehrfacher Anwendung (wie hier) das eigentliche Ziel bei Weitem verfehlt. Es müsste eine Möglichkeit geben, die Rundungsungenauigkeit auszugleichen. Eliminieren kann man sie nicht, der Maker kann kein Pic auf der Position 23,5/67,54 darstellen. Halbe Pixel gibt's keine xD Mein Ansatz diesbezüglich:
Der Rundungsfehler3 multipliziert mit dem Faktor X muss ein exaktes Vielfaches (Y) der Zahl 10000 ergeben.
X entspräche dann der Anzahl von Schritten bis zur Addition. Der addierte Wert entspricht Y.
Rundungsfehler3*X = 10000*Y
==> zwei Varis, eine Gleichung, nicht zu lösen.
Lua könnte hier in der Tat helfen, da sich dort dann die Rundungsungenauigkeiten dahin gehend reduzieren könnten, da Lua mit Kommazahlen rechnen kann.
!!!!
Makenshi, das ist die LÖSUNG! Man berechnet die 20 Koordinatenpaare im Voraus und dividiert DANN durch den Multiplikator.
Nochmal zum Mitdenken: Multipliziert man alle Werte durch ein Vielfaches von 10, rutscht das Komma nach hinten. Ich nehme hier zum Beispiel 10000. Der "Teilungsfaktor" ist hier natürlich 20, also 20 Animationsschritte.
Damit wird die Rundungsungenauigkeit nicht 20 mal angewandt, sondern de facto nur 1 mal. Und alles, was hinter der fünften Kommastelle ist, interessiert sowieso keinen xD
Danke Makenshi, das war der entscheidende Denkanstoß!
*Runden* kann der Maker ja richtig (also mathematisch). Das ist nicht das Problem. Das Problem ist, dass beim Runden eine Ungenauigkeit entsteht, die bei mehrfacher Anwendung (wie hier) das eigentliche Ziel bei Weitem verfehlt. Es müsste eine Möglichkeit geben, die Rundungsungenauigkeit auszugleichen. Eliminieren kann man sie nicht, der Maker kann kein Pic auf der Position 23,5/67,54 darstellen. Halbe Pixel gibt's keine xD Mein Ansatz diesbezüglich:
Der Rundungsfehler3 multipliziert mit dem Faktor X muss ein exaktes Vielfaches (Y) der Zahl 10000 ergeben.
X entspräche dann der Anzahl von Schritten bis zur Addition. Der addierte Wert entspricht Y.
Rundungsfehler3*X = 10000*Y
==> zwei Varis, eine Gleichung, nicht zu lösen.
Lua könnte hier in der Tat helfen, da sich dort dann die Rundungsungenauigkeiten dahin gehend reduzieren könnten, da Lua mit Kommazahlen rechnen kann.
...
Lua wird dir definitv helfen dank Kommavariablen. ^^
Mein Skript hat mir damals in dem Thema allerdings auch geholfen, da ich halt Divisionen mit dem Skript durchgeführt habe. So ließen sich die Fehler reduzieren, da zwar nicht MIT Nachkommastellen gerechnet wurde, jedoch wurde wenigstens soweit aufgerundet das keine großen Beträge verloren gingen. Der Maker rundet nämlich afaik nicht, sondern schneidet simpel ab.
Dürften ja Integervariablen sein. ( Vorsicht, ohne Gewähr )
Muss schon verdammt lange her sein, dass ich mich nicht mehr erinnern kann. Aber Zugangsdaten hab' ich garantiert keine bekommen, daran könnte ich mich nämlich mit Sicherheit erinnern.
Der Maker rechnet immer von links nach rechts, das heißt von links nach rechts summieren sich Rundungsfehler auf. Wenn du den Rundungsfehler erst ganz zum Schluss entstehen lässt, d.h. ganz rechts, dann kann sich da nichts aufsummieren:
Bei jedem Teilstück, das was du als "time" bezeichnet hast, wird die Gesamtstrecke erneut geteilt. Da brauchst du dann keinen Patch, kein Lua und auch keine durch mal-tausend entsehende Riesenzahlen. Guck dir die Umstellung der Formelstücke genau an. Das ist sehr komprimierte Information.
Im Maker heißt das dann:
das "plusgleich zehn" ist damit er nicht abschneidet sondern rundet.
10 ist die Hälfte von 20. Er soll "abrunden", wenn die Zahl, die geteilt wird, bis zu 10 zu groß ist. Das macht er immer, indem er abschneidet. Aber er soll "aufrunden", wenn sie um mehr als 10 zu groß ist. Das kann der Maker ja eigentlich nicht. Mit dem Plus-zehn-Trick geht beides.
Z.B. ist 47 um sieben zu groß. Er sollte eigentlich abrunden.
Wenn wir 10 zu der Zahl addieren, schneidet er zum Glück immer noch ab, denn 57/20 ist kleiner als 3. Tada, ein Abrunden simuliert. Und natürlich ist es kein Glück sondern normal.
Wenn sie mehr als 10 zu groß ist, sollte er eigentlich aufrunden. Aufrunden entspricht in den nächsten 20er-Bereich zu kommen und abzuschneiden. Wenn wir 10 z.B. zu 52 hinzuaddieren (52/20 müsste aufgerundet werden), kommen wir auf 62. Das befindet sich im nächsten 20er-Abschnitt und ergibt beim Durch-20-Teilen und Abschneiden 3. und 52/20 ist gerundet ja wirklich 3.
Funktioniert also.
Mathematisch lautet das Prinzip:
Ersteres ist die Abrundebedingung und enspricht beim Abschneiden dem Abrunden.
Zweiteres ist die Aufrundebedingung und enspricht beim Abschneiden dem Aufrunden.
Whoa jetzt kommen wieder die Mathematiker daher, ellenlange Formeln im Gepäck und behaupten, ihre Lösung sei einfacher xD
Ne, Spaß beiseite. Dein Rundungs-"Trick" ist sicherlich schön und gut. Aber. Das Runden an sich ist - as said - nie das Problem gewesen. Das habe ich ja schon vorher mit Makenshi besprochen. Der Titel des Threads ist vielleicht etwas... ungünstig gewählt, da der Rundungsfehler nicht das Kernproblem darstellt, wie sich im weiteren Verlauf der Diskussion herausgestellt hat. Der Maker rundet nämlich durchaus richtig, nur hat mein usprünglicher Code den Rundungsfehler immer wieder "mitgeschleppt" und ihn durch nichts wieder ausgleichen können. De facto ist meiner Meinung nach die Multiplikation mit 10.000 (oder einer noch höheren Zahl) die einzig wirklich gangbare Möglichkeit zur effektiven Lösung dieses Problems mit den Mitteln, die einem im RPG-Maker zur Verfügung stehen, da somit das Rechnen mit Kommazahlen zumindest soweit "simuliert" wird, dass die maximale Abweichung vom vorausberechneten Ergebnis höchstens 1 Pixel betragen kann. Natürlich tritt der Fehler nach wie vor auf, wenn man dann mit den gerundeten Koordinaten weiterrechnet, aber wenn man für die weitere Berechnung auf die exakten, mit 10.000 multiplizierten, Koordinaten zurückgreift, beträgt der maximale Rundungsfehler nur 1 Pixel.
[...] Der Maker rundet nämlich durchaus richtig [...]
...
Das ist falsch, wurde vor mir aber auch schon angemerkt. Alle mathematischen Operationen im RPG Maker sind Integeroperationen, d.h., nach einer Division entsteht ein ganzzahliges Ergebnis und ein ganzzahliger Rest (Assembler-Programmierern müsste das bekannt vorkommen), wobei nur das Ergebnis verwendet wird und der Rest verworfen. Das entspricht dem Abschneiden der Nachkommastellen bei einer Gleitkommazahl, oder - für positive Gleitkommazahlen - dem Abrunden (Gaußklammer).
Bei deiner bisherigen Lösung verwendest du Festkommazahl-Arithmetik, d.h., du skalierst die Zahlen vor den Berechnungen mit einem Faktor, führst die Berechnungen bei einer höheren Präzision durch und konvertierst das Ergebnis dann in eine Gleitkommazahl mit dem Teilen durch den Skalierungsfaktor, wobei automatisch eine Ganzzahl entsteht, da die Division eine Integeroperation ist.
Das ist im Grunde die Standard-Vorgehensweise, die so auch in Sprachen wie C/C++ Einsatz findet, wenn die hohe Ausführungsgeschwindigkeit von Integeroperationen gewünscht wird, man aber nicht auf die Präzision von Gleitkommaoperationen verzichten will (wobei man da aber aus Optimierungsgründen mit Zweierpotenz-Faktoren rechnet).
Insofern ist dein Ansatz schon richtig, allerdings (wie schon oben gesagt) gehst du falsch in der Annahme aus, dass das Ergebnis gerundet wird. Um tatsächlich zu runden, musst du, wie CapSeb schon offenlegte, eine Korrektur vor der Konvertierung durchführen, indem du die Hälfte des Divisors hinzuaddierst.
Aufpassen musst du aber bei negativen Zahlen, denn dann musst du abziehen, statt addieren.