[Add] Set speed control mode.

This commit is contained in:
Rtch90 2018-04-14 23:08:19 +01:00
parent 762d7fcd3e
commit 7b92a3fdf9
3 changed files with 62 additions and 19 deletions

View File

@ -23,12 +23,14 @@ void Player::Save(void) {
using namespace Serializer::Write;
Ship::Save();
wr_int(static_cast<int>(m_flightControlState));
wr_float(m_setSpeed);
}
void Player::Load(void) {
using namespace Serializer::Read;
Ship::Load();
m_flightControlState = static_cast<FlightControlState>(rd_int());
m_setSpeed = rd_float();
}
void Player::SetFlightControlState(enum FlightControlState s) {
@ -41,6 +43,9 @@ void Player::SetFlightControlState(enum FlightControlState s) {
} else if(target) {
AIInstruct(Ship::DO_KILL, target);
}
} else if(m_flightControlState == CONTROL_FIXSPEED) {
AIClearInstructions();
m_setSpeed = GetVelocity().Length();
} else {
AIClearInstructions();
}
@ -65,21 +70,35 @@ void Player::SetDockedWith(SpaceStation* s, int port) {
}
void Player::TimeStepUpdate(const float timeStep) {
if(GetFlightState() == Ship::FLYING) {
/* When world view not selected. */
if(!polledControlsThisTurn) {
const float time_accel = L3D::GetTimeAccel();
const float ta2 = time_accel*time_accel;
ClearThrusterState();
/* Still must apply rotation damping. */
vector3d damping = CalcRotDamping();
damping *= 1.0f/ta2;
SetAngThrusterState(0, -damping.x);
SetAngThrusterState(1, -damping.y);
SetAngThrusterState(2, -damping.z);
}
}
ClearThrusterState();
polledControlsThisTurn = false;
if(L3D::GetView() == L3D::worldView) PollControls();
if(GetFlightState() == Ship::FLYING) {
switch(m_flightControlState) {
case CONTROL_MANUAL:
/* When world view not selected. */
if(!polledControlsThisTurn) {
const float time_accel = L3D::GetTimeAccel();
const float ta2 = time_accel*time_accel;
/* We still must apply rotation damping. */
vector3d damping = CalcRotDamping();
damping *= 1.0f/ta2;
SetAngThrusterState(0, -damping.x);
SetAngThrusterState(1, -damping.y);
SetAngThrusterState(2, -damping.z);
}
break;
case CONTROL_FIXSPEED:
AIAccelToModelRelativeVelocity(vector3d(0,0,-m_setSpeed));
break;
case CONTROL_AUTOPILOT:
break;
}
} else {
m_flightControlState = CONTROL_MANUAL;
AIClearInstructions();
}
Ship::TimeStepUpdate(timeStep);
}
@ -129,6 +148,10 @@ void Player::PollControls(void) {
angThrust.x = m_mouseCMov[1] / MOUSE_CTRL_AREA;
}
if(m_flightControlState == CONTROL_FIXSPEED) {
if(L3D::KeyState(SDLK_RETURN)) m_setSpeed += MAX(m_setSpeed*0.05, 1.0);
if(L3D::KeyState(SDLK_RSHIFT)) m_setSpeed -= MAX(m_setSpeed*0.05, 1.0);
}
if(L3D::KeyState(SDLK_w)) SetThrusterState(ShipType::THRUSTER_REAR, 1.0f);
if(L3D::KeyState(SDLK_s)) SetThrusterState(ShipType::THRUSTER_FRONT, 1.0f);
if(L3D::KeyState(SDLK_2)) SetThrusterState(ShipType::THRUSTER_TOP, 1.0f);
@ -271,6 +294,19 @@ void Player::DrawHUD(const Frame* cam_frame) {
glPopMatrix();
}
if(m_flightControlState == CONTROL_FIXSPEED) {
char buf[128];
if(m_setSpeed > 1000) {
snprintf(buf, sizeof(buf), "Set speed %.2f km/s", m_setSpeed*0.001);
} else {
snprintf(buf, sizeof(buf), "Set speed %.0f m/s", m_setSpeed);
}
glPushMatrix();
glTranslatef(200, 66, 0);
Gui::Screen::RenderString(buf);
glPopMatrix();
}
/* Altitude. */
if(GetFrame()->m_astroBody) {
double radius = GetFrame()->m_astroBody->GetRadius();

View File

@ -13,7 +13,7 @@ public:
void DrawHUD(const Frame* cam_frame);
virtual void SetDockedWith(SpaceStation*, int port);
void TimeStepUpdate(const float timeStep);
enum FlightControlState { CONTROL_MANUAL, CONTROL_AUTOPILOT };
enum FlightControlState { CONTROL_MANUAL, CONTROL_FIXSPEED, CONTROL_AUTOPILOT };
FlightControlState GetFlightControlState(void) const { return m_flightControlState; }
void SetFlightControlState(FlightControlState s);
protected:
@ -25,5 +25,6 @@ private:
float m_mouseCMov[2];
bool polledControlsThisTurn;
enum FlightControlState m_flightControlState;
float m_setSpeed;
};

View File

@ -54,6 +54,7 @@ WorldView::WorldView(void): View() {
m_flightControlButton = new Gui::MultiStateImageButton();
m_flightControlButton->SetShortcut(SDLK_F5, KMOD_NONE);
m_flightControlButton->AddState(Player::CONTROL_MANUAL, "icons/manual_control.png", "Manual control.");
m_flightControlButton->AddState(Player::CONTROL_FIXSPEED, "icons/manual_control.png", "Computer speed control.");
m_flightControlButton->AddState(Player::CONTROL_AUTOPILOT, "icons/autopilot.png", "Autopilot on.");
m_flightControlButton->onClick.connect(sigc::mem_fun(this, &WorldView::OnChangeFlightState));
m_rightButtonBar->Add(m_flightControlButton, 2, 2);
@ -223,9 +224,6 @@ void WorldView::Update(void) {
} else {
m_hyperspaceButton->Hide();
}
/* Player control inputs. */
if(L3D::player)
L3D::player->PollControls();
Body* target = L3D::player->GetNavTarget();
if(target) {
@ -239,7 +237,15 @@ void WorldView::Update(void) {
m_launchButton->Show();
m_flightControlButton->Hide();
} else {
m_flightStatus->SetText("Manual Controls");
Player::FlightControlState fstate = L3D::player->GetFlightControlState();
switch(fstate) {
case Player::CONTROL_MANUAL:
m_flightStatus->SetText("Manual Control"); break;
case Player::CONTROL_FIXSPEED:
m_flightStatus->SetText("Speed Control"); break;
case Player::CONTROL_AUTOPILOT:
m_flightStatus->SetText("Autopilot"); break;
}
m_launchButton->Hide();
m_flightControlButton->Show();
}