[Add] Set speed control mode.
This commit is contained in:
parent
235b1c6c5b
commit
3cbc228cfe
@ -23,12 +23,14 @@ void Player::Save(void) {
|
|||||||
using namespace Serializer::Write;
|
using namespace Serializer::Write;
|
||||||
Ship::Save();
|
Ship::Save();
|
||||||
wr_int(static_cast<int>(m_flightControlState));
|
wr_int(static_cast<int>(m_flightControlState));
|
||||||
|
wr_float(m_setSpeed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::Load(void) {
|
void Player::Load(void) {
|
||||||
using namespace Serializer::Read;
|
using namespace Serializer::Read;
|
||||||
Ship::Load();
|
Ship::Load();
|
||||||
m_flightControlState = static_cast<FlightControlState>(rd_int());
|
m_flightControlState = static_cast<FlightControlState>(rd_int());
|
||||||
|
m_setSpeed = rd_float();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::SetFlightControlState(enum FlightControlState s) {
|
void Player::SetFlightControlState(enum FlightControlState s) {
|
||||||
@ -41,6 +43,9 @@ void Player::SetFlightControlState(enum FlightControlState s) {
|
|||||||
} else if(target) {
|
} else if(target) {
|
||||||
AIInstruct(Ship::DO_KILL, target);
|
AIInstruct(Ship::DO_KILL, target);
|
||||||
}
|
}
|
||||||
|
} else if(m_flightControlState == CONTROL_FIXSPEED) {
|
||||||
|
AIClearInstructions();
|
||||||
|
m_setSpeed = GetVelocity().Length();
|
||||||
} else {
|
} else {
|
||||||
AIClearInstructions();
|
AIClearInstructions();
|
||||||
}
|
}
|
||||||
@ -65,21 +70,35 @@ void Player::SetDockedWith(SpaceStation* s, int port) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Player::TimeStepUpdate(const float timeStep) {
|
void Player::TimeStepUpdate(const float timeStep) {
|
||||||
|
ClearThrusterState();
|
||||||
|
polledControlsThisTurn = false;
|
||||||
|
if(L3D::GetView() == L3D::worldView) PollControls();
|
||||||
|
|
||||||
if(GetFlightState() == Ship::FLYING) {
|
if(GetFlightState() == Ship::FLYING) {
|
||||||
|
switch(m_flightControlState) {
|
||||||
|
case CONTROL_MANUAL:
|
||||||
/* When world view not selected. */
|
/* When world view not selected. */
|
||||||
if(!polledControlsThisTurn) {
|
if(!polledControlsThisTurn) {
|
||||||
const float time_accel = L3D::GetTimeAccel();
|
const float time_accel = L3D::GetTimeAccel();
|
||||||
const float ta2 = time_accel*time_accel;
|
const float ta2 = time_accel*time_accel;
|
||||||
ClearThrusterState();
|
/* We still must apply rotation damping. */
|
||||||
/* Still must apply rotation damping. */
|
|
||||||
vector3d damping = CalcRotDamping();
|
vector3d damping = CalcRotDamping();
|
||||||
damping *= 1.0f/ta2;
|
damping *= 1.0f/ta2;
|
||||||
SetAngThrusterState(0, -damping.x);
|
SetAngThrusterState(0, -damping.x);
|
||||||
SetAngThrusterState(1, -damping.y);
|
SetAngThrusterState(1, -damping.y);
|
||||||
SetAngThrusterState(2, -damping.z);
|
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();
|
||||||
}
|
}
|
||||||
polledControlsThisTurn = false;
|
|
||||||
Ship::TimeStepUpdate(timeStep);
|
Ship::TimeStepUpdate(timeStep);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,6 +148,10 @@ void Player::PollControls(void) {
|
|||||||
angThrust.x = m_mouseCMov[1] / MOUSE_CTRL_AREA;
|
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_w)) SetThrusterState(ShipType::THRUSTER_REAR, 1.0f);
|
||||||
if(L3D::KeyState(SDLK_s)) SetThrusterState(ShipType::THRUSTER_FRONT, 1.0f);
|
if(L3D::KeyState(SDLK_s)) SetThrusterState(ShipType::THRUSTER_FRONT, 1.0f);
|
||||||
if(L3D::KeyState(SDLK_2)) SetThrusterState(ShipType::THRUSTER_TOP, 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();
|
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. */
|
/* Altitude. */
|
||||||
if(GetFrame()->m_astroBody) {
|
if(GetFrame()->m_astroBody) {
|
||||||
double radius = GetFrame()->m_astroBody->GetRadius();
|
double radius = GetFrame()->m_astroBody->GetRadius();
|
||||||
|
@ -13,7 +13,7 @@ public:
|
|||||||
void DrawHUD(const Frame* cam_frame);
|
void DrawHUD(const Frame* cam_frame);
|
||||||
virtual void SetDockedWith(SpaceStation*, int port);
|
virtual void SetDockedWith(SpaceStation*, int port);
|
||||||
void TimeStepUpdate(const float timeStep);
|
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; }
|
FlightControlState GetFlightControlState(void) const { return m_flightControlState; }
|
||||||
void SetFlightControlState(FlightControlState s);
|
void SetFlightControlState(FlightControlState s);
|
||||||
protected:
|
protected:
|
||||||
@ -25,5 +25,6 @@ private:
|
|||||||
float m_mouseCMov[2];
|
float m_mouseCMov[2];
|
||||||
bool polledControlsThisTurn;
|
bool polledControlsThisTurn;
|
||||||
enum FlightControlState m_flightControlState;
|
enum FlightControlState m_flightControlState;
|
||||||
|
float m_setSpeed;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -54,6 +54,7 @@ WorldView::WorldView(void): View() {
|
|||||||
m_flightControlButton = new Gui::MultiStateImageButton();
|
m_flightControlButton = new Gui::MultiStateImageButton();
|
||||||
m_flightControlButton->SetShortcut(SDLK_F5, KMOD_NONE);
|
m_flightControlButton->SetShortcut(SDLK_F5, KMOD_NONE);
|
||||||
m_flightControlButton->AddState(Player::CONTROL_MANUAL, "icons/manual_control.png", "Manual control.");
|
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->AddState(Player::CONTROL_AUTOPILOT, "icons/autopilot.png", "Autopilot on.");
|
||||||
m_flightControlButton->onClick.connect(sigc::mem_fun(this, &WorldView::OnChangeFlightState));
|
m_flightControlButton->onClick.connect(sigc::mem_fun(this, &WorldView::OnChangeFlightState));
|
||||||
m_rightButtonBar->Add(m_flightControlButton, 2, 2);
|
m_rightButtonBar->Add(m_flightControlButton, 2, 2);
|
||||||
@ -223,9 +224,6 @@ void WorldView::Update(void) {
|
|||||||
} else {
|
} else {
|
||||||
m_hyperspaceButton->Hide();
|
m_hyperspaceButton->Hide();
|
||||||
}
|
}
|
||||||
/* Player control inputs. */
|
|
||||||
if(L3D::player)
|
|
||||||
L3D::player->PollControls();
|
|
||||||
|
|
||||||
Body* target = L3D::player->GetNavTarget();
|
Body* target = L3D::player->GetNavTarget();
|
||||||
if(target) {
|
if(target) {
|
||||||
@ -239,7 +237,15 @@ void WorldView::Update(void) {
|
|||||||
m_launchButton->Show();
|
m_launchButton->Show();
|
||||||
m_flightControlButton->Hide();
|
m_flightControlButton->Hide();
|
||||||
} else {
|
} 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_launchButton->Hide();
|
||||||
m_flightControlButton->Show();
|
m_flightControlButton->Show();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user