better window and singletons for queues

main
Benjamin Kraft 2 years ago
parent 80c996a48c
commit a80adc6f44
  1. 4
      src/Audio.cpp
  2. 5
      src/Audio.h
  3. 15
      src/Game.cpp
  4. 9
      src/Game.h
  5. 2
      src/InputWindow.cpp
  6. 2
      src/InputWindow.h
  7. 24
      src/Player.cpp
  8. 13
      src/Player.h
  9. 10
      src/Window.cpp
  10. 1
      src/main.cpp

@ -12,5 +12,7 @@ void Audio::update() {
void Audio::playSound(double volume, unsigned int soundId) { void Audio::playSound(double volume, unsigned int soundId) {
auto command = new AudioCommand {volume, soundId}; auto command = new AudioCommand {volume, soundId};
push(command); instance->push(command);
} }
Audio * Audio::instance = new Audio;

@ -6,9 +6,10 @@ struct AudioCommand {
double volume; double volume;
unsigned soundId; unsigned soundId;
}; };
class Audio : private Queue<AudioCommand> { class Audio : private Queue<AudioCommand> {
static Audio * instance;
void update() override; void update() override;
public: public:
void playSound(double volume, unsigned soundId); static void playSound(double volume, unsigned soundId);
}; };

@ -1,10 +1,21 @@
#include <QPainter> #include <QPainter>
#include "Game.h" #include "Game.h"
#include "InputWindow.h"
void Game::draw(QPixmap &output) { void Game::draw(QPixmap &output) {
QPainter p(&output); QPainter p(&output);
double w = output.size().width(); double w = output.size().width();
double h = output.size().height(); double h = output.size().height();
p.fillRect(w / 2 - 10, h / 2 - 10, 20, 20, Qt::red);
p.drawEllipse(0, 0, 20, 20); player.draw(p);
}
void Game::update(float dTime) {
player.update(dTime);
} }
Game::Game() {
InputWindow::inputQueue->registerListener(&player);
}
GameQueue * Game::eventQueue = new GameQueue;

@ -1,10 +1,15 @@
#pragma once #pragma once
#include "Queue.h" #include "Queue.h"
#include "Player.h"
#include "Spectator.h"
class Game { class Game {
GameQueue * eventQueue = new GameQueue; Player player;
std::vector<Spectator> spectators;
public: public:
static GameQueue * eventQueue;
explicit Game();
void draw(QPixmap & output); void draw(QPixmap & output);
void update(float dTime);
}; };

@ -27,3 +27,5 @@ void InputWindow::keyPressEvent(QKeyEvent *event) {
void InputWindow::keyReleaseEvent(QKeyEvent *event) { void InputWindow::keyReleaseEvent(QKeyEvent *event) {
inputQueue->submitEvent(new KeyReleaseEvent(event->key())); inputQueue->submitEvent(new KeyReleaseEvent(event->key()));
} }
InputQueue * InputWindow::inputQueue = new InputQueue ;

@ -5,7 +5,7 @@
class InputWindow : public QWidget { class InputWindow : public QWidget {
public: public:
InputQueue * inputQueue = new InputQueue; static InputQueue * inputQueue;
protected: protected:
void mousePressEvent(QMouseEvent * event) override; void mousePressEvent(QMouseEvent * event) override;
void mouseReleaseEvent(QMouseEvent * event) override; void mouseReleaseEvent(QMouseEvent * event) override;

@ -2,17 +2,25 @@
#include <iostream> #include <iostream>
void Player::mousePressed(MouseEvent *event) { void Player::mousePressed(MouseEvent *event) {
std::cout << event->pos.x() << " pressed\n"; if (pos.y() == ground)
vel += {0, -300};
} }
void Player::mouseReleased(MouseEvent *event) { void Player::draw(QPainter &painter) {
std::cout << event->pos.x() << " released\n"; painter.save();
}
painter.translate(pos.toPoint());
painter.fillRect(-5, -5, 10, 10, Qt::black);
void Player::mouseDoubleClicked(MouseEvent * event) { painter.restore();
std::cout << event->pos.x() << " double clicked\n";
} }
void Player::mouseWheel(WheelEvent * event) { void Player::update(float dTime) {
std::cout << event->delta << " wheel" << std::endl; pos += vel * dTime;
vel += acc * dTime;
if (pos.y() > ground){
pos.setY(ground);
vel = {};
}
} }

@ -3,11 +3,18 @@
#include "Listener.h" #include "Listener.h"
#include "Event.h" #include "Event.h"
#include "Entity.h" #include "Entity.h"
#include <QPainter>
class Player : public Entity, public GameListener, public InputListener { class Player : public Entity, public GameListener, public InputListener {
QVector2D pos {50, 50};
QVector2D vel {};
QVector2D acc {0, 9.81 * 30};
float ground = 400;
public:
void draw(QPainter &painter);
void update(float dTime);
protected: protected:
void mousePressed(MouseEvent *) override; void mousePressed(MouseEvent *) override;
void mouseReleased(MouseEvent *) override;
void mouseDoubleClicked(MouseEvent *) override;
void mouseWheel(WheelEvent *) override;
}; };

@ -4,18 +4,20 @@
Window::Window() { Window::Window() {
timer = new QTimer(this); timer = new QTimer(this);
timer->setInterval(17); timer->setInterval(17);
connect(timer, &QTimer::timeout, this, [this]{ update(); }); connect(timer, &QTimer::timeout, this, [this]{
update();
game.update(17.f / 1000);
});
timer->start(); timer->start();
label = new QLabel(this); label = new QLabel(this);
label->resize(size()); label->resize(size());
} }
void Window::paintEvent(QPaintEvent *event) { void Window::paintEvent(QPaintEvent *event) {
QPixmap output(label->size()); QPixmap output(1000, 500);
output.fill(Qt::white); output.fill(Qt::white);
game.draw(output); game.draw(output);
label->setPixmap(output); label->setPixmap(output.scaled(label->size()));
} }
void Window::resizeEvent(QResizeEvent *e) { void Window::resizeEvent(QResizeEvent *e) {

@ -8,6 +8,7 @@ int main(int argc, char * argv[]){
QApplication app(argc, argv); QApplication app(argc, argv);
Window w; Window w;
w.resize(800, 400);
w.show(); w.show();
return QApplication::exec(); return QApplication::exec();

Loading…
Cancel
Save