#pragma once #include #include #include #include #include #include #include #include "EventHandler.h" #include "WeaponFiredEvent.h" #include "entt/entity/entity.hpp" #include "EntitySelectedEvent.h" #include "Tick.h" #include "TickDriver.h" #include "VisualsConfig.h" class ArenaSimulation; class QPainter; class ArenaView : public QOpenGLWidget, public EventHandler { Q_OBJECT public: ArenaView(ArenaSimulation* sim, const VisualsConfig* visuals, QWidget* parent = nullptr); ~ArenaView() override; void setGameSpeed(double multiplier); double gameSpeed() const; void togglePause(); void stopRendering(); protected: void paintGL() override; void mousePressEvent(QMouseEvent* event) override; private slots: void onFrame(); private: void handleEvent(std::shared_ptr event) override; void drawTiles(QPainter& painter); void drawBuildings(QPainter& painter); void drawStations(QPainter& painter); void drawScrap(QPainter& painter); void drawShips(QPainter& painter); void drawBeams(QPainter& painter); float tilePx() const; QPointF worldToWidget(QVector2D worldPos) const; QPointF tileToWidget(QPoint tile) const; QRectF tileRect(QPoint tile) const; std::optional entityPosition(entt::entity entity) const; QVector2D widgetToWorld(QPoint widgetPt) const; struct ActiveBeam { WeaponFiredEvent event; qint64 emittedWallMs; QVector2D targetOffset; }; static constexpr qint64 kBeamLifetimeMs = 300; ArenaSimulation* m_sim; const VisualsConfig* m_visuals; TickDriver m_tickDriver; QElapsedTimer m_frameTimer; qint64 m_wallMs; std::mt19937 m_rng; double m_gameSpeedMultiplier; double m_prevNonZeroSpeed; QTimer* m_renderTimer; std::vector m_activeBeams; bool m_finishedEmitted; std::optional m_selectedEntity; };