diff --git a/GameLib/Entity.c b/GameLib/Entity.c index 1a892cc..48d6255 100644 --- a/GameLib/Entity.c +++ b/GameLib/Entity.c @@ -357,6 +357,24 @@ void CollisionInfo_Add(CollisionInfo *collInfoRef, } +///////////////////////////// +// CollisionInfo_CheckRepetition +// +// +int CollisionInfo_CheckRepetition(CollisionInfo collInfo,Entity ent1,Entity ent2) +{ + while(collInfo!=NULL){ + if((collInfo->ent1==ent1 && collInfo->ent2==ent2) || + (collInfo->ent1==ent2 && collInfo->ent2==ent1)) + { + return(1); + } + collInfo=collInfo->next; + } + return(0); +} + + ///////////////////////////// // Entity_CheckCollisions // diff --git a/GameLib/Entity.h b/GameLib/Entity.h index f78d40c..87fbfd4 100644 --- a/GameLib/Entity.h +++ b/GameLib/Entity.h @@ -166,6 +166,13 @@ void CollisionInfo_Add(CollisionInfo *collInfo, int responseType,Entity ent1,Entity ent2,float t,vec2 n,int applyFriction); +///////////////////////////// +// CollisionInfo_CheckRepetition +// +// +int CollisionInfo_CheckRepetition(CollisionInfo collInfo,Entity ent1,Entity ent2); + + ///////////////////////////// // Entity_CheckCollision // diff --git a/GameLib/GameLib.c b/GameLib/GameLib.c index 719ec08..d2466c4 100644 --- a/GameLib/GameLib.c +++ b/GameLib/GameLib.c @@ -215,14 +215,21 @@ int GameLib_ProcLoop(){ do{ repeat=0; CollisionInfo collInfo=NULL; - for(i=0;i<(_n_entities-1);i++){ + for(i=0;i<_n_entities;i++){ if(!(_entity[i]->flags&EntityFlag_Collision) || _entity[i]->mass<0.0f) continue; - for(j=i;j<_n_entities;j++){ - if(!(_entity[j]->flags&EntityFlag_Collision)) - continue; - if(!Entity_BBoxIntersect(_entity[i],_entity[j])) + if(_entity[i]->vel[0]<=0.0f && _entity[i]->vel[0]>=-0.0f && + _entity[i]->vel[1]<=0.0f && _entity[i]->vel[1]>=-0.0f) + { + continue; + } + for(j=0;j<_n_entities;j++){ + if(!(_entity[j]->flags&EntityFlag_Collision) || + !Entity_BBoxIntersect(_entity[i],_entity[j]) || + CollisionInfo_CheckRepetition(collInfo,_entity[i],_entity[j])) + { continue; + } Entity_CheckCollision(_entity[i],_entity[j],&collInfo); } }