Debug_demo/GameWidget.cpp (72 lines of code) (raw):
#include "GameWidget.h"
#include "Collisions.h"
#include <QTimer>
#include <QKeyEvent>
#include <QBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QPainter>
#include "GameState.h"
#define WND_WIDTH 800
#define WND_HEIGHT (WND_WIDTH * 3 / 4)
struct CanvasWidget : QWidget {
CanvasWidget(GameWidget *parent) : QWidget(parent) {}
protected:
void paintEvent(QPaintEvent *event) override {
QWidget::paintEvent(event);
QPainter painter(this);
getState()->draw(painter);
}
private:
GameState *getState() {
return static_cast<GameWidget *>(parentWidget())->state_.get();
}
};
GameWidget::GameWidget(QWidget *parent): QWidget(parent),
canvas_(new CanvasWidget(this)) {
setFocusPolicy(Qt::StrongFocus);
canvas_->setFixedSize(WND_WIDTH, WND_HEIGHT);
auto mainLayout = new QVBoxLayout;
mainLayout->addWidget(canvas_);
auto controlsLayout = new QHBoxLayout;
auto button = new QPushButton("New game", this);
controlsLayout->addWidget(button);
auto scoreLabel = new QLabel(this);
controlsLayout->addWidget(scoreLabel);
controlsLayout->addStretch();
mainLayout->addLayout(controlsLayout);
setLayout(mainLayout);
QObject::connect(button, &QPushButton::clicked, [this] {
resetState();
});
resetState();
auto timer = new QTimer(this);
const int ms = 20;
QObject::connect(timer, &QTimer::timeout, [this, ms, scoreLabel] {
state_->calc(ms);
scoreLabel->setText(QString("Score: %1").arg(state_->getScore()));
update();
});
timer->start(ms);
}
GameWidget::~GameWidget() {}
void GameWidget::keyPressEvent(QKeyEvent *event) {
QWidget::keyPressEvent(event);
switch (event->key()) {
case Qt::Key_Left:
state_->movePaddle(-20);
break;
case Qt::Key_Right:
state_->movePaddle(20);
break;
case Qt::Key_Up:
case Qt::Key_Down:
state_->movePaddle(1);
break;
default:
break;
}
}
void GameWidget::resetState() {
state_ = std::make_unique<GameState>(WND_WIDTH, WND_HEIGHT);
}