89 lines
2.0 KiB
C++
89 lines
2.0 KiB
C++
#pragma once
|
|
|
|
#include <optional>
|
|
#include <random>
|
|
#include <vector>
|
|
|
|
#include <QElapsedTimer>
|
|
#include <QOpenGLWidget>
|
|
#include <QTimer>
|
|
#include <QVector2D>
|
|
|
|
#include "FireEvent.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
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
ArenaView(ArenaSimulation* sim, const VisualsConfig* visuals,
|
|
QWidget* parent = nullptr);
|
|
|
|
void setGameSpeed(double multiplier);
|
|
double gameSpeed() const;
|
|
void togglePause();
|
|
void stopRendering();
|
|
|
|
signals:
|
|
void speedChanged(double multiplier);
|
|
void finished();
|
|
|
|
protected:
|
|
void paintGL() override;
|
|
void mousePressEvent(QMouseEvent* event) override;
|
|
|
|
private slots:
|
|
void onFrame();
|
|
|
|
private:
|
|
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
|
|
{
|
|
FireEvent 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;
|
|
};
|