better window and singletons for queues

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

@ -12,5 +12,7 @@ void Audio::update() {
void Audio::playSound(double volume, unsigned int 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;
unsigned soundId;
};
class Audio : private Queue<AudioCommand> {
static Audio * instance;
void update() override;
public:
void playSound(double volume, unsigned soundId);
};
static void playSound(double volume, unsigned soundId);
};

@ -1,10 +1,21 @@
#include <QPainter>
#include "Game.h"
#include "InputWindow.h"
void Game::draw(QPixmap &output) {
QPainter p(&output);
double w = output.size().width();
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
#include "Queue.h"
#include "Player.h"
#include "Spectator.h"
class Game {
GameQueue * eventQueue = new GameQueue;
Player player;
std::vector<Spectator> spectators;
public:
static GameQueue * eventQueue;
explicit Game();
void draw(QPixmap & output);
void update(float dTime);
};

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

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

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

@ -3,11 +3,18 @@
#include "Listener.h"
#include "Event.h"
#include "Entity.h"
#include <QPainter>
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:
void mousePressed(MouseEvent *) override;
void mouseReleased(MouseEvent *) override;
void mouseDoubleClicked(MouseEvent *) override;
void mouseWheel(WheelEvent *) override;
};

@ -69,4 +69,4 @@ public:
};
using InputQueue = EventQueue<InputEvent>;
using GameQueue = EventQueue<GameEvent>;
using GameQueue = EventQueue<GameEvent>;

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

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

Loading…
Cancel
Save