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)
|
||||
if (!m_isSpawning && m_y > rct.height() - RADIUS) {
|
||||
emit deleted(this);
|
||||
emit fellThrough(this);
|
||||
stop();
|
||||
m_parent->update();
|
||||
return;
|
||||
|
@ -51,7 +51,10 @@ void Ball::timerEvent(QTimerEvent*) {
|
|||
|
||||
// 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))) {
|
||||
m_ky *= -1;
|
||||
emit caught(this);
|
||||
stop();
|
||||
m_parent->update();
|
||||
return;
|
||||
}
|
||||
|
||||
m_x += m_kx;
|
||||
|
|
|
@ -15,7 +15,8 @@ class Ball : public QTimer {
|
|||
void draw(QPainter& painter);
|
||||
|
||||
signals:
|
||||
void deleted(Ball* ball);
|
||||
void fellThrough(Ball* ball);
|
||||
void caught(Ball* ball);
|
||||
|
||||
protected:
|
||||
virtual void timerEvent(QTimerEvent*) override;
|
||||
|
|
|
@ -4,14 +4,18 @@
|
|||
#include <memory>
|
||||
#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);
|
||||
|
||||
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);
|
||||
connect(ball.get(), &Ball::deleted, this, &MainWindow::onDeleteBall);
|
||||
balls.append(ball);
|
||||
platform = std::make_shared<Platform>(this);
|
||||
spawnBall();
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow() {
|
||||
|
@ -33,7 +37,7 @@ void MainWindow::paintEvent(QPaintEvent*) {
|
|||
platform->draw(painter);
|
||||
}
|
||||
|
||||
void MainWindow::onDeleteBall(Ball* ball) {
|
||||
void MainWindow::deleteBall(Ball* ball) {
|
||||
// Remove the ball from the list by checking the raw pointer
|
||||
// This will also free it (smart ptrs).
|
||||
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) {
|
||||
switch (event->key()) {
|
||||
case Qt::Key_Left: leftArrowPressed = true; break;
|
||||
|
|
|
@ -25,15 +25,22 @@ class MainWindow : public QMainWindow {
|
|||
bool rightArrowPressed;
|
||||
|
||||
private slots:
|
||||
void onDeleteBall(Ball* ball); // Slot to handle the ball deletion
|
||||
void ballFell(Ball* ball);
|
||||
void ballCaught(Ball* ball);
|
||||
void onBallSpawn();
|
||||
|
||||
protected:
|
||||
virtual void paintEvent(QPaintEvent*) override;
|
||||
|
||||
void deleteBall(Ball* ball);
|
||||
void spawnBall();
|
||||
|
||||
void keyPressEvent(QKeyEvent* event) override;
|
||||
void keyReleaseEvent(QKeyEvent* event) override;
|
||||
|
||||
private:
|
||||
float m_spawnInterval;
|
||||
QTimer m_spawnTimer;
|
||||
Ui::MainWindow* ui;
|
||||
QList<std::shared_ptr<Ball>> balls;
|
||||
std::shared_ptr<Platform> platform;
|
||||
|
|
Loading…
Add table
Reference in a new issue