Hallo zusammen!
Ich bin ein neuer Benutzer und hoffe, daß ich mich an die Forumsrichtlinien halte…
Meine Frage bezieht sich auf ein Problem bei meinem Spiel mit JavaFx, und zwar speziell auf die Kollisionserkennung. Nach bereits einigen Tagen Suche nach einer Methode zur Kollisionserkennung frage ich nun Kollisionen erfolgreich ab, jedoch bleibt ein seltsames Ruckeln der (JavaFx-)Kamerasicht, sobald eine Kollision stattfindet.
Bitte nicht darüber erschrecken, daß ich auf Deutsch programmiere, aber ein Mensch denkt immer in seiner Muttersprache und so stört der englische Code nur den Denkfluss.
Ich habe versucht, eine klare Trennung zwischen "model, view & controller" (MVC-Konzept). Die Variable "mModell" ist die Instanz eines Singletons und hält alle logischen Daten, wie z.B. alle Aktoren.
Die verwendete Klasse "Tupel2d" ist ein Äquivalent zu Javas "Point2D"-Klasse, nur auf meine Bedürfnisse angepaßt.
Hier die stark vereinfachte Animationsfunktion des Spieler-Objekts, die bei jedem Zyklus aufgerufen wird:
Hier noch die relevanten Funktionen aus der Superklasse:
Ich bin ein neuer Benutzer und hoffe, daß ich mich an die Forumsrichtlinien halte…
Meine Frage bezieht sich auf ein Problem bei meinem Spiel mit JavaFx, und zwar speziell auf die Kollisionserkennung. Nach bereits einigen Tagen Suche nach einer Methode zur Kollisionserkennung frage ich nun Kollisionen erfolgreich ab, jedoch bleibt ein seltsames Ruckeln der (JavaFx-)Kamerasicht, sobald eine Kollision stattfindet.
Bitte nicht darüber erschrecken, daß ich auf Deutsch programmiere, aber ein Mensch denkt immer in seiner Muttersprache und so stört der englische Code nur den Denkfluss.
Ich habe versucht, eine klare Trennung zwischen "model, view & controller" (MVC-Konzept). Die Variable "mModell" ist die Instanz eines Singletons und hält alle logischen Daten, wie z.B. alle Aktoren.
Die verwendete Klasse "Tupel2d" ist ein Äquivalent zu Javas "Point2D"-Klasse, nur auf meine Bedürfnisse angepaßt.
Hier die stark vereinfachte Animationsfunktion des Spieler-Objekts, die bei jedem Zyklus aufgerufen wird:
Java:
/**
* Hier kann der Aktor Aktionen vornehmen.
*/
@Override
public void animiere()
{
// Bewegung etc…
if (mVektor.x != 0) {
mPosition.x += mVektor.x;
Aktor kollision = prüfeKollision();
if (kollision != null) {
while (istÜberschneidung(kollision)) {
if (mVektor.x > 0) {
mPosition.x--;
}
else {
mPosition.x++;
}
}
mVektor.x = 0;
}
}
if (mVektor.y != 0) {
mPosition.y += mVektor.y;
Aktor kollision = prüfeKollision();
if (kollision != null) {
while (istÜberschneidung(kollision)) {
if (mVektor.y > 0) {
mPosition.y--;
}
else {
mPosition.y++;
}
}
mVektor.y = 0;
}
}
transliere(mPosition);
}
Hier noch die relevanten Funktionen aus der Superklasse:
Java:
/**
* @param abfrage Der Aktor zu prüfende Aktor.
* @return Ob Kollision zwischen diesem Aktor und dem Übergabe-Aktor.
*/
public boolean istÜberschneidung(Aktor abfrage)
{
Rectangle2D aktormaß = abfrage.gibAusmaß();
return gibAusmaß().intersects(aktormaß);
}
/**
* @return Falls Kollision, wird der Aktor zurückgegeben.
*/
public Aktor prüfeKollision()
{
for(Aktor aktor : mModell.gibBlockliste()) {
if (aktor.mIstSolid) {
if (istÜberschneidung(aktor)) {
return aktor;
}
}
}
return null;
}
/**
* Gibt die Maße des Aktors.
*
* @return Ausmaß.
*/
public Rectangle2D gibAusmaß()
{
return new Rectangle2D(mPosition.x, mPosition.y, mBreite, mHöhe);
}
/**
* Transliert sowohl die Logik- als auch die Sichtposition.
*
* @param neupos Die neue Position.
*/
public void transliere(Tupel2d neupos)
{
mPosition.set(neupos.x, neupos.y);
mBildsicht.setTranslateX(neupos.x);
mBildsicht.setTranslateY(neupos.y);
}
Zuletzt bearbeitet: