Files
dota_factory/src/balancing/ArenaView.h

90 lines
2.1 KiB
C++

#pragma once
#include <optional>
#include <random>
#include <vector>
#include <QElapsedTimer>
#include <QOpenGLWidget>
#include <QTimer>
#include <QVector2D>
#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<WeaponFiredEvent>
{
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<const WeaponFiredEvent> 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<QVector2D> 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<ActiveBeam> m_activeBeams;
bool m_finishedEmitted;
std::optional<entt::entity> m_selectedEntity;
};