implement laser target offset

This commit is contained in:
2026-04-28 21:15:01 +02:00
parent 6e0d653d17
commit 60eaf4dc57
2 changed files with 22 additions and 1 deletions

View File

@@ -118,6 +118,7 @@ GameWorldView::GameWorldView(Simulation* sim, const GameConfig* config,
, m_demolishMode(false) , m_demolishMode(false)
, m_demolishHoverId(kInvalidEntityId) , m_demolishHoverId(kInvalidEntityId)
, m_debugDraw(false) , m_debugDraw(false)
, m_rng(std::random_device{}())
, m_boxSelecting(false) , m_boxSelecting(false)
, m_scrollLeft(false) , m_scrollLeft(false)
, m_scrollRight(false) , m_scrollRight(false)
@@ -158,9 +159,25 @@ void GameWorldView::onFrame()
const std::vector<FireEvent> fires = m_sim->drainFireEvents(); const std::vector<FireEvent> fires = m_sim->drainFireEvents();
for (const FireEvent& fe : fires) for (const FireEvent& fe : fires)
{ {
float maxRadius = 0.125f;
const Building* tBld = m_sim->buildings().findBuilding(fe.target);
if (tBld)
{
const int shorter = std::min(tBld->footprint.width(),
tBld->footprint.height());
maxRadius = shorter / 2.0f;
}
std::uniform_real_distribution<float> angleDist(0.0f, 6.28318530f);
std::uniform_real_distribution<float> radiusDist(0.0f, maxRadius);
const float angle = angleDist(m_rng);
const float radius = radiusDist(m_rng);
ActiveBeam beam; ActiveBeam beam;
beam.event = fe; beam.event = fe;
beam.emittedWallMs = m_wallMs; beam.emittedWallMs = m_wallMs;
beam.targetOffset = QVector2D(radius * std::cos(angle),
radius * std::sin(angle));
m_activeBeams.push_back(beam); m_activeBeams.push_back(beam);
} }
} }
@@ -821,7 +838,8 @@ void GameWorldView::drawBeams(QPainter& painter)
const std::optional<QVector2D> shooterPos = entityPosition(beam.event.shooter); const std::optional<QVector2D> shooterPos = entityPosition(beam.event.shooter);
const std::optional<QVector2D> targetPos = entityPosition(beam.event.target); const std::optional<QVector2D> targetPos = entityPosition(beam.event.target);
if (!shooterPos.has_value() || !targetPos.has_value()) { continue; } if (!shooterPos.has_value() || !targetPos.has_value()) { continue; }
painter.drawLine(worldToWidget(*shooterPos), worldToWidget(*targetPos)); painter.drawLine(worldToWidget(*shooterPos),
worldToWidget(*targetPos + beam.targetOffset));
} }
} }

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <optional> #include <optional>
#include <random>
#include <set> #include <set>
#include <vector> #include <vector>
@@ -116,6 +117,7 @@ private:
{ {
FireEvent event; FireEvent event;
qint64 emittedWallMs; qint64 emittedWallMs;
QVector2D targetOffset;
}; };
struct ToastEntry struct ToastEntry
@@ -136,6 +138,7 @@ private:
TickDriver m_tickDriver; TickDriver m_tickDriver;
QElapsedTimer m_frameTimer; QElapsedTimer m_frameTimer;
qint64 m_wallMs; qint64 m_wallMs;
std::mt19937 m_rng;
double m_gameSpeedMultiplier; double m_gameSpeedMultiplier;
double m_prevNonZeroSpeed; double m_prevNonZeroSpeed;
float m_scrollXTiles; float m_scrollXTiles;