fix issue where beams were also disappearing while the game was paused
This commit is contained in:
@@ -40,7 +40,6 @@ ArenaView::ArenaView(ArenaSimulation* sim, const VisualsConfig* visuals,
|
|||||||
: QOpenGLWidget(parent)
|
: QOpenGLWidget(parent)
|
||||||
, m_sim(sim)
|
, m_sim(sim)
|
||||||
, m_visuals(visuals)
|
, m_visuals(visuals)
|
||||||
, m_wallMs(0)
|
|
||||||
, m_gameSpeedMultiplier(1.0)
|
, m_gameSpeedMultiplier(1.0)
|
||||||
, m_prevNonZeroSpeed(1.0)
|
, m_prevNonZeroSpeed(1.0)
|
||||||
, m_rng(std::random_device{}())
|
, m_rng(std::random_device{}())
|
||||||
@@ -99,7 +98,6 @@ void ArenaView::togglePause()
|
|||||||
void ArenaView::onFrame()
|
void ArenaView::onFrame()
|
||||||
{
|
{
|
||||||
const qint64 elapsed = m_frameTimer.restart();
|
const qint64 elapsed = m_frameTimer.restart();
|
||||||
m_wallMs += elapsed;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const int ticks = m_tickDriver.advance(
|
const int ticks = m_tickDriver.advance(
|
||||||
@@ -120,12 +118,14 @@ void ArenaView::onFrame()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expire old beams
|
// Expire old beams. Lifetime is measured in game ticks so beams stay
|
||||||
|
// visible while the simulation is paused or slowed (REQ-SHP-FIRING-BEAM).
|
||||||
{
|
{
|
||||||
|
const Tick now = m_sim->currentTick();
|
||||||
std::vector<ActiveBeam> live;
|
std::vector<ActiveBeam> live;
|
||||||
for (const ActiveBeam& b : m_activeBeams)
|
for (const ActiveBeam& b : m_activeBeams)
|
||||||
{
|
{
|
||||||
if (m_wallMs - b.emittedWallMs < kBeamLifetimeMs)
|
if (now - b.event.emittedAt < kBeamLifetimeTicks)
|
||||||
{
|
{
|
||||||
live.push_back(b);
|
live.push_back(b);
|
||||||
}
|
}
|
||||||
@@ -165,7 +165,6 @@ void ArenaView::handleEvent(std::shared_ptr<const BeamFiredEvent> event)
|
|||||||
|
|
||||||
ActiveBeam beam;
|
ActiveBeam beam;
|
||||||
beam.event = *event;
|
beam.event = *event;
|
||||||
beam.emittedWallMs = m_wallMs;
|
|
||||||
beam.targetOffset = QVector2D(radius * std::cos(angle),
|
beam.targetOffset = QVector2D(radius * std::cos(angle),
|
||||||
radius * std::sin(angle));
|
radius * std::sin(angle));
|
||||||
m_activeBeams.push_back(beam);
|
m_activeBeams.push_back(beam);
|
||||||
|
|||||||
@@ -67,18 +67,18 @@ private:
|
|||||||
struct ActiveBeam
|
struct ActiveBeam
|
||||||
{
|
{
|
||||||
BeamFiredEvent event;
|
BeamFiredEvent event;
|
||||||
qint64 emittedWallMs;
|
|
||||||
QVector2D targetOffset;
|
QVector2D targetOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
static constexpr qint64 kBeamLifetimeMs = 300;
|
// Beam lifetime in game ticks so beams freeze with the simulation when
|
||||||
|
// paused or slowed, instead of fading on wall-clock time (REQ-SHP-FIRING-BEAM).
|
||||||
|
static constexpr Tick kBeamLifetimeTicks = secondsToTicks(0.3);
|
||||||
|
|
||||||
ArenaSimulation* m_sim;
|
ArenaSimulation* m_sim;
|
||||||
const VisualsConfig* m_visuals;
|
const VisualsConfig* m_visuals;
|
||||||
|
|
||||||
TickDriver m_tickDriver;
|
TickDriver m_tickDriver;
|
||||||
QElapsedTimer m_frameTimer;
|
QElapsedTimer m_frameTimer;
|
||||||
qint64 m_wallMs;
|
|
||||||
std::mt19937 m_rng;
|
std::mt19937 m_rng;
|
||||||
double m_gameSpeedMultiplier;
|
double m_gameSpeedMultiplier;
|
||||||
double m_prevNonZeroSpeed;
|
double m_prevNonZeroSpeed;
|
||||||
|
|||||||
@@ -102,7 +102,6 @@ GameWorldView::GameWorldView(Simulation* sim, const GameConfig* config,
|
|||||||
, m_sim(sim)
|
, m_sim(sim)
|
||||||
, m_config(config)
|
, m_config(config)
|
||||||
, m_visuals(visuals)
|
, m_visuals(visuals)
|
||||||
, m_wallMs(0)
|
|
||||||
, m_gameSpeedMultiplier(1.0)
|
, m_gameSpeedMultiplier(1.0)
|
||||||
, m_prevNonZeroSpeed(1.0)
|
, m_prevNonZeroSpeed(1.0)
|
||||||
, m_scrollXTiles(0.0f)
|
, m_scrollXTiles(0.0f)
|
||||||
@@ -144,7 +143,6 @@ void GameWorldView::initializeGL()
|
|||||||
void GameWorldView::onFrame()
|
void GameWorldView::onFrame()
|
||||||
{
|
{
|
||||||
const qint64 elapsed = m_frameTimer.restart();
|
const qint64 elapsed = m_frameTimer.restart();
|
||||||
m_wallMs += elapsed;
|
|
||||||
|
|
||||||
// Advance simulation
|
// Advance simulation
|
||||||
{
|
{
|
||||||
@@ -166,12 +164,14 @@ void GameWorldView::onFrame()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expire old beams
|
// Expire old beams. Lifetime is measured in game ticks so beams stay
|
||||||
|
// visible while the simulation is paused or slowed (REQ-SHP-FIRING-BEAM).
|
||||||
{
|
{
|
||||||
|
const Tick now = m_sim->currentTick();
|
||||||
std::vector<ActiveBeam> live;
|
std::vector<ActiveBeam> live;
|
||||||
for (const ActiveBeam& b : m_activeBeams)
|
for (const ActiveBeam& b : m_activeBeams)
|
||||||
{
|
{
|
||||||
if (m_wallMs - b.emittedWallMs < kBeamLifetimeMs)
|
if (now - b.event.emittedAt < kBeamLifetimeTicks)
|
||||||
{
|
{
|
||||||
live.push_back(b);
|
live.push_back(b);
|
||||||
}
|
}
|
||||||
@@ -1603,7 +1603,6 @@ void GameWorldView::handleEvent(std::shared_ptr<const BeamFiredEvent> event)
|
|||||||
|
|
||||||
ActiveBeam beam;
|
ActiveBeam beam;
|
||||||
beam.event = *event;
|
beam.event = *event;
|
||||||
beam.emittedWallMs = m_wallMs;
|
|
||||||
beam.targetOffset = QVector2D(radius * std::cos(angle),
|
beam.targetOffset = QVector2D(radius * std::cos(angle),
|
||||||
radius * std::sin(angle));
|
radius * std::sin(angle));
|
||||||
m_activeBeams.push_back(beam);
|
m_activeBeams.push_back(beam);
|
||||||
|
|||||||
@@ -141,11 +141,12 @@ private:
|
|||||||
struct ActiveBeam
|
struct ActiveBeam
|
||||||
{
|
{
|
||||||
BeamFiredEvent event;
|
BeamFiredEvent event;
|
||||||
qint64 emittedWallMs;
|
|
||||||
QVector2D targetOffset;
|
QVector2D targetOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
static constexpr qint64 kBeamLifetimeMs = 300;
|
// Beam lifetime in game ticks so beams freeze with the simulation when
|
||||||
|
// paused or slowed, instead of fading on wall-clock time (REQ-SHP-FIRING-BEAM).
|
||||||
|
static constexpr Tick kBeamLifetimeTicks = secondsToTicks(0.3);
|
||||||
static constexpr float kScrollSpeedTilesPerSec = 10.0f;
|
static constexpr float kScrollSpeedTilesPerSec = 10.0f;
|
||||||
|
|
||||||
Simulation* m_sim;
|
Simulation* m_sim;
|
||||||
@@ -154,7 +155,6 @@ private:
|
|||||||
|
|
||||||
TickDriver m_tickDriver;
|
TickDriver m_tickDriver;
|
||||||
QElapsedTimer m_frameTimer;
|
QElapsedTimer m_frameTimer;
|
||||||
qint64 m_wallMs;
|
|
||||||
std::mt19937 m_rng;
|
std::mt19937 m_rng;
|
||||||
double m_gameSpeedMultiplier;
|
double m_gameSpeedMultiplier;
|
||||||
double m_prevNonZeroSpeed;
|
double m_prevNonZeroSpeed;
|
||||||
|
|||||||
Reference in New Issue
Block a user