当たり判定を行っている部分 (Charactor.cpp 34行目あたり)このメソッド move はその名が示すとおりキャラクタに移動させる為のメソッドです。処理の流れを軽く説明します。
void TCharactor::move( void )
{
TRect next = FRect; // 移動後の位置next.Left += FVary;
next.Right += FVary;// 重なるかチェック
vector<TCharactor*> over = FParent->getOverlappedCharactors( next );if( over.size() > 1 ){ // 重なっている
FVary = -FVary; // 反転
return;
}FRect = next;
}
理解に苦しむ可能性大の部分「vector<TCharactor*>」はC++の標準ライブラリに入っている可変長配列です。わからない人にとっては、なんだこりゃ!な存在だと思いますが、とりあえずは右側の「FParent->getOverlappedCharactors(next);」を解説します。
// 重なるかチェック
vector<TCharactor*> over = FParent->getOverlappedCharactors( next );
getOverlappedCharactors(TRect &rect ) TFieldクラスが管理しているキャラクタの中で引数rectが指す矩形と重なるキャラクタを可変長配列にいれて返す。 (Field.cpp の32行目あたり)C++標準ライブラリに含まれるSTL(Standard Template Library)を駆使しているのでわかりにくいと思いますがそれさえ除けば至ってシンプルな流れになっています。
vector<TCharactor*> TField::getOverlappedCharactors( TRect &rect )
{
vector<TCharactor*> result;for( list<TCharactor*>::iterator it = FItems.begin() ; it!=FItems.end() ; it++ ){
if( CheckOverlap( (*it)->getRect() , rect ) ){ // 重ね合わさっているか
// 重なっている
result.push_back( *it );
}
}if( rect.Left < 0 || rect.Right >= FRect.Right ){
// 壁にぶつかった
result.push_back( NULL );
}return result;
}
CheckOverlap関数 二つの矩形(TRect)が重なるかどうかの判定する (Function.cpp の 14行目あたり)
bool CheckOverlap( TRect &rect1 , TRect &rect2 )
{
if( rect1.Right < rect2.Left || rect2.Right < rect1.Left ||
rect1.Bottom < rect2.Top || rect2.Bottom < rect1.Top ){
return false; // 重なっていない
}
return true; // 重なっている
}