Beispiel #1
0
RESULT
DebugRenderer::Quad( const AABB& bounds, Color color, float fOpacity )
{
    RESULT rval = S_OK;

    // Draw screen-aligned 2D rectangular outline for the AABB.
    // TODO: have solid mode using a quad.
    
    WORLD_POSITION corner1;
    WORLD_POSITION corner2;
    WORLD_POSITION corner3;
    WORLD_POSITION corner4;

    corner1.x = bounds.GetMin().x;  corner1.y = bounds.GetMin().y;              corner1.z = 0.0f;
    corner2.x = bounds.GetMin().x;  corner2.y = corner1.y + bounds.GetHeight(); corner2.z = 0.0f;
    corner3.x = bounds.GetMax().x;  corner3.y = bounds.GetMax().y;              corner3.z = 0.0f;
    corner4.x = bounds.GetMax().x;  corner4.y = corner3.y - bounds.GetHeight(); corner4.z = 0.0f;

    CHR( Line(corner1, vec3(0,  1, 0),  Color::Green(), fOpacity, bounds.GetHeight(), 5.0f) );
    CHR( Line(corner2, vec3(1,  0, 0),  Color::Green(), fOpacity, bounds.GetWidth(),  5.0f) );
    CHR( Line(corner3, vec3(0, -1, 0),  Color::Green(), fOpacity, bounds.GetHeight(), 5.0f) );
    CHR( Line(corner4, vec3(-1, 0, 0),  Color::Green(), fOpacity, bounds.GetWidth(),  5.0f) );
    
//    CHR( Point( bounds.GetCenter(), Color::Black(), 1.0f ) );
    
Exit:
    return rval;
}
Beispiel #2
0
bool AABB::CheckCollision(AABB otherBox)
{
    //
	//     b0--------b1
	//      |        |
	// a0---|----a1  |
	//  |   |    |   |
	//  |  b3--------b2
	//  |        |
	//  |        |
	// a3--------a2
    //
	// (a0.x is less than b1.x and a1.x is greater than b0.x) collided in x axis
	// (a0.y is less than b3.y and a3.y is greater than b0.y) collided in y axis
	//
	if ((_x < otherBox.GetX() + otherBox.GetWidth() &&  _x + _width > otherBox.GetX()) &&
		(_y < otherBox.GetY() + otherBox.GetHeight() && _y + _height > otherBox.GetY()))
	{
		// we collided
		return true;
	}
	else
	{
		return false;
	}
}
Beispiel #3
0
void PlayerActor::UpdateMindControlSelection(bool released)
{
	shared_ptr<Level> level = _gameScreen->GetLevel();
	vector<shared_ptr<AIActor>> inRange;
	Vector2 centre{ _curKinematic.position.GetX() + _sprites[_currentSpriteSheet]->GetFrameWidth() / 2, _curKinematic.position.GetY() + _sprites[_currentSpriteSheet]->GetFrameHeight() / 2 };
	for (auto actor : level->GetActors())
	{
		if (actor->GetType() == Type::enemy || actor->GetType() == Type::bombenemy)
		{
			// Check whether the enemy is in range, offsetting their position as necessary 
			// to make sure that the distance is the same on all sides
			shared_ptr<AIActor> enemy = dynamic_pointer_cast<AIActor>(actor);
			Vector2 enemyPos = enemy->GetPosition();
			AABB enemyAABB = enemy->GetAABB();
			if (enemyPos.GetX() < _curKinematic.position.GetX()) enemyPos.SetX(enemyPos.GetX() + enemyAABB.GetWidth());
			if (enemyPos.GetY() < _curKinematic.position.GetY()) enemyPos.SetY(enemyPos.GetY() + enemyAABB.GetHeight());

			if (centre.Distance(enemyPos) <= _mindControlRadius) inRange.push_back(enemy);
		}
	}

	if (inRange.empty()) return;

	if (released)
	{
		for (auto enemy : inRange)
		{
			enemy->SetIsMindControlCandidate(false);
			enemy->SetSelectedForControl(false);
		}
		_selected = 0;
		return;
	}

	for (auto enemy : inRange) enemy->SetIsMindControlCandidate(true);
	inRange[_selected]->SetSelectedForControl(true);

	// Cycle through the controllable enemies
	if (_mgr->inputManager->ActionOccurred("MIND_CONTROL_SELECT", Input::Pressed))
	{
		inRange[_selected]->SetSelectedForControl(false);
		_selected++;
		_selected %= inRange.size();
		inRange[_selected]->SetSelectedForControl(true);
	}

	// Toggle whether the enemy is under mind control
	if (_mgr->inputManager->ActionOccurred("MIND_CONTROL_STOP", Input::Pressed))
	{
		inRange[_selected]->StopMindControl();
	}
	// Give the selected enemy a new direction in which to travel (and automatically enable mind control)
	else if (_mgr->inputManager->ActionOccurred("LEFT", Input::Pressed) ||
		_mgr->inputManager->ActionOccurred("RIGHT", Input::Pressed))
	{
		SpriteSheet::XAxisDirection dir = _mgr->inputManager->ActionOccurred("LEFT", Input::Pressed)
			? SpriteSheet::XAxisDirection::LEFT
			: SpriteSheet::XAxisDirection::RIGHT;

		bool controlled = inRange[_selected]->IsUnderMindControl();
		inRange[_selected]->SetMindControlDirection(dir);
	}
}