File indexing completed on 2023-10-03 03:29:06
0001 /* 0002 SPDX-FileCopyrightText: 2007 Paolo Capriotti <p.capriotti@gmail.com> 0003 SPDX-FileCopyrightText: 2010 Brian Croom <brian.s.croom@gmail.com> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #ifndef MAINAREA_H 0009 #define MAINAREA_H 0010 0011 #include <QElapsedTimer> 0012 #include <QTime> 0013 #include <QList> 0014 #include <QGraphicsScene> 0015 #include <QScopedPointer> 0016 #include <QRandomGenerator> 0017 0018 #include <KGameRenderer> 0019 #include <KgSound> 0020 #include "animator.h" 0021 #include "message.h" 0022 0023 class Renderer; 0024 class Ball; 0025 class Animation; 0026 class QGraphicsSceneMouseEvent; 0027 class QAction; 0028 0029 struct Collision; 0030 0031 class MainArea : public QGraphicsScene 0032 { 0033 Q_OBJECT 0034 private: 0035 QTimer m_timer; 0036 int m_lastTime; 0037 int m_lastGameTime; 0038 QElapsedTimer m_time; 0039 0040 /// time interval between two balls being added 0041 int m_ball_timeout; 0042 0043 int m_size; 0044 KGameRenderer m_renderer; 0045 Animator m_animator; 0046 QFont m_msgFont; 0047 0048 QList<Ball*> m_balls; 0049 QList<Ball*> m_fading; 0050 Ball* m_man; 0051 0052 // Player's ball diameter 0053 int m_manBallDiameter; 0054 // Other balls' diameter 0055 int m_ballDiameter; 0056 0057 /// the blue ball is dead 0058 bool m_death; 0059 0060 /// the falling animation is over, we're waiting for a new game to start 0061 bool m_game_over; 0062 0063 bool m_paused; 0064 int m_pauseTime; 0065 int m_penalty; 0066 0067 QList<MessagePtr> m_welcomeMsg; 0068 QList<MessagePtr> m_pauseMsg; 0069 0070 // Flag if automatic incremental ball size is enabled. 0071 bool m_increaseBallSize; 0072 0073 // Flag if sound is enabled. 0074 bool m_soundEnabled; 0075 0076 KgSound m_soundHitWall; 0077 KgSound m_soundYouLose; 0078 KgSound m_soundBallLeaving; 0079 KgSound m_soundStart; 0080 0081 QAction * m_pauseAction; 0082 0083 QScopedPointer<QRandomGenerator> m_random; 0084 0085 double radius() const; 0086 void setBallDiameter(int val); 0087 0088 QPointF randomPoint() const; 0089 QPointF randomDirection(double val) const; 0090 0091 Ball* addBall(const QString& id); 0092 bool collide(const QPointF& a, const QPointF& b, 0093 double diamA, double diamB, Collision& collision); 0094 0095 Animation* writeMessage(const QString& text); 0096 Animation* writeText(const QString& text, bool fade = true); 0097 void displayMessages(const QList<QExplicitlySharedDataPointer<Message> >& msgs); 0098 void playSound(int sound); 0099 void onDeath(); 0100 void setManPosition(const QPointF& p); 0101 protected: 0102 void mousePressEvent(QGraphicsSceneMouseEvent* e) override; 0103 void focusOutEvent(QFocusEvent*) override; 0104 public: 0105 MainArea(); 0106 void start(); 0107 void setPauseAction(QAction * action); 0108 public Q_SLOTS: 0109 void tick(); 0110 void increaseBallSize(bool enable); 0111 void enableSounds(bool enable); 0112 void abort(); 0113 void togglePause(); 0114 Q_SIGNALS: 0115 void starting(); 0116 void gameOver(int); 0117 void changeBallNumber(int); 0118 void changeGameTime(int); 0119 void changeState(bool); 0120 void pause(bool); 0121 }; 0122 0123 #endif // MAINAREA_H