#ifndef MAZESCENE_H #define MAZESCENE_H #include #include #include #include #include #include #include #include #include #include "matrix4x4.h" class MazeScene; class MediaPlayer; class Entity; class View : public QGraphicsView { Q_OBJECT public: View(); void resizeEvent(QResizeEvent *event); }; class Camera { public: Camera() : m_yaw(0) , m_pitch(0) { } qreal yaw() const { return m_yaw; } qreal pitch() const { return m_pitch; } QPointF pos() const { return m_pos; } void setYaw(qreal yaw) { m_yaw = yaw; } void setPitch(qreal pitch) { m_pitch = pitch; } void setPos(const QPointF &pos) { m_pos = pos; } Matrix4x4 matrix(qreal time) const; private: qreal m_yaw; qreal m_pitch; QPointF m_pos; }; class Light { public: Light() {} Light(const QPointF &pos, qreal intensity); qreal intensityAt(const QPointF &pos) const; QPointF pos() const { return m_pos; } qreal intensity() const { return m_intensity; } private: QPointF m_pos; qreal m_intensity; }; class ProjectedItem : public QGraphicsItem { public: ProjectedItem(const QRectF &bounds, bool shadow = true); QPointF a() const { return m_a; } QPointF b() const { return m_b; } virtual void updateTransform(const Camera &camera, qreal time); QRectF boundingRect() const; void setPosition(const QPointF &a, const QPointF &b); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void setAnimationTime(qreal time); void setImage(const QImage &image); void updateLighting(const QVector &lights); void setConstantLight(qreal value); private: QPointF m_a; QPointF m_b; QRectF m_bounds; QRectF m_targetRect; QImage m_image; QGraphicsRectItem *m_shadowItem; }; class WallItem : public ProjectedItem { public: WallItem(MazeScene *scene, const QPointF &a, const QPointF &b, int type); QGraphicsProxyWidget *childItem() const { return m_childItem; } int type() const { return m_type; } void childResized(); private: QGraphicsProxyWidget *m_childItem; int m_type; qreal m_scale; }; class MazeScene : public QGraphicsScene { Q_OBJECT public: MazeScene(const QVector &lights, const char *map, int width, int height); void addProjectedItem(ProjectedItem *item); void addEntity(Entity *entity); void addWall(const QPointF &a, const QPointF &b, int type); void drawBackground(QPainter *painter, const QRectF &rect); bool tryMove(QPointF &pos, const QPointF &delta, Entity *entity = 0) const; Camera camera() const { return m_camera; } protected: void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event); bool eventFilter(QObject *target, QEvent *event); bool handleKey(int key, bool pressed); public slots: void move(); void toggleRenderer(); void toggleDoors(); private slots: void moveDoors(qreal value); private: bool blocked(const QPointF &pos, Entity *entity) const; void updateTransforms(); QVector m_walls; QVector m_doors; QVector m_floorTiles; QVector m_buttons; QVector m_entities; QVector m_lights; QVector m_projectedItems; Camera m_camera; qreal m_walkingVelocity; qreal m_strafingVelocity; qreal m_turningSpeed; qreal m_pitchSpeed; QTime m_time; QTimeLine *m_doorAnimation; long m_simulationTime; long m_walkTime; int m_width; int m_height; MediaPlayer *m_player; QPointF m_playerPos; }; #endif