ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4397157
Jetzt (Chat):
20 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
Algorithmen und Datenstrukturen
Re: Kollision zweier Objekte
Normal
AutorThema
6SidedDice Offline
Job-Moderator


Registriert seit:
16.10.2002

Nordrhein-Westfalen
161010163
Kollision zweier ObjekteNach oben.
Hallo zusammen,

mir ist kein besserer Titel eingefallen, deswegen hier mal genauer erklärt worum es geht:
Auf dem Spielfeld bewegen sich mehrere Figuren, der einfachheit halber als Kreise, ich muss nun rausfinden wann 2 davon miteinander kollidieren. Mir geht es jetzt nicht um die Kollisionsberechnung an sich, wie man die Kollision 2er Kreise berechnet weiss ich ... ich bekomme das nur nicht zufriedenstellend eingebaut. Denn die Berechnung die ich für die Kollision habe, beruht unter anderem auf dem Velocity Vektor der Objekte, da sich während der berechnung aber dieser mehrmals ändern kann, je nach länge des Frames, kann also ein Objekt mehrmals die richtung gewechselt haben.
Ich benutze die gesamte Spiellogik bspw. auch um rauszufinden ob das erstellte level in meinem Editor so gewissen Anforderungen erfüllt.

dabei sieht das ungefähr so aus
Code:
void Update(float aGameTime)
{
 foreach(Enemy e in Level.Enemies)
 {
    MoveEnemy(aGameTime);
 }
}

void MoveEnemy(aGameTime)
{
   // bewege bis zum nächsten hindernis
   // ändere richtung
   // berechner verbleibende zeit
   MoveEnemy(rest_time);
}


Wie man sieht benutze ich einen rekursiven Aufruf um die Objekte so lange zu bewegen wie Zeit übrig ist. Damit kann ich durch einen aufruf wie logic.Update(10000) das Spiel fiktiv 10000ms laufen lassen und nachher einfach den Status der Gegner prüfen. Genauer muss ich da glaube ich nicht drauf eingehen, mein Problem bleibt bestehen ... ich weiss nicht wo und wie ich die Kollisions erkennung da einbauen könnte. Ich hab ein paar Ideen. Da alles auf einer art Schachbrett ist, merke ich mir für jeden Frame welche Schachbrettkachel jeder Gegner passiert hat und zu welcher Zeit. Dann vergleiche ich diese gegeneinander und wenn ich 2 zur ungefähr selben Zeit (denke hier spielt dann Geschwindigkeit der Objekte und größe des Boundingcircles eine Rolle) auf dem selben feld waren gab es eine Kollision. Diesen Test müsste ich aber nach der kompletten MoveEnemy Methode durchführen und ich fürchte das es da zu weiteren Problemen kommen könnte. Zusätzlich könnte ich die Update methode intern in kleinere Häppchen aufteilen, wenn aGameTime zu groß sein sollte. Auf diese weise bewegen sich die Gegner nicht alzugroße Schritte und ich könnte statt den Kacheln, auf dennen der gegner war, doch wieder Position und Richtungsvektor für die Kollision benutzen.

Ich denke ich hab nur ein großes Brett vor dem Kopf und ich hoffe mich stößt da jemand in die richtige Richtung oder hat eine passende Idee.
Kann auch gerne genauer darauf eingehen um was für ein Spiel es geht, falls das hilft.
Danke schonmal
Nico
13.01.2009, 08:01:14 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Kollision zweier ObjekteNach oben.
Warum läßt du die Enemies nicht bis zur ersten Kollision von 2 Enemies laufen:
Code:
void Update( float time, frameIncement )
{
  float elapsedTime = 0;
  while ( elapsedTime < frameIncement )
  { 
    collisionTime = checkForNextCollision( time ); 
    elapsedTime += collisionTime;
    foreach(Enemy e in Level.Enemies)
    {
      e.computeNewEnemyPos( collisionTime );  
    }
  }
}


Und am Ende dann rendern. Wäre z.B. eine Variabte.

Gruß Kimmi

2 Mal gendert, zuletzt am 14.01.2009, 08:58:12 Uhr von Kimmi.
13.01.2009, 17:59:10 Uhr
Kurzer Weblog
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel