Example #1
0
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;
}
Example #2
0
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();
}
Example #3
0
void Particle::solveCollision()
{
	clearCollisionList();
}