File indexing completed on 2024-04-28 04:02:16

0001 /*
0002     SPDX-FileCopyrightText: 2009 Ian Wadham <iandw.au@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef KGRTIMER_H
0008 #define KGRTIMER_H
0009 
0010 #include <QElapsedTimer>
0011 #include <QTimer>
0012 
0013 class KGrTimer : public QObject
0014 {
0015     Q_OBJECT
0016 public:
0017     explicit KGrTimer (QObject * parent, int pTick = 20, float pScale = 1.0);
0018     ~KGrTimer() override;
0019 
0020     void pause();
0021     void resume();
0022     void step();
0023     inline void setScale (const float pScale)
0024                          { scaledTime = (pScale * tickTime) + 0.5; }
0025 
0026 Q_SIGNALS:
0027     /**
0028      * This signal powers the whole game. KGrLevelPlayer connects it to its
0029      * tick() slot.
0030      *
0031      * @param missed       If true, the QTimer has missed one or more ticks, due
0032      *                     to overheads elsewhere in Qt or the O/S. The game
0033      *                     catches up on the missed signal(s) and the graphics
0034      *                     view avoids painting any sprites until the catchup
0035      *                     is complete, thus saving further overheads. The
0036      *                     sprites may "jump" a little when this happens, but
0037      *                     at least the game stays on-time in wall-clock time.
0038      * @param pScaledTime  The number of milliseconds per tick. Usually this is
0039      *                     tickTime (= 20 msec), but it is less when the game is
0040      *                     slowed down or more when it is speeded up. If the
0041      *                     scaled time is 10 (beginner speed), the game will
0042      *                     take 2 ticks of 20 msec (i.e. 40 msec) to do what it
0043      *                     normally does in 20 msec.
0044      */
0045     void tick (bool missed, int pScaledTime);
0046 
0047 private Q_SLOTS:
0048     void internalSlot();
0049 
0050 private:
0051     QElapsedTimer    t;
0052     QTimer * ticker;
0053     int      tickTime;
0054     int      scaledTime;
0055     int      tickCount;
0056     int      halfTick;
0057     int      expectedTime;
0058 };
0059 
0060 #endif // KGRTIMER_H