diff --git a/stella/src/emucore/EventHandler.cxx b/stella/src/emucore/EventHandler.cxx index 0bd2ba27e..def3e9765 100644 --- a/stella/src/emucore/EventHandler.cxx +++ b/stella/src/emucore/EventHandler.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EventHandler.cxx,v 1.89 2005-08-29 18:36:41 stephena Exp $ +// $Id: EventHandler.cxx,v 1.90 2005-08-30 01:10:54 stephena Exp $ //============================================================================ #include @@ -48,21 +48,19 @@ void handleMacOSXKeypress(int key); } #endif +#define JOY_DEADZONE 3200 + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EventHandler::EventHandler(OSystem* osystem) - : myOSystem(osystem), - myState(S_NONE), - myLSState(0), - myPauseFlag(false), - myQuitFlag(false), - myGrabMouseFlag(false), - myUseLauncherFlag(false), - myPaddleMode(0), - myMouseX(0), - myMouseY(0), - myLastMouseMoveX(0), - myLastMouseMoveY(0) - + : myOSystem(osystem), + myState(S_NONE), + myLSState(0), + myPauseFlag(false), + myQuitFlag(false), + myGrabMouseFlag(false), + myUseLauncherFlag(false), + myPaddleMode(0), + myMouseMove(3) { // Add this eventhandler object to the OSystem myOSystem->attach(this); @@ -103,6 +101,9 @@ EventHandler::EventHandler(OSystem* osystem) myGrabMouseFlag = myOSystem->settings().getBool("grabmouse"); myFryingFlag = false; + + memset(&myJoyMouse, 0, sizeof(myJoyMouse)); + myJoyMouse.delay_time = 25; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -156,6 +157,11 @@ void EventHandler::reset(State state) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EventHandler::refreshDisplay() { + // These are reset each time the display changes size + myJoyMouse.x_max = myOSystem->frameBuffer().imageWidth(); + myJoyMouse.y_max = myOSystem->frameBuffer().imageHeight(); + myMouseMove = myOSystem->frameBuffer().zoomLevel() * 3; + switch(myState) { case S_EMULATE: @@ -269,6 +275,9 @@ void EventHandler::poll(uInt32 time) { SDL_Event event; + // Handle joystick to mouse emulation + handleJoyMouse(time); + // Check for an event while(SDL_PollEvent(&event)) { @@ -474,7 +483,6 @@ void EventHandler::poll(uInt32 time) break; // SDL_KEYUP, SDL_KEYDOWN } - case SDL_MOUSEMOTION: handleMouseMotionEvent(event); break; // SDL_MOUSEMOTION @@ -506,7 +514,7 @@ void EventHandler::poll(uInt32 time) // Read joystick events and modify event states uInt8 stick; uInt32 code; - uInt8 state; + uInt8 state = 0; Uint8 axis; Uint8 button; Int32 resistance; @@ -536,19 +544,19 @@ void EventHandler::poll(uInt32 time) code = event.jbutton.button; state = event.jbutton.state == SDL_PRESSED ? 1 : 0; -#ifdef PSP +//#ifdef PSP handleWarpMouseButton(code,state); -#endif +//#endif handleJoyEvent(stick, code, state); break; case SDL_JOYAXISMOTION: axis = event.jaxis.axis; value = event.jaxis.value; -#ifdef PSP - if (state!=S_EMULATE) - handleMouseWarp(stick,axis,value); -#endif +//#ifdef PSP +// if(state != S_EMULATE) + handleMouseWarp(stick, axis, value); +//#endif if(axis == 0) // x-axis { handleJoyEvent(stick, kJAxisLeft, (value < -16384) ? 1 : 0); @@ -735,6 +743,9 @@ void EventHandler::handleMouseMotionEvent(SDL_Event& event) { // Take window zooming into account int x = event.motion.x, y = event.motion.y; + myJoyMouse.x = x; + myJoyMouse.y = y; + myOSystem->frameBuffer().translateCoords(&x, &y); // Determine which mode we're in, then send the event to the appropriate place @@ -840,10 +851,101 @@ void EventHandler::handleMouseButtonEvent(SDL_Event& event, uInt8 state) } } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void EventHandler::handleJoyMouse(uInt32 time) +{ + bool mouseAccel = false; // FIXME - make this a commandline option + + if (time >= myJoyMouse.last_time + myJoyMouse.delay_time) + { + myJoyMouse.last_time = time; + if (myJoyMouse.x_down_count == 1) + { + myJoyMouse.x_down_time = time; + myJoyMouse.x_down_count = 2; + } + if (myJoyMouse.y_down_count == 1) + { + myJoyMouse.y_down_time = time; + myJoyMouse.y_down_count = 2; + } + + if (myJoyMouse.x_vel || myJoyMouse.y_vel) + { + if (myJoyMouse.x_down_count) + { + if (mouseAccel && time > myJoyMouse.x_down_time + myJoyMouse.delay_time * 12) + { + if (myJoyMouse.x_vel > 0) + myJoyMouse.x_vel++; + else + myJoyMouse.x_vel--; + } + else if (time > myJoyMouse.x_down_time + myJoyMouse.delay_time * 8) + { + if (myJoyMouse.x_vel > 0) + myJoyMouse.x_vel = myMouseMove; + else + myJoyMouse.x_vel = -myMouseMove; + } + } + if (myJoyMouse.y_down_count) + { + if (mouseAccel && time > myJoyMouse.y_down_time + myJoyMouse.delay_time * 12) + { + if (myJoyMouse.y_vel > 0) + myJoyMouse.y_vel++; + else + myJoyMouse.y_vel--; + } + else if (time > myJoyMouse.y_down_time + myJoyMouse.delay_time * 8) + { + if (myJoyMouse.y_vel > 0) + myJoyMouse.y_vel = myMouseMove; + else + myJoyMouse.y_vel = -myMouseMove; + } + } + + myJoyMouse.x += myJoyMouse.x_vel; + myJoyMouse.y += myJoyMouse.y_vel; + + if (myJoyMouse.x < 0) + { + myJoyMouse.x = 0; + myJoyMouse.x_vel = -1; + myJoyMouse.x_down_count = 1; + } + else if (myJoyMouse.x > myJoyMouse.x_max) + { + myJoyMouse.x = myJoyMouse.x_max; + myJoyMouse.x_vel = 1; + myJoyMouse.x_down_count = 1; + } + + if (myJoyMouse.y < 0) + { + myJoyMouse.y = 0; + myJoyMouse.y_vel = -1; + myJoyMouse.y_down_count = 1; + } + else if (myJoyMouse.y > myJoyMouse.y_max) + { + myJoyMouse.y = myJoyMouse.y_max; + myJoyMouse.y_vel = 1; + myJoyMouse.y_down_count = 1; + } + + SDL_WarpMouse(myJoyMouse.x, myJoyMouse.y); + } + } +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EventHandler::handleWarpMouseButton(uInt8 event_button, uInt8 state) { -#ifdef PSP +// FIXME - this will disappear, and be integrated directly into handleJoyEvent() +#if 0 // Determine which mode we're in, then send the event to the appropriate place switch(myState) { @@ -936,29 +1038,43 @@ void EventHandler::handleWarpMouseButton(uInt8 event_button, uInt8 state) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void EventHandler::handleMouseWarp(uInt8 stick,uInt8 axis,Int16 value) +void EventHandler::handleMouseWarp(uInt8 stick, uInt8 axis, Int16 value) { -#ifdef PSP - Int32 new_x = myMouseX; - Int32 new_y = myMouseY; - value = value / 4000; - if (axis == 0) - { - myLastMouseMoveX = value; - } - else if (axis == 1) - { - myLastMouseMoveY = value; - } - new_x += myLastMouseMoveX; - new_y += myLastMouseMoveY; + if(value > JOY_DEADZONE) + value -= JOY_DEADZONE; + else if(value < -JOY_DEADZONE ) + value += JOY_DEADZONE; + else + value = 0; - if (new_x >=0 and new_x <= PSP_SCREEN_WIDTH) - myMouseX = new_x; - if (new_y >=0 and new_y <= PSP_SCREEN_HEIGHT) - myMouseY = new_y; - SDL_WarpMouse(myMouseX,myMouseY); -#endif + if(axis == 0) // X axis + { + if (value != 0) + { + myJoyMouse.x_vel = (value > 0) ? 1 : -1; + myJoyMouse.x_down_count = 1; + } + else + { + myJoyMouse.x_vel = 0; + myJoyMouse.x_down_count = 0; + } + } + else if(axis == 1) // Y axis + { + value = -value; + + if (value != 0) + { + myJoyMouse.y_vel = (-value > 0) ? 1 : -1; + myJoyMouse.y_down_count = 1; + } + else + { + myJoyMouse.y_vel = 0; + myJoyMouse.y_down_count = 0; + } + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/emucore/EventHandler.hxx b/stella/src/emucore/EventHandler.hxx index f4bc2b5b5..08d283374 100644 --- a/stella/src/emucore/EventHandler.hxx +++ b/stella/src/emucore/EventHandler.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EventHandler.hxx,v 1.47 2005-08-29 18:36:41 stephena Exp $ +// $Id: EventHandler.hxx,v 1.48 2005-08-30 01:10:54 stephena Exp $ //============================================================================ #ifndef EVENTHANDLER_HXX @@ -74,7 +74,7 @@ struct Stella_Joystick { mapping can take place. @author Stephen Anthony - @version $Id: EventHandler.hxx,v 1.47 2005-08-29 18:36:41 stephena Exp $ + @version $Id: EventHandler.hxx,v 1.48 2005-08-30 01:10:54 stephena Exp $ */ class EventHandler { @@ -284,6 +284,13 @@ class EventHandler void handleMouseWarp(uInt8 stick, uInt8 axis, Int16 value); void handleWarpMouseButton(uInt8 event_button, uInt8 state); + /** + Handle joystick movement emulating mouse motion + + @param time Current millisecond count + */ + void handleJoyMouse(uInt32 time); + /** The following methods take care of assigning action mappings. */ @@ -355,10 +362,16 @@ class EventHandler // The current joymap in string form string myJoymapString; - Int32 myMouseX; - Int32 myMouseY; - Int32 myLastMouseMoveX; - Int32 myLastMouseMoveY; + // Used for joystick to mouse emulation + struct JoyMouse { + int x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count; + unsigned int last_time, delay_time, x_down_time, y_down_time; + }; + + JoyMouse myJoyMouse; + + // How far the joystick will move the mouse on each frame tick + int myMouseMove; }; #endif diff --git a/stella/src/emucore/FrameBuffer.hxx b/stella/src/emucore/FrameBuffer.hxx index d19978462..bd4c485b3 100644 --- a/stella/src/emucore/FrameBuffer.hxx +++ b/stella/src/emucore/FrameBuffer.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBuffer.hxx,v 1.55 2005-08-29 18:36:41 stephena Exp $ +// $Id: FrameBuffer.hxx,v 1.56 2005-08-30 01:10:54 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_HXX @@ -52,7 +52,7 @@ enum FrameStyle { All GUI elements (ala ScummVM) are drawn here as well. @author Stephen Anthony - @version $Id: FrameBuffer.hxx,v 1.55 2005-08-29 18:36:41 stephena Exp $ + @version $Id: FrameBuffer.hxx,v 1.56 2005-08-30 01:10:54 stephena Exp $ */ class FrameBuffer { @@ -196,6 +196,11 @@ class FrameBuffer */ uInt32 maxWindowSizeForScreen(); + /** + Returns current zoomlevel of the framebuffer. + */ + uInt32 zoomLevel() { return theZoomLevel; } + /** Set the title for the main SDL window. */ diff --git a/stella/src/emucore/OSystem.cxx b/stella/src/emucore/OSystem.cxx index 62f4f9c7e..4fbbca3c8 100644 --- a/stella/src/emucore/OSystem.cxx +++ b/stella/src/emucore/OSystem.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: OSystem.cxx,v 1.34 2005-08-29 18:36:41 stephena Exp $ +// $Id: OSystem.cxx,v 1.35 2005-08-30 01:10:54 stephena Exp $ //============================================================================ #include @@ -348,7 +348,7 @@ bool OSystem::createConsole(const string& romfile) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void OSystem::createLauncher() { - setFramerate(20); // We don't need a large framerate for the launcher + setFramerate(60); myEventHandler->reset(EventHandler::S_LAUNCHER); // Create the window diff --git a/stella/src/gui/LauncherDialog.cxx b/stella/src/gui/LauncherDialog.cxx index 153416e2d..b24638e0b 100644 --- a/stella/src/gui/LauncherDialog.cxx +++ b/stella/src/gui/LauncherDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: LauncherDialog.cxx,v 1.29 2005-08-22 18:17:10 stephena Exp $ +// $Id: LauncherDialog.cxx,v 1.30 2005-08-30 01:10:54 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -53,9 +53,7 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent, myProgressBar(NULL) { const GUI::Font& font = instance()->font(); - const int fontWidth = font.getMaxCharWidth(), - fontHeight = font.getFontHeight(), - lineHeight = font.getLineHeight(); + const int fontHeight = font.getFontHeight(); // Show game name new StaticTextWidget(this, 10, 8, 200, fontHeight, diff --git a/stella/src/psp/OSystemPSP.cxx b/stella/src/psp/OSystemPSP.cxx index cdc7601a6..f84c52ba1 100644 --- a/stella/src/psp/OSystemPSP.cxx +++ b/stella/src/psp/OSystemPSP.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: OSystemPSP.cxx,v 1.1 2005-08-25 15:19:17 stephena Exp $ +// $Id: OSystemPSP.cxx,v 1.2 2005-08-30 01:10:54 stephena Exp $ //============================================================================ #include @@ -24,6 +24,9 @@ #include #include +#include +#include + #include "bspf.hxx" #include "OSystem.hxx" #include "OSystemPSP.hxx" @@ -72,7 +75,8 @@ OSystemPSP::OSystemPSP() string cacheFile = basedir + "/stella.cache"; setCacheFile(cacheFile); - // No drivers are specified for Unix + // Overclock CPU to 333MHz + scePowerSetClockFrequency(333,333,166); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -87,71 +91,32 @@ void OSystemPSP::mainLoop() // and are needed to calculate the overall frames per second. uInt32 frameTime = 0, numberOfFrames = 0; - if(mySettings->getBool("accurate")) // normal, CPU-intensive timing + // Set up less accurate timing stuff + uInt32 startTime, virtualTime, currentTime; + + // Set the base for the timers + virtualTime = getTicks(); + frameTime = 0; + + // Main game loop + for(;;) { - // Set up accurate timing stuff - uInt32 startTime, delta; + // Exit if the user wants to quit + if(myEventHandler->doQuit()) + break; - // Set the base for the timers - frameTime = 0; + startTime = getTicks(); + myEventHandler->poll(startTime); + myFrameBuffer->update(); + currentTime = getTicks(); + virtualTime += myTimePerFrame; + if(currentTime < virtualTime) + SDL_Delay((virtualTime - currentTime)/1000); - // Main game loop - for(;;) - { - // Exit if the user wants to quit - if(myEventHandler->doQuit()){ - break; - } - startTime = getTicks(); - myEventHandler->poll(startTime); - myFrameBuffer->update(); - - // Now, waste time if we need to so that we are at the desired frame rate - for(;;) - { - delta = getTicks() - startTime; - - if(delta >= myTimePerFrame) - break; - } - - frameTime += getTicks() - startTime; - ++numberOfFrames; - } + currentTime = getTicks() - startTime; + frameTime += currentTime; + ++numberOfFrames; } - else // less accurate, less CPU-intensive timing - { - // Set up less accurate timing stuff - uInt32 startTime, virtualTime, currentTime; - - // Set the base for the timers - virtualTime = getTicks(); - frameTime = 0; - - - // Main game loop - for(;;) - { - // Exit if the user wants to quit - if(myEventHandler->doQuit()){ - break; - } - - startTime = getTicks(); - myEventHandler->poll(startTime); - myFrameBuffer->update(); - currentTime = getTicks(); - virtualTime += myTimePerFrame; - if(currentTime < virtualTime) - { - SDL_Delay((virtualTime - currentTime)/1000); - } - currentTime = getTicks() - startTime; - frameTime += currentTime; - ++numberOfFrames; - } - } - } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -