PlayerとなるポリゴンがBlockのポリゴンと当たった際に衝突処理を行い位置修正を行うようにプログラムを書いてみたのですが、画面内の一番左端にPlayerがいて、Blockも一番左端にいる際衝突判定が抜けてしまい、原因がわかりません。なぜこうなるのか原因を教えてください。
衝突判定のコード
//ブロック判定処理
for (int i = 0; i < BLOCK_MAX; i++) {
if (GetPlayerPointer()->Vertex_minX() + GetPlayerPointer()->Vector.x < GetBlockPointer(i)->Vertex_maxX(i) &&
GetPlayerPointer()->Vertex_minY() + GetPlayerPointer()->Vector.y < GetBlockPointer(i)->Vertex_maxY(i) &&
GetPlayerPointer()->Vertex_maxX() + GetPlayerPointer()->Vector.x > GetBlockPointer(i)->Vertex_minX(i) &&
GetPlayerPointer()->Vertex_maxY() + GetPlayerPointer()->Vector.y > GetBlockPointer(i)->Vertex_minY(i)) {
//ブロック上判定処理
if (GetBlockPointer(i)->Vertex_minY(i) < GetPlayerPointer()->Vertex_maxY() + GetPlayerPointer()->Vector.y) {
//落下中でなおかつ元の位置がBlockの位置より高いの場合
if (0.0f < GetPlayerPointer()->Vector.y &&
GetPlayerPointer()->Vertex_maxY() <= GetBlockPointer(i)->Vertex_minY(i)) {
GetPlayerPointer()->Pos.y += GetBlockPointer(i)->Vertex_minY(i) - GetPlayerPointer()->Vertex_maxY();
GetPlayerPointer()->Vector.y = 0.0f;
GetPlayerPointer()->bJump = true;
}
}
//ブロック下判定処理
if (GetPlayerPointer()->Vertex_minY() + GetPlayerPointer()->Vector.y < GetBlockPointer(i)->Vertex_maxY(i)) {
//上昇中なおかつ元の位置がBlockの位置より低い場合
if (GetPlayerPointer()->Vector.y < 0.0f &&
GetBlockPointer(i)->Vertex_maxY(i) <= GetPlayerPointer()->Vertex_minY()) {
GetPlayerPointer()->Pos.y += GetBlockPointer(i)->Vertex_maxY(i) - GetPlayerPointer()->Vertex_minY();
GetPlayerPointer()->Vector.y = 0.0f;
GetPlayerPointer()->bJump = false;
}
}
//上下判定が行われなかった場合
if (((GetPlayerPointer()->Vertex_minY() < GetBlockPointer(i)->Vertex_minY(i) || GetPlayerPointer()->Vertex_minY() < GetBlockPointer(i)->Vertex_maxY(i)) && GetBlockPointer(i)->Vertex_maxY(i) < GetPlayerPointer()->Vertex_maxY()) ||
((GetBlockPointer(i)->Vertex_minY(i) < GetPlayerPointer()->Vertex_maxY() || GetBlockPointer(i)->Vertex_maxY(i) < GetPlayerPointer()->Vertex_maxY()) && GetPlayerPointer()->Vertex_minY() < GetBlockPointer(i)->Vertex_minY(i))) {
//ブロック左判定処理
if (GetBlockPointer(i)->Vertex_minX(i) < GetPlayerPointer()->Vertex_maxX() + GetPlayerPointer()->Vector.x) {
//元の位置がBlockの位置より左側の場合
if (GetPlayerPointer()->Vertex_maxX() <= GetBlockPointer(i)->Vertex_minX(i)) {
GetPlayerPointer()->Pos.x += GetBlockPointer(i)->Vertex_minX(i) - GetPlayerPointer()->Vertex_maxX();
GetPlayerPointer()->Vector.x = 0.0f;
}
}
//ブロック右判定処理
if (GetPlayerPointer()->Vertex_minX() + GetPlayerPointer()->Vector.x < GetBlockPointer(i)->Vertex_maxX(i)) {
//元の位置がBlockの位置より右側の場合
if (GetBlockPointer(i)->Vertex_maxX(i) <= GetPlayerPointer()->Vertex_minX()) {
GetPlayerPointer()->Pos.x += GetBlockPointer(i)->Vertex_maxX(i) - GetPlayerPointer()->Vertex_minX();
GetPlayerPointer()->Vector.x = 0.0f;
}
}
}
}
}
//画面外上判定処理
if (GetPlayerPointer()->Vertex_minY() + GetPlayerPointer()->Vector.y < 0.0f) {
GetPlayerPointer()->Pos.y += 0.0f - GetPlayerPointer()->Vertex_minY();
GetPlayerPointer()->Vector.y = 0.0f;
GetPlayerPointer()->bJump = false;
}
//画面外下判定処理
if (SCREEN_HEIGHT < GetPlayerPointer()->Vertex_maxY() + GetPlayerPointer()->Vector.y) {
GetPlayerPointer()->Pos.y += SCREEN_HEIGHT - GetPlayerPointer()->Vertex_maxY();
GetPlayerPointer()->Vector.y = 0.0f;
GetPlayerPointer()->bJump = true;
}
//画面外左判定処理
if (GetPlayerPointer()->Vertex_minX() + GetPlayerPointer()->Vector.x < 0.0f) {
GetPlayerPointer()->Pos.x += 0.0f - GetPlayerPointer()->Vertex_minX();
GetPlayerPointer()->Vector.x = 0.0f;
}
//画面外右判定処理
if (SCREEN_WIDTH < GetPlayerPointer()->Vertex_maxX() + GetPlayerPointer()->Vector.x) {
GetPlayerPointer()->Pos.x += SCREEN_WIDTH - GetPlayerPointer()->Vertex_maxX();
GetPlayerPointer()->Vector.x = 0.0f;
}
GetPlayerPointer()->Pos += GetPlayerPointer()->Vector; //現在地にベクトルを足して移動値を確定させる
//位置更新処理
GetPlayerPointer()->SetPos(GetPlayerPointer()->Pos.x, GetPlayerPointer()->Pos.y, GetPlayerPointer()->Pos.z, GetPlayerPointer()->Zoom.x, GetPlayerPointer()->Zoom.y, GetPlayerPointer()->Zoom.z, GetPlayerPointer()->Angle);
環境
[2.1] OS:Windows10
[2.2] コンパイラ名: Visual C++ 2017