Spawn balls on a timer
This commit is contained in:
parent
d4c0a3ca08
commit
a5d465c533
4 changed files with 49 additions and 10 deletions
|
@ -43,7 +43,7 @@ void Ball::timerEvent(QTimerEvent*) {
|
||||||
}
|
}
|
||||||
// Bottom collision (only if no longer spawning)
|
// Bottom collision (only if no longer spawning)
|
||||||
if (!m_isSpawning && m_y > rct.height() - RADIUS) {
|
if (!m_isSpawning && m_y > rct.height() - RADIUS) {
|
||||||
emit deleted(this);
|
emit fellThrough(this);
|
||||||
stop();
|
stop();
|
||||||
m_parent->update();
|
m_parent->update();
|
||||||
return;
|
return;
|
||||||
|
@ -51,7 +51,10 @@ void Ball::timerEvent(QTimerEvent*) {
|
||||||
|
|
||||||
// Platform collision (only if no longer spawning)
|
// Platform collision (only if no longer spawning)
|
||||||
if (!m_isSpawning && m_platform->rect().intersects(QRect(m_x, m_y, RADIUS * 2.0, RADIUS * 2.0))) {
|
if (!m_isSpawning && m_platform->rect().intersects(QRect(m_x, m_y, RADIUS * 2.0, RADIUS * 2.0))) {
|
||||||
m_ky *= -1;
|
emit caught(this);
|
||||||
|
stop();
|
||||||
|
m_parent->update();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_x += m_kx;
|
m_x += m_kx;
|
||||||
|
|
|
@ -15,7 +15,8 @@ class Ball : public QTimer {
|
||||||
void draw(QPainter& painter);
|
void draw(QPainter& painter);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void deleted(Ball* ball);
|
void fellThrough(Ball* ball);
|
||||||
|
void caught(Ball* ball);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void timerEvent(QTimerEvent*) override;
|
virtual void timerEvent(QTimerEvent*) override;
|
||||||
|
|
|
@ -4,14 +4,18 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <qnamespace.h>
|
#include <qnamespace.h>
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow), leftArrowPressed{false}, rightArrowPressed{false} {
|
#define INIT_SPAWN_SPEED 1500.0
|
||||||
|
#define SPAWN_SPEED_INCREASE 100.0
|
||||||
|
#define MIN_SPAWN_SPEED 100.0
|
||||||
|
|
||||||
|
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow), leftArrowPressed{false}, rightArrowPressed{false}, m_spawnInterval{INIT_SPAWN_SPEED} {
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
platform = std::make_shared<Platform>(this);
|
connect(&m_spawnTimer, &QTimer::timeout, this, &MainWindow::onBallSpawn);
|
||||||
|
m_spawnTimer.start(m_spawnInterval);
|
||||||
|
|
||||||
auto ball = std::make_shared<Ball>(this, platform);
|
platform = std::make_shared<Platform>(this);
|
||||||
connect(ball.get(), &Ball::deleted, this, &MainWindow::onDeleteBall);
|
spawnBall();
|
||||||
balls.append(ball);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow() {
|
MainWindow::~MainWindow() {
|
||||||
|
@ -33,7 +37,7 @@ void MainWindow::paintEvent(QPaintEvent*) {
|
||||||
platform->draw(painter);
|
platform->draw(painter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onDeleteBall(Ball* ball) {
|
void MainWindow::deleteBall(Ball* ball) {
|
||||||
// Remove the ball from the list by checking the raw pointer
|
// Remove the ball from the list by checking the raw pointer
|
||||||
// This will also free it (smart ptrs).
|
// This will also free it (smart ptrs).
|
||||||
for (auto it = balls.begin(); it != balls.end(); ++it) {
|
for (auto it = balls.begin(); it != balls.end(); ++it) {
|
||||||
|
@ -45,6 +49,30 @@ void MainWindow::onDeleteBall(Ball* ball) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::spawnBall() {
|
||||||
|
auto ball = std::make_shared<Ball>(this, platform);
|
||||||
|
connect(ball.get(), &Ball::fellThrough, this, &MainWindow::ballFell);
|
||||||
|
connect(ball.get(), &Ball::caught, this, &MainWindow::ballCaught);
|
||||||
|
balls.append(ball);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::ballFell(Ball* ball) {
|
||||||
|
deleteBall(ball);
|
||||||
|
// TODO: Game over
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::ballCaught(Ball* ball) {
|
||||||
|
m_spawnInterval -= SPAWN_SPEED_INCREASE;
|
||||||
|
if (m_spawnInterval < MIN_SPAWN_SPEED)
|
||||||
|
m_spawnInterval = MIN_SPAWN_SPEED;
|
||||||
|
deleteBall(ball);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onBallSpawn() {
|
||||||
|
spawnBall();
|
||||||
|
m_spawnTimer.start(m_spawnInterval);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::keyPressEvent(QKeyEvent* event) {
|
void MainWindow::keyPressEvent(QKeyEvent* event) {
|
||||||
switch (event->key()) {
|
switch (event->key()) {
|
||||||
case Qt::Key_Left: leftArrowPressed = true; break;
|
case Qt::Key_Left: leftArrowPressed = true; break;
|
||||||
|
|
|
@ -25,15 +25,22 @@ class MainWindow : public QMainWindow {
|
||||||
bool rightArrowPressed;
|
bool rightArrowPressed;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onDeleteBall(Ball* ball); // Slot to handle the ball deletion
|
void ballFell(Ball* ball);
|
||||||
|
void ballCaught(Ball* ball);
|
||||||
|
void onBallSpawn();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void paintEvent(QPaintEvent*) override;
|
virtual void paintEvent(QPaintEvent*) override;
|
||||||
|
|
||||||
|
void deleteBall(Ball* ball);
|
||||||
|
void spawnBall();
|
||||||
|
|
||||||
void keyPressEvent(QKeyEvent* event) override;
|
void keyPressEvent(QKeyEvent* event) override;
|
||||||
void keyReleaseEvent(QKeyEvent* event) override;
|
void keyReleaseEvent(QKeyEvent* event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
float m_spawnInterval;
|
||||||
|
QTimer m_spawnTimer;
|
||||||
Ui::MainWindow* ui;
|
Ui::MainWindow* ui;
|
||||||
QList<std::shared_ptr<Ball>> balls;
|
QList<std::shared_ptr<Ball>> balls;
|
||||||
std::shared_ptr<Platform> platform;
|
std::shared_ptr<Platform> platform;
|
||||||
|
|
Loading…
Add table
Reference in a new issue