示例#1
0
bool CRoom_1x2::correctRoomCollision_down()
{
	for (int i = 0; i < m_pRoom_collision->size(); ++i)
	{
		CRoom* pRoom = m_pRoom_collision->at(i);

		if (this->equals(pRoom))
		{
			continue;
		}

		SCoords2<int> other_topLeft;
		SCoords2<int> other_topRight;
		SCoords2<int> other_bottomLeft;
		SCoords2<int> other_bottomRight;
		pRoom->getEverything(&other_topLeft, &other_topRight, &other_bottomLeft, &other_bottomRight);

		// Point collision detection extended from the midpoint on the bottom row
		SCoords2<int> midBottom;
		midBottom.setCoords(m_bottomLeft.x + m_width / 2, (int)(m_bottomLeft.y + m_sAtributes.velosity_y));
		if (pRoom->collision(&midBottom))
		{
			if (pRoom->getLayout()->x == 1)
			{
				setBottomRight(other_topRight.x, other_topRight.y);
			}
			else if (pRoom->getLayout()->x == 2)
			{
				SCoords2<int> subRoom = pRoom->whichSubRoom(&midBottom);

				if (subRoom.x == 1) // left side
				{
					setBottomLeft(other_topLeft.x, other_topLeft.y);
				}
				else if (subRoom.x == 2) // right side
				{
					setBottomRight(other_topRight.x, other_topRight.y);
				}
			}
			m_sAtributes.gravityTimer.start();
			isFalling = false;
			return true;
		}
	}

	return false;
}
示例#2
0
 void PiShape::configure(const std::string& parameters) {
     if (parameters.empty()) return;
     std::vector<std::string> values = Op::split(parameters, " ");
     std::size_t required = 4;
     if (values.size() < required) {
         std::ostringstream ex;
         ex << "[configuration error] term <" << className() << ">"
                 << " requires <" << required << "> parameters";
         throw fl::Exception(ex.str(), FL_AT);
     }
     setBottomLeft(Op::toScalar(values.at(0)));
     setTopLeft(Op::toScalar(values.at(1)));
     setTopRight(Op::toScalar(values.at(2)));
     setBottomRight(Op::toScalar(values.at(3)));
     if (values.size() > required)
         setHeight(Op::toScalar(values.at(required)));
 }
示例#3
0
bool CRoom_2x1::correctMapCollision_down()
{
	//int left_column		= m_topLeft.x;
	//int left_row		= m_topLeft.y + m_sAtributes.velosity_y;
	//m_pMap_collision->convertScreenToMap(&left_column, &left_row);

	//int right_column	= m_topRight.x;
	//int right_row		= m_topRight.y + m_sAtributes.velosity_y;
	//m_pMap_collision->convertScreenToMap(&right_column, &right_row);

	// Here we are going to do a point collision detection on the extended midpoint
	//		from all of the sub rooms along the bottom row. If ANY of them collide with something,
	//		the respective corner is set, and this room will not fall any farther
	SCoords2<int> this_midBottomLeft, this_midBottomRight;
	this_midBottomLeft.setCoords(
	    m_bottomLeft.x + m_width / 4,
	    (int)(m_bottomLeft.y + m_sAtributes.velosity_y));
	this_midBottomRight.setCoords(
	    m_bottomRight.x - m_width / 4,
	    (int)(m_bottomLeft.y + m_sAtributes.velosity_y));

	const std::vector<STileData<int>*>* pMapTiles = m_pMap_collision->getMapTiles();
	for (int i = 0; i < pMapTiles->size(); ++i)
	{
		STileData<int>* pTile = pMapTiles->at(i);

		// [OPTIMIZATION]: how to column check when this is a 1x2 room?
		//if (pTile->mapCoords.x != left_column &&
		//        pTile->mapCoords.x != right_column)
		//{
		//	continue;
		//}

		bool collision_bottomLeft = pTile->collision(&this_midBottomLeft);
		bool collision_bottomRight = pTile->collision(&this_midBottomRight);

#ifdef DEBUG
		if (collision_bottomLeft && collision_bottomRight) // dead on collision
		{
			assert(false);// this should never happen because tiles are 1x1, and this room is 1x2
		}
#endif // !DEBG
		if (collision_bottomLeft && !collision_bottomRight) // hanging off of the right side
		{
			setBottomLeft(pTile->screenCoords_topLeft.x, pTile->screenCoords_topLeft.y);

			m_sAtributes.gravityTimer.start();
			isFalling = false;
			return true;
		}
		else if (!collision_bottomLeft && collision_bottomRight) // hanging off of the left side
		{
			setBottomRight(pTile->screenCoords_bottomRight.x, pTile->screenCoords_bottomRight.y - pTile->height);

			m_sAtributes.gravityTimer.start();
			isFalling = false;
			return true;
		}
	}


	return false;
}
示例#4
0
bool CRoom_2x1::correctRoomCollision_down()
{
	for (int i = 0; i < m_pRoom_collision->size(); ++i)
	{
		CRoom* pRoom = m_pRoom_collision->at(i);

		if (this->equals(pRoom))
		{
			continue;
		}

		SCoords2<int> other_topLeft;
		SCoords2<int> other_topRight;
		SCoords2<int> other_bottomLeft;
		SCoords2<int> other_bottomRight;
		pRoom->getEverything(&other_topLeft, &other_topRight, &other_bottomLeft, &other_bottomRight);

		// Here we are going to do a point collision detection on the extended midpoint
		//		from all of the sub rooms along the bottom row. If ANY of them collide with something,
		//		the respective corner is set, and this room will not fall any farther
		SCoords2<int> this_midBottomLeft, this_midBottomRight;
		this_midBottomLeft.setCoords(
		    m_bottomLeft.x + m_width / 4,
		    (int)(m_bottomLeft.y + m_sAtributes.velosity_y));
		this_midBottomRight.setCoords(
		    m_bottomRight.x - m_width / 4,
		    (int)(m_bottomLeft.y + m_sAtributes.velosity_y));

		bool collision_bottomLeft = pRoom->collision(&this_midBottomLeft);
		bool collision_bottomRight = pRoom->collision(&this_midBottomRight);

		if (collision_bottomLeft && collision_bottomRight) // dead on collision
		{
			setBottomLeft(other_topLeft);
			m_sAtributes.gravityTimer.start();
			isFalling = false;
			return true;
		}
		else if (collision_bottomLeft && !collision_bottomRight) // hanging off of the right side
		{
			if (pRoom->getLayout()->x == 1)
			{
				setBottomLeft(other_topLeft);
			}
			else if (pRoom->getLayout()->x == 2)
			{
				setBottomLeft(other_topLeft.x + pRoom->getWidth() / 2, other_topLeft.y);
			}

			m_sAtributes.gravityTimer.start();
			isFalling = false;
			return true;
		}
		else if (!collision_bottomLeft && collision_bottomRight) // hanging off of the left side
		{
			if (pRoom->getLayout()->x == 1)
			{
				setBottomRight(other_topRight);
			}
			else if (pRoom->getLayout()->x == 2)
			{
				setBottomRight(other_topLeft.x + pRoom->getWidth() / 2, other_topLeft.y);
			}

			m_sAtributes.gravityTimer.start();
			isFalling = false;
			return true;
		}
	}

	return false;
}