Itaju
18.09.2012, 20:14
Hallo meine Lieben,
heute bin ich auf etwas gestoßen, das ich gerne verbreiten möchte, auch wenn es vermutlich dem einen oder anderen bekannt sein sollte.
Und zwar, wie man mit dem RPG Maker (praktisch) die Wurzel aus einer Zahl zieht und wofür das in der Praxis gut sein kann.
Beginnen möchte ich, wie ich auf das Problem gestoßen bin:
Stellen wir uns vor wir haben eine Geräuschquelle, zum Beispiel einen tropfenden Wasserhahn, als Event auf einer Karte. Wir wollen, dass wir das Tropfgeräusch nur hören, wenn sich der Spieler in einem bestimmten Abstand zu diesem Event befindet.
Früher habe ich das folgender Maßen geregelt: Die X und Y-Koordinaten beider Events werden subtrahiert. Im Falle eines negativen Ergebnisses mit -1 multipliziert (um stets ein Positives zu haben) und dann beide Werte addiert.
H = Held
W = Wasserhahn
O = Leeres Feld
OOW
HOO
Vereinfacht gesagt: der Wasserhahn liegt 2 Felder rechts und 1 nach oben, was einem Abstand von 2+1 = 3 entspricht.
Problem ist, dass sich jetzt die Felder mit einem bestimmten Abstand immer rautenförmig um das Zentrum bewegen.
Im Beispiel seht ihr, dass die Zahl 3 in einem Viereck und nicht in einem Kreis herum angebracht ist.
765434567
654323456
543212345
432101234
543212345
654323456
765434567
Ich wollte allerdings lieber erreichen, dass die Felder z.B. mit dem Abstand 3 zum Zentrum eher kreisförmig angeordnet sind:
0033300
0300030
3000003
3000003
3000003
0300003
0033300
Am besten zu Berechnen wäre dies mit Sinus-Satz, da wir bereits zwei Koordinaten wissen, allerdings besitzt der Maker keine Sinus bzw. Cosinus-Funktion und die Berechnung damit nicht möglich.
Da fiel mir auf, dass wir zur Koordinatenbestimmung ja mit rechten Winkeln arbeiten, also der Satz des Pythagoras gilt: a^2+b^2 = c^2
a und b sind bekannt, nur benötigen wir für c eine Funktion eine Wurzel zu ziehen, die der Maker ebenso nicht besitzt.
Also habe ich geschaut, ob es Verfahren gibt, die auf den Grundrechenarten basieren und eine Wurzel annähern können und bin auf das hier gestoßen:
http://de.wikipedia.org/wiki/Heron-Verfahren
Ein Algorithmus also, der das Ergebnis annähert und immer genauer annähert, je häufiger man ihn durchführt.
Ich möchte euch jetzt die Komplexität des Wikipediartikels ersparen und hier kurz erläutern, wie ich es im Maker umgesetzt habe:
Vorgeplänkel
V1 = HeldX
V2 = HeldY
V1 - ObjektX
V2 - ObjektY
V1*V1 // das hier ist a^2
V2*V2 // das hier ist b^2
V1+V2 //a^2+b^2 = c^2.
//V1 ist jetzt die Zahl aus der die Wurzel gezogen werden muss. Für den ersten Schritt des Algorithmus wähle ich x0 =1
V2 = V1 // Ich benutze V2 zum Rechnen, damit V1 den Ursprungswert behält und nicht verändert wird
V2 + 1
V2 / 2
V3 = V2 // V3 nimmt jetzt das Ergebnis, das in diesem Abschnitt wiederverwendet wir
V2 = V1
V2 / V3
V2 + V3
V2 / 2
Diese letzten 5 Schritte können beliebig oft wiederholt werden um das Ergebnis zu verfeinern. Allerdings muss bedacht werden, dass der Maker bei Divisionen keine Kommastellen berücksichtigt, daher ist die Annäherung gewissen Ungenauigkeiten unterworfen.
Ich lasse das ganze viermal durchlaufen und bekomme dadurch schon exzellente Ergebnisse.
Ich hoffe, ihr konntet verstehen, was ich hier vorgestellt habe, und dass es dem einen oder anderen beim umsetzen der Projekte hilfreich sein kann.
heute bin ich auf etwas gestoßen, das ich gerne verbreiten möchte, auch wenn es vermutlich dem einen oder anderen bekannt sein sollte.
Und zwar, wie man mit dem RPG Maker (praktisch) die Wurzel aus einer Zahl zieht und wofür das in der Praxis gut sein kann.
Beginnen möchte ich, wie ich auf das Problem gestoßen bin:
Stellen wir uns vor wir haben eine Geräuschquelle, zum Beispiel einen tropfenden Wasserhahn, als Event auf einer Karte. Wir wollen, dass wir das Tropfgeräusch nur hören, wenn sich der Spieler in einem bestimmten Abstand zu diesem Event befindet.
Früher habe ich das folgender Maßen geregelt: Die X und Y-Koordinaten beider Events werden subtrahiert. Im Falle eines negativen Ergebnisses mit -1 multipliziert (um stets ein Positives zu haben) und dann beide Werte addiert.
H = Held
W = Wasserhahn
O = Leeres Feld
OOW
HOO
Vereinfacht gesagt: der Wasserhahn liegt 2 Felder rechts und 1 nach oben, was einem Abstand von 2+1 = 3 entspricht.
Problem ist, dass sich jetzt die Felder mit einem bestimmten Abstand immer rautenförmig um das Zentrum bewegen.
Im Beispiel seht ihr, dass die Zahl 3 in einem Viereck und nicht in einem Kreis herum angebracht ist.
765434567
654323456
543212345
432101234
543212345
654323456
765434567
Ich wollte allerdings lieber erreichen, dass die Felder z.B. mit dem Abstand 3 zum Zentrum eher kreisförmig angeordnet sind:
0033300
0300030
3000003
3000003
3000003
0300003
0033300
Am besten zu Berechnen wäre dies mit Sinus-Satz, da wir bereits zwei Koordinaten wissen, allerdings besitzt der Maker keine Sinus bzw. Cosinus-Funktion und die Berechnung damit nicht möglich.
Da fiel mir auf, dass wir zur Koordinatenbestimmung ja mit rechten Winkeln arbeiten, also der Satz des Pythagoras gilt: a^2+b^2 = c^2
a und b sind bekannt, nur benötigen wir für c eine Funktion eine Wurzel zu ziehen, die der Maker ebenso nicht besitzt.
Also habe ich geschaut, ob es Verfahren gibt, die auf den Grundrechenarten basieren und eine Wurzel annähern können und bin auf das hier gestoßen:
http://de.wikipedia.org/wiki/Heron-Verfahren
Ein Algorithmus also, der das Ergebnis annähert und immer genauer annähert, je häufiger man ihn durchführt.
Ich möchte euch jetzt die Komplexität des Wikipediartikels ersparen und hier kurz erläutern, wie ich es im Maker umgesetzt habe:
Vorgeplänkel
V1 = HeldX
V2 = HeldY
V1 - ObjektX
V2 - ObjektY
V1*V1 // das hier ist a^2
V2*V2 // das hier ist b^2
V1+V2 //a^2+b^2 = c^2.
//V1 ist jetzt die Zahl aus der die Wurzel gezogen werden muss. Für den ersten Schritt des Algorithmus wähle ich x0 =1
V2 = V1 // Ich benutze V2 zum Rechnen, damit V1 den Ursprungswert behält und nicht verändert wird
V2 + 1
V2 / 2
V3 = V2 // V3 nimmt jetzt das Ergebnis, das in diesem Abschnitt wiederverwendet wir
V2 = V1
V2 / V3
V2 + V3
V2 / 2
Diese letzten 5 Schritte können beliebig oft wiederholt werden um das Ergebnis zu verfeinern. Allerdings muss bedacht werden, dass der Maker bei Divisionen keine Kommastellen berücksichtigt, daher ist die Annäherung gewissen Ungenauigkeiten unterworfen.
Ich lasse das ganze viermal durchlaufen und bekomme dadurch schon exzellente Ergebnisse.
Ich hoffe, ihr konntet verstehen, was ich hier vorgestellt habe, und dass es dem einen oder anderen beim umsetzen der Projekte hilfreich sein kann.