Bonjour !
Quelqu'un du forum (je sais plus qui, mais si l'auteur veut bien se reconnaitre, je n'arrive pas a trouver le pseudo) m'a passé un code permettant la charge/décharge d'une map. Ce programme était sensé etres buggé au niveau de la collision et apres quelques modifs j'obtient un truc potable :
for(int imap=0; imap<dim1; imap++) for(int jmap=0; jmap<dim2; jmap++) { int dist=(int)sqrt( pow(camera->getAbsolutePosition().X-(imap*20000+10000),2) + pow(camera->getAbsolutePosition().Z-(jmap*20000+10000),2)); scene::ITriangleSelector* selector[imap][jmap]; if(dist<20000) { if( bterrain[imap][jmap]==false ) { std::string path,tmp; path+=itostr(imap); path+="-"; path+=itostr(jmap); tmp="Maps/"+path+"/heightmap.bmp"; terrain[imap][jmap] = smgr2->addTerrainSceneNode( (c8*)tmp.c_str(), 0, // parent node -1, // node id core::vector3df((imap*19000.f), 1800.f, (jmap*19000.f)), // position core::vector3df(0.f, 0.f, 0.f), // rotation core::vector3df(80,30,80), // scale video::SColor ( 255, 255, 255, 255 ), // vertexColor, 100, // maxLOD scene::ETPS_17//, // patchSize //10 // smoothFactor ); terrain[imap][jmap]->setMaterialFlag(video::EMF_LIGHTING ,false); tmp="Maps/"+path+"/top.png"; terrain[imap][jmap]->setMaterialTexture(0, driver2->getTexture((c8*)tmp.c_str())); terrain[imap][jmap]->setMaterialTexture(1, driver2->getTexture("Maps/02.png")); terrain[imap][jmap]->setMaterialType(video::EMT_LIGHTMAP ); terrain[imap][jmap]->scaleTexture(1.0f, 100.0f); terrain[imap][jmap]->setMaterialFlag(video::EMF_FOG_ENABLE, false); // create triangle selector for the terrain selector[imap][jmap] = smgr2->createTerrainTriangleSelector(terrain[imap][jmap], 0); printf("Selector : %i \n",int(selector[imap][jmap])); terrain[imap][jmap]->setTriangleSelector(selector[imap][jmap]); // selector[imap][jmap]->drop(); metaSelector->addTriangleSelector(selector[imap][jmap]); // J'ajoute au meta selector mon selector de terrain chargé animSaut = new scene::CSceneNodeAnimatorJumpingCollisionResponse(smgr2,metaSelector, camera, core::vector3df(40,75,40), core::vector3df(0,0,0), core::vector3df(0,50,0),0.00005f/*, time */); camera->addAnimator(animSaut); animSaut->drop(); terrain[imap][jmap]->setVisible(true); bterrain[imap][jmap]=true; } } else // Si la distance est a plus de 20.000 { if( bterrain[imap][jmap]==true ) // Si le terrain est chargé { terrain[imap][jmap]->remove(); // Remove le terrain terrain[imap][jmap] = 0; // Pour bien "vidé" la chose //terrain[i][j]->drop(); Ca buggai la car impossible a drop metaSelector->removeTriangleSelector(selector[imap][jmap]); // Je supprime le selector du terrain effacé selector[imap][jmap]->drop(); bterrain[imap][jmap]=false; } } } }
Bref, dans la logique ça marche !
Mais ça bug au niveau "metaSelector->removeTriangleSelector(selector[imap][jmap]);", au lieu que la suppression de selector soit celle de la map supprimé, c'est celle de la derniere map chargé.
Je soupsonne que le problème viennent de la déclaration du tableau "scene::ITriangleSelector* selector[imap][jmap]; " qui n'est pas vraiment un tableau...
Enfin... quelqu'un peu m'aider ?
a+
w
EDIT : c'est bon, j'avais oublier de "définir" la double entré du tableau... tout marche nickel !
Dernière modification par Willikus (02-11-2007 22:13:10)
Hors ligne
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 47 invités en ligne Aucun membre connecté RSS Feed |