From: slack Date: Fri, 13 Mar 2009 02:39:41 +0000 (+0100) Subject: qtboi is playable :D X-Git-Url: http://slack.codemaniacs.com/git/?a=commitdiff_plain;h=bc64059b6e32217a5ea2b245314106b3e110585c;p=wenboi.git qtboi is playable :D --- diff --git a/qtboi/QtBoiEmuThread.cc b/qtboi/QtBoiEmuThread.cc index d6a26a7..f4b1a28 100644 --- a/qtboi/QtBoiEmuThread.cc +++ b/qtboi/QtBoiEmuThread.cc @@ -64,6 +64,17 @@ void QtBoiEmuThread::loadROM(QString name) romLoaded=true; } + +void QtBoiEmuThread::pressControl(GameBoy::Control c) +{ + gb.push_control(c); +} + +void QtBoiEmuThread::releaseControl(GameBoy::Control c) +{ + gb.release_control(c); +} + void QtBoiEmuThread::reset() { resetRequested=true; @@ -95,11 +106,10 @@ void QtBoiEmuThread::step() void QtBoiEmuThread::run() { - GameBoy gb; - cout << "GB created, emu thread running" << endl; + cout << "emu thread running" << endl; // wait until ROM is loaded - while(!romLoaded) + while(!romLoaded && !quitRequested) msleep(500); while(!quitRequested) @@ -126,6 +136,7 @@ void QtBoiEmuThread::run() { frameCount = gb.video.get_frames_rendered(); emit redraw(gb.video.get_screen_buffer()); + msleep(5); } } break; diff --git a/qtboi/QtBoiEmuThread.h b/qtboi/QtBoiEmuThread.h index bb9b854..1088277 100644 --- a/qtboi/QtBoiEmuThread.h +++ b/qtboi/QtBoiEmuThread.h @@ -10,6 +10,7 @@ class QtBoiEmuThread: public QThread Q_OBJECT public: + GameBoy gb; GameBoy::run_status status; bool isPaused; int frameCount; @@ -19,6 +20,9 @@ class QtBoiEmuThread: public QThread void loadROM(QString romName); + void pressControl(GameBoy::Control); + void releaseControl(GameBoy::Control); + public slots: void reset(); void run(); @@ -32,8 +36,9 @@ class QtBoiEmuThread: public QThread void redraw(const uchar *buffer); private: - QString romName; enum RunningMode { RUN, STEP }; + + QString romName; RunningMode runningMode; bool quitRequested; bool resetRequested; diff --git a/qtboi/QtBoiMainWindow.cc b/qtboi/QtBoiMainWindow.cc index 71820da..4f2549f 100644 --- a/qtboi/QtBoiMainWindow.cc +++ b/qtboi/QtBoiMainWindow.cc @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -22,14 +23,28 @@ QtBoiMainWindow::QtBoiMainWindow(QWidget *parent) screen->setColor(1, qRgb(212,212,212)); screen->setColor(0, qRgb(255,255,255)); - createMenu(); - resize(640,480); - centralWindow = new QLabel(this); - setCentralWidget(centralWindow); - emuThread = new QtBoiEmuThread(this); emuThread->start(); + loadROM = new QAction(tr("&Load ROM..."), this); + quit = new QAction(tr("&Quit"), this); + emulatorPause = new QAction(tr("&Pause"), this); + emulatorCont = new QAction(tr("&Go"), this); + emulatorStop = new QAction(tr("&Stop"), this); + emulatorStep = new QAction(tr("St&ep"), this); + emulatorReset = new QAction(tr("&Reset"), this); + + loadROM->setShortcut(QKeySequence(tr("Ctrl+O", "File|Load ROM..."))); + emulatorCont->setShortcut(QKeySequence(tr("F5", "Emulator|Go"))); + emulatorStep->setShortcut(QKeySequence(tr("F7", "Debug|Step"))); + //emulatorCont->setIcon(QIcon("../icons/player_play.svg")); + //emulatorPause->setIcon(QIcon("../icons/player_pause.svg")); + //loadROM->setIcon(QIcon("../icons/player_eject.svg")); + + createMenu(); + createToolbar(); + + connect(emulatorCont, SIGNAL(triggered()), emuThread, SLOT(cont())); connect(emulatorStop, SIGNAL(triggered()), emuThread, SLOT(stop())); connect(emulatorPause, SIGNAL(triggered()), emuThread, SLOT(pause())); @@ -37,6 +52,10 @@ QtBoiMainWindow::QtBoiMainWindow(QWidget *parent) connect(emulatorReset, SIGNAL(triggered()), emuThread, SLOT(reset())); connect(emuThread, SIGNAL(redraw(const uchar*)), this, SLOT(onRedraw(const uchar*))); + resize(640,480); + centralWindow = new QLabel(this); + setCentralWidget(centralWindow); + centralWindow->move(0,0); } QtBoiMainWindow::~QtBoiMainWindow() @@ -50,35 +69,36 @@ QtBoiMainWindow::~QtBoiMainWindow() void QtBoiMainWindow::createMenu() { - loadROM = new QAction("&Load ROM...", this); - quit = new QAction("&Quit", this); - emulatorPause = new QAction("&Pause", this); - emulatorCont = new QAction("&Go", this); - emulatorStop = new QAction("&Stop", this); - emulatorStep = new QAction("St&ep", this); - emulatorReset = new QAction("&Reset", this); - - QMenu *file; - file = menuBar()->addMenu("&File"); + file = menuBar()->addMenu(tr("&File")); file->addAction(loadROM); file->addAction(quit); QMenu *emulator; - emulator = menuBar()->addMenu("&Emulator"); + emulator = menuBar()->addMenu(tr("&Emulator")); emulator->addAction(emulatorCont); emulator->addAction(emulatorPause); emulator->addAction(emulatorStop); emulator->addAction(emulatorReset); QMenu *debug; - debug = menuBar()->addMenu("&Debug"); + debug = menuBar()->addMenu(tr("&Debug")); debug->addAction(emulatorStep); connect(quit, SIGNAL(triggered()), qApp, SLOT(quit())); connect(loadROM, SIGNAL(triggered()), this, SLOT(onLoadROM())); } +void QtBoiMainWindow::createToolbar() +{ + QToolBar *toolbar; + toolbar = addToolBar(tr("&Emulator")); + toolbar->addAction(loadROM); + toolbar->addAction(emulatorCont); + toolbar->addAction(emulatorPause); + toolbar->addAction(emulatorReset); +} + void QtBoiMainWindow::onLoadROM() { QString filename = QFileDialog::getOpenFileName(this, tr("Load ROM"), "../roms", tr("GameBoy ROMs (*.gb *.gbc)")); @@ -95,6 +115,80 @@ void QtBoiMainWindow::onRedraw(const uchar *buffer) centralWindow->setPixmap(QPixmap::fromImage(screen->scaled(320,288))); } +void QtBoiMainWindow::keyPressEvent(QKeyEvent *event) +{ + if (emuThread->isPaused) { + QMainWindow::keyPressEvent(event); + return; + } + switch(event->key()) + { + case Qt::Key_Up: + emuThread->pressControl(GameBoy::PAD_UP); + break; + case Qt::Key_Down: + emuThread->pressControl(GameBoy::PAD_DOWN); + break; + case Qt::Key_Left: + emuThread->pressControl(GameBoy::PAD_LEFT); + break; + case Qt::Key_Right: + emuThread->pressControl(GameBoy::PAD_RIGHT); + break; + case Qt::Key_Z: + emuThread->pressControl(GameBoy::BUTTON_A); + break; + case Qt::Key_X: + emuThread->pressControl(GameBoy::BUTTON_B); + break; + case Qt::Key_Return: + emuThread->pressControl(GameBoy::BUTTON_SELECT); + break; + case Qt::Key_Space: + emuThread->pressControl(GameBoy::BUTTON_START); + break; + default: + QMainWindow::keyPressEvent(event); + } +} + +void QtBoiMainWindow::keyReleaseEvent(QKeyEvent *event) +{ + if (emuThread->isPaused) { + QMainWindow::keyReleaseEvent(event); + return; + } + switch(event->key()) + { + case Qt::Key_Up: + emuThread->releaseControl(GameBoy::PAD_UP); + break; + case Qt::Key_Down: + emuThread->releaseControl(GameBoy::PAD_DOWN); + break; + case Qt::Key_Left: + emuThread->releaseControl(GameBoy::PAD_LEFT); + break; + case Qt::Key_Right: + emuThread->releaseControl(GameBoy::PAD_RIGHT); + break; + case Qt::Key_Z: + emuThread->releaseControl(GameBoy::BUTTON_A); + break; + case Qt::Key_X: + emuThread->releaseControl(GameBoy::BUTTON_B); + break; + case Qt::Key_Return: + emuThread->releaseControl(GameBoy::BUTTON_SELECT); + break; + case Qt::Key_Space: + emuThread->releaseControl(GameBoy::BUTTON_START); + break; + default: + QMainWindow::keyReleaseEvent(event); + } +} + diff --git a/qtboi/QtBoiMainWindow.h b/qtboi/QtBoiMainWindow.h index 1382339..17edd0f 100644 --- a/qtboi/QtBoiMainWindow.h +++ b/qtboi/QtBoiMainWindow.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -21,7 +22,14 @@ class QtBoiMainWindow: public QMainWindow void onRedraw(const uchar *buffer); private: + // private functions void createMenu(); + void createToolbar(); + + // events + void keyPressEvent(QKeyEvent *event); + void keyReleaseEvent(QKeyEvent *event); + QtBoiEmuThread *emuThread; QLabel *centralWindow;