Hallo
Wollte mal nachfragen, ob ich die Sache richtig angehe oder etwas verbessern könnte, um keine Performance-Probleme zu bekommen. Lest euch bitte meine Vorgehensweise durch und gebt mir Kritik. Bräuchte das dringend.
Ich bin zurzeit an einer Jump and Run-Engine dran und habe gerade mit der Gravitation angefangen. Ich arbeite mit JPanels (jedes Objekt das angezeigt wird, hat eins) und habe eine Klasse geschrieben die stets als Superklasse verwendet wird. Ich habe mir überlegt, dass jeder neue Akteur eine eigene Unterklasse besitzen soll (z.B. Hintergrund, Spieler, Gegner, Hintergrundeffekte ect.). Der Grund dafür ist, dass später alle Akteure ihre eigene move-Methode und sonstige spezielle Attribute haben und ich, falls nötig, jedem Akteur eine KI verpassen könnte.
Jeder Akteur besitzt eine Geschwindigkeit (speed) und ein Gewicht (mass) welches für die Bewegung und Gravitation sehr wichtig ist. In der Hauptklasse ist eine run-Methode, in der ich im Moment nur ständig die run-Methode aller Akteure aufrufe.
Die Bewegung und Gravitation ist nun die Hauptthematik die mich interessiert. Bevor ich die Akteure bewege lasse ich sie nach der Geschwindigkeit (speed) sortieren, weil ich eine Problematik umgehen möchte. Die möchte euch anhang dieser Grafik zeigen:
http://img690.imageshack.us/img690/1006/prob1j.png
Die einzelnen Felder sollen Pixel oder Steps darstellen. Angenommen 1 und 2 werden bei einer Kollision mit 3 verschwinden und das 1 eine Geschwindigkeit von 6 hat und 2 eine von 3. 3 bewegt sich nicht und verschwindet auch, sobald es getroffen wird. Ohne die Sortierung könnte es passieren, dass fälschlicherweise das Objekt 2 verschwindet, obwohl logisch gesehen das Obekt 1 verschwinden müsste.
Nach der Sortierung bewege ich die Akteure der Reihe nach pixelweise. Es wird eine Schleife durchgegangen die x-mal durchläuft. X ist die höchste vorhandene Geschwindigkeit. Die Akteure schauen selbst, ob sie eine Bewegung machen dürfen oder ob sie sich schon zu Ende bewegt haben. Nachdem sich ein Akteur bewegt, wird überprüft, ob es irgend einen anderen Akteur berührt (Kollision). Nach jedem Schleifendurchgang wird eine Methode aufgerufen, die für die Gravitation zuständig ist. Für die Bewegung spielt es eine Rolle was für ein Speed/Mass-Verhältnis besteht. Ist dieses nicht gleich, wird jeweils berechnet, ob der Akteur überhaupt bewegt werden darf. Hat nämlich ein Akteur mehr Speed als Mass, so darf es die Bewegung immer machen und es wird berechnet, ob die Gravitationseinwirkung schon erfolgen darf. Ein Beispiel um das zu verständlicher zu machen:
Hat ein Akteur bei Speed 8 und bei Mass 5, so wird es 8 Schritte geben, die pixelweise erfolgen. Bei jedem move-Befehl, darf er sich bewegen, weil der Speed grösser ist. Bei Mass wird zuerst noch berechnet, ob er sich neu bewegen darf (er dürfte nur beim 2., 4., 5., 7. und 8. Step eine Gravitationseinwirkung erfolgen lassen).
Ist Mass grösser, läuft das gleiche Spiel mit Speed ab, einfach umgekehrt.
Meine Hauptproblematik ist, dass ich nicht weiss, ob das zu viel Performance schluckt und ob das überhaupt so genau durchgesetzt werden sollte. Das ist ziemlich viel Text, aber ich wollte versuchen, meine Überlegungen mit euch zu teilen und Verbesserungsmöglichkeiten von euch einfliessen lassen. Wer den ganzen Code sehen möchte, muss das nur sagen. Ich mache ihn nur ungerne öffentlich, weswegen ich es den Personen jeweils per PN schicken werde. Nur so als kleine Vorwarnung: Die Gravitation funktioniert noch nicht (Bug), aber sie kann leicht ausgeschaltet werden.
Würde mich sehr freuen, wenn ein erfahrener Programmierer sich die Zeit nehmen würde mir Kritik zu geben.
Wollte mal nachfragen, ob ich die Sache richtig angehe oder etwas verbessern könnte, um keine Performance-Probleme zu bekommen. Lest euch bitte meine Vorgehensweise durch und gebt mir Kritik. Bräuchte das dringend.
Ich bin zurzeit an einer Jump and Run-Engine dran und habe gerade mit der Gravitation angefangen. Ich arbeite mit JPanels (jedes Objekt das angezeigt wird, hat eins) und habe eine Klasse geschrieben die stets als Superklasse verwendet wird. Ich habe mir überlegt, dass jeder neue Akteur eine eigene Unterklasse besitzen soll (z.B. Hintergrund, Spieler, Gegner, Hintergrundeffekte ect.). Der Grund dafür ist, dass später alle Akteure ihre eigene move-Methode und sonstige spezielle Attribute haben und ich, falls nötig, jedem Akteur eine KI verpassen könnte.
Jeder Akteur besitzt eine Geschwindigkeit (speed) und ein Gewicht (mass) welches für die Bewegung und Gravitation sehr wichtig ist. In der Hauptklasse ist eine run-Methode, in der ich im Moment nur ständig die run-Methode aller Akteure aufrufe.
Die Bewegung und Gravitation ist nun die Hauptthematik die mich interessiert. Bevor ich die Akteure bewege lasse ich sie nach der Geschwindigkeit (speed) sortieren, weil ich eine Problematik umgehen möchte. Die möchte euch anhang dieser Grafik zeigen:
http://img690.imageshack.us/img690/1006/prob1j.png
Die einzelnen Felder sollen Pixel oder Steps darstellen. Angenommen 1 und 2 werden bei einer Kollision mit 3 verschwinden und das 1 eine Geschwindigkeit von 6 hat und 2 eine von 3. 3 bewegt sich nicht und verschwindet auch, sobald es getroffen wird. Ohne die Sortierung könnte es passieren, dass fälschlicherweise das Objekt 2 verschwindet, obwohl logisch gesehen das Obekt 1 verschwinden müsste.
Nach der Sortierung bewege ich die Akteure der Reihe nach pixelweise. Es wird eine Schleife durchgegangen die x-mal durchläuft. X ist die höchste vorhandene Geschwindigkeit. Die Akteure schauen selbst, ob sie eine Bewegung machen dürfen oder ob sie sich schon zu Ende bewegt haben. Nachdem sich ein Akteur bewegt, wird überprüft, ob es irgend einen anderen Akteur berührt (Kollision). Nach jedem Schleifendurchgang wird eine Methode aufgerufen, die für die Gravitation zuständig ist. Für die Bewegung spielt es eine Rolle was für ein Speed/Mass-Verhältnis besteht. Ist dieses nicht gleich, wird jeweils berechnet, ob der Akteur überhaupt bewegt werden darf. Hat nämlich ein Akteur mehr Speed als Mass, so darf es die Bewegung immer machen und es wird berechnet, ob die Gravitationseinwirkung schon erfolgen darf. Ein Beispiel um das zu verständlicher zu machen:
Hat ein Akteur bei Speed 8 und bei Mass 5, so wird es 8 Schritte geben, die pixelweise erfolgen. Bei jedem move-Befehl, darf er sich bewegen, weil der Speed grösser ist. Bei Mass wird zuerst noch berechnet, ob er sich neu bewegen darf (er dürfte nur beim 2., 4., 5., 7. und 8. Step eine Gravitationseinwirkung erfolgen lassen).
Ist Mass grösser, läuft das gleiche Spiel mit Speed ab, einfach umgekehrt.
Meine Hauptproblematik ist, dass ich nicht weiss, ob das zu viel Performance schluckt und ob das überhaupt so genau durchgesetzt werden sollte. Das ist ziemlich viel Text, aber ich wollte versuchen, meine Überlegungen mit euch zu teilen und Verbesserungsmöglichkeiten von euch einfliessen lassen. Wer den ganzen Code sehen möchte, muss das nur sagen. Ich mache ihn nur ungerne öffentlich, weswegen ich es den Personen jeweils per PN schicken werde. Nur so als kleine Vorwarnung: Die Gravitation funktioniert noch nicht (Bug), aber sie kann leicht ausgeschaltet werden.
Würde mich sehr freuen, wenn ein erfahrener Programmierer sich die Zeit nehmen würde mir Kritik zu geben.
Zuletzt bearbeitet: