[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

Kompilator nie wykonuje czesci kodu po skompilowaniu

andrzej.peczak

8/31/2007 5:10:00 AM

Witam!
Ostatnio zaczalem uczywac kompilatora mingw z dystrybucja DeveCPP
4.9.9.2 Mam z nim same klopoty, ale to co teraz ten kompilator
wyprawia przechodzi najsmielsze oczekiwania. Napisalem sobie algorytm
wykrywania kolizji oparty na klasach. Chociaz algorytm wykrywa
kolizje, to jednak sam program po uruchomieniu juz nie.
Mam cos takiego:

crdsys2->self_rotate(0,0,rot);
crdsys2->Translate( trans,0,0 );

while( p != k )
{
globj = *p;
globj->Draw();
++p;
}


if( !collide )
{
collide = globj1->Object->Collide(*globj2->Object);
if( collide )
{
trans *= -1; // #1 tutaj stawiam puapke
rot *=-1;
}

Sleep (collide);

Powyzszy kawalek kodu sprawdza w petli glownej programu, czy wystapila
kolizja pomiedzy obiektem 1 i 2 a nastepnie zwraca informacje ile
obiektow ze soba koliduje

int ThreeDimensionalObject::Collide( ThreeDimensionalObject
&colliding_object )
{
return BoundingShapesTree-
>CheckCollision(*colliding_object.BoundingShapesTree);
}

int TBoundingShapesTree::CheckCollision(TBoundingShapesTree
&colliding_shapes )
{
int h,i,j,k,l,n,m,count_collisions = 0;
TBoundingShape *parent_collider, *child_collider, *parent_collider2,
*child_collider2;
TBoundingShape &bsp = *(*colliding_shapes.BoundingShapes)[0]; //
BoundingShapes jest typu vector<> *

this_object_potential_colliders->clear();
this_object_single_colliders->clear();
colliding_object_single_colliders->clear();

if( (*BoundingShapes)[0]->CheckCollision( bsp ) )
{
this_object_potential_colliders->push_back( (*BoundingShapes)
[0] );
for( i=0; i<this_object_potential_colliders->size(); i++ )
{
parent_collider = (*this_object_potential_colliders)[i];
n = parent_collider->Children->size();
for( j=0; j<n; j++ )
{
child_collider = (*parent_collider->Children)[j];
if( child_collider->CheckCollision(bsp) )
{
this_object_potential_colliders-
>push_back( child_collider );
if( child_collider->BoundedPolygons->size() == 1 )
{
colliding_object_potential_colliders-
>push_back( (*colliding_shapes.BoundingShapes)[0] );

for( k=0; k<colliding_object_potential_colliders-
>size(); k++ )
{
parent_collider2 =
(*colliding_object_potential_colliders)[k];
m = parent_collider2->Children->size();
for( l=0; l<m; l++ )
{
child_collider2 = (*parent_collider2-
>Children)[l];
if( child_collider2-
>CheckCollision(*child_collider) )
{
colliding_object_potential_colliders-
>push_back( child_collider2 );
if( child_collider2->BoundedPolygons-
>size() == 1 )
{
count_collisions+
+;
}
}
}
}
colliding_object_potential_colliders->clear();
}
}
}
}
}


return count_collisions;
}

bool TAxisAlignedBoundingBox::CheckCollision( TAxisAlignedBoundingBox
&colliding )
{
if( !FParentObject->CoordinateSystem->AutoValidate() )
Validate(); //uaktualnij wierzcholki dla tego ksztatu

if( !(colliding.GetParentObject())->CoordinateSystem-
>AutoValidate() )
colliding.Validate(); //uaktualnij wierzcholki dla tego
ksztatu

float minx=FCorners[0].transformed_vertex.x, maxx=minx,
miny=FCorners[0].transformed_vertex.y, maxy=miny,
minz=FCorners[0].transformed_vertex.z, maxz=minz,
mincx = colliding.FCorners[0].transformed_vertex.x,
maxcx=mincx,
mincy = colliding.FCorners[0].transformed_vertex.y,
maxcy=mincy,
mincz = colliding.FCorners[0].transformed_vertex.z,
maxcz=mincz;

for( int i=1; i<8; i++ )
{
minx=min(FCorners[i].transformed_vertex.x,minx);
maxx=max(FCorners[i].transformed_vertex.x,maxx);
miny=min(FCorners[i].transformed_vertex.y,miny);
maxy=max(FCorners[i].transformed_vertex.y,maxy);
minz=min(FCorners[i].transformed_vertex.z,minz);
maxz=max(FCorners[i].transformed_vertex.z,maxz);
mincx=min(colliding.FCorners[i].transformed_vertex.x,mincx);

maxcx=max(colliding.FCorners[i].transformed_vertex.x,maxcx);
mincy=min(colliding.FCorners[i].transformed_vertex.y,mincy);
maxcy=max(colliding.FCorners[i].transformed_vertex.y,maxcy);
mincz=min(colliding.FCorners[i].transformed_vertex.z,mincz);

maxcz=max(colliding.FCorners[i].transformed_vertex.z,maxcz);
}

if( ((mincx-minx)>0 && (maxx-mincx)>0) || ((maxcx-minx)>0 && (maxx-
maxcx)>0) )
if( ((mincy-miny)>0 && (maxy-mincy)>0) || ((maxcy-miny)>0 &&
(maxy-maxcy)>0) )
if( ((mincz-minz)>0 && (maxz-mincz)>0) || ((maxcz-minz)>0
&& (maxz-maxcz)>0) )
return true;

if( ((minx-mincx)>0 && (maxcx-minx)>0) || ((maxx-mincx)>0 && (maxcx-
maxx)>0) )
if( ((miny-mincy)>0 && (maxcy-miny)>0) || ((maxy-mincy)>0 &&
(maxcy-maxy)>0) )
if( ((minz-mincz)>0 && (maxcz-minz)>0) || ((maxz-mincz)>0
&& (maxcz-maxz)>0) )
return true;

return false;
}

tak wyglada moj program.

Problem jest taki, ze dla niektorych obiektow, ktore wgrywam sobie z
dysku czesc programu sie jakby w ogole nie uruchamia. Mam pewosc, ze
drzewo BS jest wypelnione wielobokami otaczajacymi wielokaty, bo
program bez problemu je rysuje, jednak kolizja nie jest wykrywana.
Dopiero momencie gdy postawie pulapke w miejscu #1 podczas
debugowania, kompilator jakby sie budzi ze snu i kolizja jest
wykrywana. NIestety nie wiem jak sobie z tym problemem poradzic, aby
kompilator zaczal w koncu wykonywyac te czesc kodu.

1 Answer

gonzak

8/31/2007 10:36:00 PM

0

> Problem jest taki, ze dla niektorych obiektow, ktore wgrywam sobie z
> dysku czesc programu sie jakby w ogole nie uruchamia. Mam pewosc, ze

mozde gdzies poza pamiec wyszedles? ciezkie do znalezienia to bylo ale
mialem juz raz cos takiego - ze w IDE dzialalo - po uruchomieniu poza
program sie poprostu zamykal i tyle ...

pozdrawiam
Raf

--
Archiwum grupy: http://niusy.onet.pl/pl.comp.p...