Aktuelle Zeit: 26.04.2024, 07:38

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 27.06.2010, 11:16 
Offline

Registriert: 27.06.2010, 10:53
Beiträge: 3
Hallo zusammen,

ich habe mal eine Frage zu Bounding Boxen und der Collision Detection. Ich möchte eine Funktion erhalten, die es erlaubt, Gegenstände die auf dem Boden liegen "einzusammeln" (Zum Beispiel Münzen). Der Anspruch ist, dass wenn ich mit dem Player über den Gegenstand laufe, dieser verschwindet (tatsächlich entfernt wird, nicht invisible).

Und da habe ich jetzt ein logisches Problem. Ich benutze z.Zt. folgenden Code:

Code:
if (player->getTransformedBoundingBox().intersectsWithBox(cube1->getTransformedBoundingBox())) {cube1->remove();}


Das führt natürlich zum Crash, weil bei der nächsten Abfrage der SceneNode nicht mehr existiert. Wie geht ihr dieses Problem an? Kann ich im Umkreis des players nach SceneNodes suchen und dann auf Kollision prüfen?

Beste Grüße,
Lukas


Nach oben
 Profil  
 
BeitragVerfasst: 02.07.2010, 14:28 
Offline
Benutzeravatar

Registriert: 17.04.2007, 08:42
Beiträge: 460
Wohnort: Willich, NRW
Das ist zu statisch. Warum nimmst du nicht eine sich dynamisch verwaltende Liste?

Code:
#include <vector>
using namespace std;

vector<ISceneNode*> myListOfCubes;

//ein Objekt hinzufügen...
myListOfCubes.push_back(cube1);

//...
for(unsigned int i = 0; i < myListofCubes.size(); i ++)
{
  if (player->getTransformedBoundingBox().intersectsWithBox(myListofCubes[i]->getTransformedBoundingBox()))
  {
     myListofCubes[i]->remove();
  }
}
//...


So fragst du auch nur wirklich existierende Cubes ab und keine evtl Null-Objekte.

mfg heck

_________________
Bild

Irrlicht - From Noob To Pro A Guideline

--

Sonstige Projekte, Blog : http://www.rpdev.net


Nach oben
 Profil  
 
BeitragVerfasst: 03.07.2010, 09:35 
Offline

Registriert: 27.06.2010, 10:53
Beiträge: 3
Danke für den Tipp. Allerdings führt das ebenfalls zum Crash. Folgender Code crasht nicht, entfernt aber auch nicht den jewiligen ScenenNode:

Code:
for(unsigned int i = 0; i < myListofCubes.size(); i ++)
{
  if (player->getTransformedBoundingBox().intersectsWithBox(myListofCubes[i]->getTransformedBoundingBox()))
  {
     myListofCubes[i]->setVisible(false);
  }
}


Ist also im Prinzip das selbe Problem wie vorher auch. Oder kann ich da sonst noch was falsch gemacht haben? Das setzten auf inivisble geht ja schließlich. Ich bin etwas ratlos...

Gruß,
Lukas


Nach oben
 Profil  
 
BeitragVerfasst: 03.07.2010, 11:06 
Offline

Registriert: 27.06.2010, 10:53
Beiträge: 3
So, jetzt habe ich einen Code der funktioniert:

Code:
   ISceneNode* root=smgr->getRootSceneNode();

    const core::list<ISceneNode*>& children = root->getChildren();
          core::list<ISceneNode*>::ConstIterator it = children.begin();

   for (; it != children.end(); ++it)
   {
         if (player->getTransformedBoundingBox().intersectsWithBox( (*it)->getTransformedBoundingBox()))
         {
            if (((*it)->getID()==1110001) and ((*it)->isVisible()==true))
            {
                 smgr->addToDeletionQueue((*it));
            }
         }
     }


Was haltet ihr davon? Kann man das so machen? Vor allem, wenn man mit
Code:
const core::list<ISceneNode*>& children = root->getChildren();
alle SceneNodes holt? Das können ja unter Umständen echt viele werden.

Gruß,
Lukas


Nach oben
 Profil  
 
BeitragVerfasst: 03.07.2010, 14:27 
Offline
Benutzeravatar

Registriert: 17.04.2007, 08:42
Beiträge: 460
Wohnort: Willich, NRW
Klingt erstmal nach funktionierender Software. Und naja... Natürlich können es viele werden, je nach dem wie groß die Szene wird. Andererseits kannst du ja dafür sorgen, dass du nur die Nodes enqueuest, die auch wirklich auf den Boden liegen oder auf die wirklich getestet werden soll.

mfg heck

_________________
Bild

Irrlicht - From Noob To Pro A Guideline

--

Sonstige Projekte, Blog : http://www.rpdev.net


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de