00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "CollisionSystem.hpp"
00020 #include <cstdio>
00021
00022
00023 CCollisionSystem::CCollisionSystem()
00024 {}
00025
00026 CCollisionSystem::~CCollisionSystem()
00027 {
00028 for(std::size_t CurCircle = 0; CurCircle < m_Circles.size(); CurCircle++)
00029 {
00030 delete m_Circles[CurCircle];
00031 }
00032 }
00033
00034 void CCollisionSystem::Init(std::string FileName)
00035 {
00036 char strBuf[100];
00037
00038 float X;
00039 float Y;
00040 float Radius;
00041
00042 FILE* SystemFile = std::fopen(FileName.c_str(),"r");
00043 if(SystemFile == NULL)
00044 {
00045 return;
00046 }
00047
00048 while(std::feof(SystemFile) == 0)
00049 {
00050 std::fscanf(SystemFile,"%s",strBuf);
00051 std::fscanf(SystemFile,"%s",strBuf);
00052 std::fscanf(SystemFile,"%f",&X);
00053
00054 std::fscanf(SystemFile,"%s",strBuf);
00055 std::fscanf(SystemFile,"%s",strBuf);
00056 std::fscanf(SystemFile,"%f",&Y);
00057
00058 std::fscanf(SystemFile,"%s",strBuf);
00059 std::fscanf(SystemFile,"%s",strBuf);
00060 std::fscanf(SystemFile,"%f",&Radius);
00061
00062 CBoundingCircle* BoundingCircle = new CBoundingCircle;
00063 BoundingCircle->SetPositionAdd(X,Y);
00064 BoundingCircle->SetRadius(Radius);
00065
00066 m_Circles.push_back(BoundingCircle);
00067 }
00068
00069 fclose(SystemFile);
00070 }
00071
00072 void CCollisionSystem::SetPosition(float X, float Y)
00073 {
00074 for(std::size_t CurCircle = 0; CurCircle < m_Circles.size(); CurCircle++)
00075 {
00076 m_Circles[CurCircle]->SetPosition(X,Y);
00077 }
00078 }
00079
00080 bool CCollisionSystem::CheckCollision(const CCollisionSystem* CounterPart) const
00081 {
00082 std::size_t Count = CounterPart->GetCircleCount();
00083
00084 for(std::size_t CurCircle1 = 0; CurCircle1 < m_Circles.size(); CurCircle1++)
00085 {
00086 for(std::size_t CurCircle2 = 0; CurCircle2 < Count; CurCircle2++)
00087 {
00088 const CBoundingCircle* Circle = CounterPart->GetCircle(CurCircle2);
00089 if(Circle->Overlap(m_Circles[CurCircle1]))
00090 {
00091 return true;
00092 }
00093 }
00094 }
00095
00096 return false;
00097 }
00098
00099
00100 float CCollisionSystem::GetWidth() const
00101 {
00102 float SmallestX = 9999.0f;
00103 float SmallestRadius = 0.0f;
00104 float BiggestX = -9999.0f;
00105 float BiggestRadius = 0.0f;
00106
00107 for(std::size_t CurCircle = 0; CurCircle < m_Circles.size(); CurCircle++)
00108 {
00109 if(m_Circles[CurCircle]->GetXPositionAdd() < SmallestX)
00110 {
00111 SmallestX = m_Circles[CurCircle]->GetXPositionAdd();
00112 SmallestRadius = m_Circles[CurCircle]->GetRadius();
00113 }
00114
00115 if(m_Circles[CurCircle]->GetXPositionAdd() > BiggestX)
00116 {
00117 BiggestX = m_Circles[CurCircle]->GetXPositionAdd();
00118 BiggestRadius = m_Circles[CurCircle]->GetRadius();
00119 }
00120 }
00121
00122 return (BiggestX - SmallestX) + (SmallestRadius + BiggestRadius);
00123 }