qtboi is playable :D
authorslack <slack@codemaniacs.com>
Fri, 13 Mar 2009 02:39:41 +0000 (03:39 +0100)
committerslack <slack@codemaniacs.com>
Fri, 13 Mar 2009 02:39:41 +0000 (03:39 +0100)
qtboi/QtBoiEmuThread.cc
qtboi/QtBoiEmuThread.h
qtboi/QtBoiMainWindow.cc
qtboi/QtBoiMainWindow.h

index d6a26a7f3c9f70624ff919569841794dc0ce36b4..f4b1a28ca6e8371d725d9583c1467630a06f5b9e 100644 (file)
@@ -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;
index bb9b85494d17f567f3911fcf2e6bba09eb6aab29..1088277e234e2dae52594d6a2c9896e2f5825f31 100644 (file)
@@ -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;
index 71820dacdb90e3f548bff6040c7905c1c429eb0c..4f2549f49a7352cf9f7da3e418868a420dc5e864 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <QMenu>
 #include <QMenuBar>
+#include <QToolBar>
 #include <QString>
 #include <QFileDialog>
 #include <QPushButton>
@@ -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);
+       }
+}
+
 
 
 
index 13823395fe640a295c7a0534854ea4d4a438f39c..17edd0fe47cf5bec9f12b8611db3b36f2cfb132d 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <QApplication>
 #include <QMainWindow>
+#include <QKeyEvent>
 #include <QPushButton>
 #include <QImage>
 #include <QLabel>
@@ -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;