int CollisionList::checkCollisions() { int counter = 0; ListIterator<Object> objIterator1 = *ListIterator<Object>(objList).SetFirst(); ListIterator<Object> objIterator2 = *ListIterator<Object>(objList).SetFirst(); clearCollisionList(); while(!objIterator1.IsLast()) { while(!objIterator2.IsLast()) { if(objIterator1.GetCurrent() == objIterator2.GetCurrent()) { objIterator2.Next(); continue; } if(approximate(objIterator1.GetCurrent(), objIterator2.GetCurrent())) if(collide(objIterator1.GetCurrent(), objIterator2.GetCurrent())) counter++; objIterator2.Next(); } objIterator1.Next(); objIterator2.SetFirst(); } return counter; }
void Goomba::solveCollision() { if (m_state != LIVING) { clearCollisionList(); return; } for (int i = 0; i < m_collObjsNumber; i++) if (m_pCollInfosList[i].m_isCollision) { const GameObject* other = m_ppCollObjsList[i]; CollisionInfo& info = m_pCollInfosList[i]; int kind = other->getKind(); switch (kind) { //------------------------------------------------------------------------------------------ case KIND_PLAYER: { m_px = info.m_newX; m_py = info.m_newY; if (info.m_edgeResult == EDGE_TOP) { m_state = DYING; m_dyingFrameCount = 0; } break; } // case //------------------------------------------------------------------------------------------ case KIND_TILE_NORMAL_BRICK: case KIND_TILE_QUESTION_BRICK: case KIND_TILE_BACKGROUND: { switch (info.m_edgeResult) { case EDGE_TOP: { m_py = other->py() + other->height(); m_vy = 0; break; } case EDGE_BOTTOM: { m_py = other->py() - m_height; m_ay = m_vy = 0; break; } case EDGE_LEFT: { m_px = other->px() + other->width(); m_vx = GOOMBA_VX; break; } case EDGE_RIGHT: { m_px = other->px() - m_width; m_vx = -GOOMBA_VX; break; } } // switch (info.m_edgeResult) break; } // case //------------------------------------------------------------------------------------------ case KIND_ENEMY_KOOPA: case KIND_OTHER_MUSHROOM: { m_px = info.m_newX; m_py = info.m_newY; if ( kind == KIND_ENEMY_KOOPA && (info.m_edgeResult == EDGE_LEFT || info.m_edgeResult == EDGE_RIGHT) ) { Koopa* pKoopa = (Koopa*)other; if ( pKoopa->isGliding() ) { m_vy = -GOOMBA_VY; m_ay = GOOMBA_GRAVITY; m_state = THROWING; break; } } switch (info.m_edgeResult) { case EDGE_TOP: { m_vy = 0; break; } case EDGE_BOTTOM: { m_vy = -GOOMBA_VY; m_ay = GOOMBA_GRAVITY; break; } case EDGE_LEFT: { if (m_vx < 0) m_vx = GOOMBA_VX; break; } case EDGE_RIGHT: { if (m_vx > 0) m_vx = -GOOMBA_VX; break; } } // switch (info.m_edgeResult) break; } // case //------------------------------------------------------------------------------------------ case KIND_OTHER_INVISIBLE_KILLER: { m_vy = -GOOMBA_VY; m_ay = GOOMBA_GRAVITY; m_state = THROWING; break; } // case } // switch (other->getKind()) } // for clearCollisionList(); }
void Particle::solveCollision() { clearCollisionList(); }