Made Mixer into an interface; moved the old mixer to SDLMixer
authorNolan Eakins <nolan@eakins.net>
Fri, 19 Dec 2003 22:07:06 +0000 (22:07 +0000)
committerNolan Eakins <nolan@eakins.net>
Fri, 19 Dec 2003 22:07:06 +0000 (22:07 +0000)
and created NullMixer which does nothing.
Mixer is now passed around as a pointer
Menu key is now handled in ButtonMapper again
onKeyDown method for Menu and MenuItem now returns bool.

12 files changed:
src/Ball.cpp
src/ButtonMapper.cpp
src/ButtonMapper.hpp
src/Field.cpp
src/Field.hpp
src/Menu.cpp
src/Menu.hpp
src/Mixer.cpp
src/Mixer.hpp
src/OptionsMenu.cpp
src/OptionsMenu.hpp
src/main.cpp

index 31f669e..3a40566 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/Ball.cpp,v 1.6 2003/12/18 06:40:51 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/Ball.cpp,v 1.7 2003/12/19 22:07:06 nolan Exp $
  */
 #include "Ball.hpp"
 #include "Field.hpp"
@@ -58,7 +58,7 @@ void Ball::update(float dt)
     setPosY(getPosY() + getVelY() * pdt);
     setVelY(-getVelY());
     pdt = dt - pdt;
-    getField().mixer.playSound(Mixer::BALL_BOUNCE);
+    getField().mixer->playSound(Mixer::BALL_BOUNCE);
   }
   else if(new_py >= (getField().height() - radius())) {
     pdt = (getField().height() - radius() - getPosY()) / getVelY();
@@ -66,7 +66,7 @@ void Ball::update(float dt)
     setPosY(getPosY() + getVelY() * pdt);
     setVelY(-getVelY());
     pdt = dt - pdt;
-    getField().mixer.playSound(Mixer::BALL_BOUNCE);
+    getField().mixer->playSound(Mixer::BALL_BOUNCE);
   }
 
   new_px = getPosX() + getVelX() * pdt;
@@ -80,7 +80,7 @@ void Ball::update(float dt)
       setPosY(getPosY() + getVelY() * pdt2);
       setVelX(-getVelX());
       pdt = pdt - pdt2;
-      getField().mixer.playSound(Mixer::BALL_BOUNCE);
+      getField().mixer->playSound(Mixer::BALL_BOUNCE);
     }
   }
   else if(new_px >= (getField().width() - getField().player2.width() - radius())) {
@@ -91,7 +91,7 @@ void Ball::update(float dt)
       setPosY(getPosY() + getVelY() * pdt2);
       setVelX(-getVelX());
       pdt = pdt - pdt2;
-      getField().mixer.playSound(Mixer::BALL_BOUNCE);
+      getField().mixer->playSound(Mixer::BALL_BOUNCE);
     }
   }
 
index 6b7ec5b..f285aa4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/ButtonMapper.cpp,v 1.4 2003/11/24 23:19:32 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/ButtonMapper.cpp,v 1.5 2003/12/19 22:07:06 nolan Exp $
  */
 #include "ButtonMapper.hpp"
 
@@ -7,8 +7,8 @@ const char *ButtonMapper::_cfg_strings[KEYS_SIZE] = {
   "menu", "pause"
 };
 
-ButtonMapper::ButtonMapper(ConfigFile &config, Field &field)
-  : _config(config), _field(field)
+ButtonMapper::ButtonMapper(ConfigFile &config, Field &field, MenuStack &menu)
+  : _config(config), _field(field), _menu(menu)
 {
   SDLKey defaults[KEYS_SIZE] = {
     SDLK_F1, SDLK_a, SDLK_z, SDLK_F2, SDLK_UP, SDLK_DOWN,
@@ -51,23 +51,10 @@ SDLKey ButtonMapper::get(KeyEnum key)
 void ButtonMapper::handle(SDL_KeyboardEvent &event)
 {
   if(event.state == SDL_PRESSED) {
-    /*if(event.keysym.sym == _keys[MENU_KEY]) {
-      //_menu.active(!_menu.active());
-      _field.pause(_menu.active());
+    if(event.keysym.sym == _keys[MENU_KEY]) {
+      _menu.active(!_menu.isActive());
     }
-    else if(event.keysym.sym == _keys[MENU_UP]) {
-      _menu.up();
-    }
-    else if(event.keysym.sym == _keys[MENU_DOWN]) {
-      _menu.down();
-    }
-    else if(event.keysym.sym == _keys[MENU_GO]) {
-      _menu.go();
-      }
-    else {
-    if(!_menu.active()) {
-    else */
-    if(event.keysym.sym == _keys[PAUSE_KEY]) {
+    else if(event.keysym.sym == _keys[PAUSE_KEY]) {
       _field.pause(!_field.paused());
     }
     else if(event.keysym.sym == _keys[PLAYER_ONE_START]) {
index 3a22466..61bbb47 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/ButtonMapper.hpp,v 1.4 2003/11/24 23:19:32 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/ButtonMapper.hpp,v 1.5 2003/12/19 22:07:06 nolan Exp $
  */
 #ifndef _BUTTONMAPPER_HPP_
 #define _BUTTONMAPPER_HPP_
@@ -23,7 +23,7 @@ public:
     KEYS_SIZE
   };
 
-  ButtonMapper(ConfigFile &config, Field &field);
+  ButtonMapper(ConfigFile &config, Field &field, MenuStack &menu);
   ~ButtonMapper();
 
   void handle(SDL_KeyboardEvent &event);
@@ -34,6 +34,7 @@ public:
 private:
   ConfigFile &_config;
   Field &_field;
+  MenuStack &_menu;
 
   static const char *_cfg_strings[KEYS_SIZE];
   SDLKey _keys[KEYS_SIZE];
index 058d464..ad28c7e 100644 (file)
@@ -1,9 +1,9 @@
-/* $Header: /home/cvsroot/pong/src/Field.cpp,v 1.5 2003/12/18 06:13:27 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/Field.cpp,v 1.6 2003/12/19 22:07:06 nolan Exp $
  */
 #include "Field.hpp"
 #include "Entity.hpp"
 
-Field::Field(ConfigFile &config, Mixer &m)
+Field::Field(ConfigFile &config, Mixer *m)
   : player1(*this, "data/paddle_one.bmp"),
     player2(*this, "data/paddle_two.bmp"),
     ball(*this),
@@ -69,7 +69,7 @@ void Field::update(float dt) // dt is in seconds
   switch(_state) {
   case TITLE:
     if(_time <= dt) {
-      mixer.playSound(Mixer::PONG);
+      mixer->playSound(Mixer::PONG);
     }
     else if(_time >= 4.0f) {
       state(PLAYING);
@@ -141,15 +141,15 @@ void Field::state(State state)
   case PLAYING:
     break;
   case SCORE:
-    mixer.playSound(Mixer::SCORED);
+    mixer->playSound(Mixer::SCORED);
     ball.reset((_last_score == PLAYER_ONE) ? true : false);
     _time = 0.0f;
     break;
   case WIN:
     if(_last_score == PLAYER_ONE)
-      mixer.playSound(Mixer::P1WINS);
+      mixer->playSound(Mixer::P1WINS);
     else
-      mixer.playSound(Mixer::P2WINS);
+      mixer->playSound(Mixer::P2WINS);
     _time = 0.0f;
     break;
   default:
index 847dbe7..e89ff0c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/Field.hpp,v 1.5 2003/12/18 06:13:27 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/Field.hpp,v 1.6 2003/12/19 22:07:06 nolan Exp $
  */
 #ifndef _FIELD_HPP_
 #define _FIELD_HPP_
@@ -13,7 +13,7 @@ class Entity;
 class Field
 {
 public:
-  Mixer &mixer;
+  Mixer *mixer;
   Ball ball;
   Paddle player1, player2;
 
@@ -24,7 +24,7 @@ public:
 
   enum PlayerNum { PLAYER_ONE, PLAYER_TWO, NONE };
 
-  Field(ConfigFile &config, Mixer &m);
+  Field(ConfigFile &config, Mixer *m);
 
   void start(PlayerNum player);
   void start(bool blue, bool red);
index bcbf3b4..3249c7a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/Menu.cpp,v 1.19 2003/12/18 07:13:14 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/Menu.cpp,v 1.20 2003/12/19 22:07:06 nolan Exp $
  */
 #include <SDL.h>
 #include "Exception.hpp"
@@ -52,11 +52,12 @@ bool MenuItem::isPointIn(int x, int y)
   }
 }
 
-void MenuItem::onKeyDown(int key)
+bool MenuItem::onKeyDown(int key)
 {
 #ifdef DEBUG_MENU
   cout << "Key down: " << key << endl;
 #endif
+  return false;
 }
 void MenuItem::onMouseEnter()
 {
@@ -352,12 +353,14 @@ void MenuItems::KeyCapturer::setKey(int key)
   _key = key;
 }
 
-void MenuItems::KeyCapturer::onKeyDown(int key)
+bool MenuItems::KeyCapturer::onKeyDown(int key)
 {
   if(_waiting) {
     _key = key;
     _waiting = false;
+    return true;
   }
+  return false;
 }
 
 void MenuItems::KeyCapturer::onMouseEnter()
@@ -423,7 +426,7 @@ MenuItem::pointer Menu::whichItem(int x, int y)
   return ret;
 }
 
-void Menu::onKeyDown(int key)
+bool Menu::onKeyDown(int key)
 {
 #if 0
   //cout << "Selected item = " << _selected_item << endl;
@@ -444,8 +447,11 @@ void Menu::onKeyDown(int key)
     //}
   }
 #endif
-  if(_selected_item != NULL)
-    _selected_item->onKeyDown(key);
+  if(_selected_item != NULL) {
+    return _selected_item->onKeyDown(key);
+  }
+  else
+    return false;
 }
 
 void Menu::onMouseMove(int x, int y)
@@ -558,13 +564,6 @@ bool MenuStack::gotoMenu(const string &menu)
 
 bool MenuStack::handle(SDL_Event &event)
 {
-  if(event.type == SDL_KEYDOWN) {
-    if(event.key.keysym.sym == SDLK_ESCAPE) {
-      active(!isActive());
-      return true;
-    }
-  }
-
   if(isActive()) {
     if(event.type == SDL_MOUSEMOTION) {
        _pointer_pos[0] = event.motion.x;
@@ -585,7 +584,7 @@ bool MenuStack::handle(SDL_Event &event)
     }
     else if(event.type == SDL_KEYDOWN) {
       if(_current) {
-       _current->onKeyDown((int)event.key.keysym.sym);
+       return _current->onKeyDown((int)event.key.keysym.sym);
       }
     }
     else {
index f0c3b33..72e3b35 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/Menu.hpp,v 1.17 2003/11/29 06:06:19 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/Menu.hpp,v 1.18 2003/12/19 22:07:06 nolan Exp $
  */
 #ifndef _MENU_HPP_
 #define _MENU_HPP_
@@ -31,7 +31,7 @@ public:
 
   bool isPointIn(int x, int y);
 
-  virtual void onKeyDown(int key);
+  virtual bool onKeyDown(int key);
 
   virtual void onMouseEnter();
   virtual void onMouseLeave();
@@ -189,7 +189,7 @@ namespace MenuItems
     void setKey(int key);
     inline int getKey() { return _key; }
 
-    void onKeyDown(int key);
+    bool onKeyDown(int key);
     void onMouseEnter();
     void onMouseLeave();
     void onMouseDown(int button, int x, int y);
@@ -213,7 +213,7 @@ public:
 
   void addItem(MenuItem *item);
 
-  void onKeyDown(int key);
+  bool onKeyDown(int key);
   void onMouseMove(int x, int y);
   void onMouseDown(int button, int x, int y);
 
index 10fe095..98ac544 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/Mixer.cpp,v 1.5 2003/12/18 07:13:14 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/Mixer.cpp,v 1.6 2003/12/19 22:07:06 nolan Exp $
  */
 #include <iostream>
 #include <SDL_mixer.h>
@@ -7,7 +7,7 @@
 using std::cout;
 using std::endl;
 
-Mixer::Mixer(ConfigFile &config)
+SDLMixer::SDLMixer(ConfigFile &config)
   : _config(config)
 {
   _rate = config.get("sound", "rate", 22050);
@@ -39,7 +39,7 @@ Mixer::Mixer(ConfigFile &config)
   }
 }
 
-Mixer::~Mixer()
+SDLMixer::~SDLMixer()
 {
   for(int i = 0; i < NUM_SOUNDS; i++) {
     Mix_FreeChunk((Mix_Chunk*)_sounds[i].chunk);
@@ -50,10 +50,22 @@ Mixer::~Mixer()
   _config.set("sound", "channels", _channels);
 }
 
-void Mixer::playSound(Sound sound)
+void SDLMixer::playSound(Sound sound)
 {
   SoundData &snd = _sounds[sound];
   if(snd.channel > -1)
     Mix_HaltChannel(snd.channel);
   snd.channel = Mix_PlayChannel(-1, (Mix_Chunk*)snd.chunk, 0);
 }
+
+NullMixer::NullMixer(ConfigFile &config)
+{
+}
+
+NullMixer::~NullMixer()
+{
+}
+
+void NullMixer::playSound(Sound sound)
+{
+}
index 451158a..d30efac 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/Mixer.hpp,v 1.3 2003/11/24 23:19:33 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/Mixer.hpp,v 1.4 2003/12/19 22:07:06 nolan Exp $
  */
 #ifndef _MIXER_HPP_
 #define _MIXER_HPP_
@@ -13,10 +13,17 @@ public:
     PONG, BALL_BOUNCE, SCORED, P1WINS, P2WINS, NUM_SOUNDS
   };
 
-  Mixer(ConfigFile &config);
-  ~Mixer();
+  virtual ~Mixer() { }
+  virtual void playSound(Sound sound) = 0;
+};
 
-  void playSound(Sound sound);
+class SDLMixer: public Mixer
+{
+public:
+  SDLMixer(ConfigFile &config);
+  virtual ~SDLMixer();
+
+  virtual void playSound(Sound sound);
 
 private:
   int _rate, _channels;
@@ -28,8 +35,16 @@ private:
   };
 
   SoundData _sounds[NUM_SOUNDS];
-
   ConfigFile &_config;
 };
 
+class NullMixer: public Mixer
+{
+public:
+  NullMixer(ConfigFile &config);
+  virtual ~NullMixer();
+
+  virtual void playSound(Sound sound);
+};
+
 #endif
index 82eed6a..20d336c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/OptionsMenu.cpp,v 1.11 2003/12/18 07:13:14 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/OptionsMenu.cpp,v 1.12 2003/12/19 22:07:06 nolan Exp $
  */
 #include "Renderer.hpp"
 #include "Color.hpp"
@@ -179,19 +179,19 @@ class ApplyCB: public MenuItems::Button::Callback
 {
 public:
   ApplyCB(OptionsMenu &parent, ButtonMapper &mapper, Renderer &renderer,
-         Mixer &mixer, Field &field);
+         Mixer *mixer, Field &field);
   void operator () ();
 
 private:
   OptionsMenu &_parent;
   ButtonMapper &_mapper;
   Renderer &_renderer;
-  Mixer &_mixer;
+  Mixer *_mixer;
   Field &_field;
 };
 
 ApplyCB::ApplyCB(OptionsMenu &parent, ButtonMapper &mapper,
-                Renderer &renderer, Mixer &mixer, Field &field)
+                Renderer &renderer, Mixer *mixer, Field &field)
   : _parent(parent), _mapper(mapper), _renderer(renderer),
     _mixer(mixer), _field(field)
 {
@@ -260,7 +260,7 @@ inline int OPT_MENU_Y(int line)
 
 OptionsMenu::OptionsMenu(MenuStack &stack, ConfigFile &config,
                         ButtonMapper &mapper, Renderer &renderer,
-                        Mixer &mixer, Field &field) throw(Exception)
+                        Mixer *mixer, Field &field) throw(Exception)
   : _logo("data/menu/opt_logo.bmp"),
     _video_res(OPT_MENU_X, OPT_MENU_Y(1), 200, 3 * 16), // FIXME: printHeight, !16
     _test("\rVideo\r\n"
index 95b9bd5..407d2d5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/OptionsMenu.hpp,v 1.10 2003/12/18 07:13:14 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/OptionsMenu.hpp,v 1.11 2003/12/19 22:07:06 nolan Exp $
  */
 #ifndef _OPTIONSMENU_HPP_
 #define _OPTIONSMENU_HPP_
@@ -71,7 +71,7 @@ class OptionsMenu: public Menu
 public:
   OptionsMenu(MenuStack &stack, ConfigFile &config,
              ButtonMapper &mapper, Renderer &renderer,
-             Mixer &mixer, Field &field) throw(Exception);
+             Mixer *mixer, Field &field) throw(Exception);
 
   inline int getP1UpKey() { return _p1_up.getKey(); }
   inline int getP1DownKey() { return _p1_down.getKey(); }
index aa1e8a5..4f322c6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/pong/src/main.cpp,v 1.20 2003/11/29 06:06:20 nolan Exp $
+/* $Header: /home/cvsroot/pong/src/main.cpp,v 1.21 2003/12/19 22:07:06 nolan Exp $
  */
 #include "headers.hpp"
 #include <streambuf>
@@ -41,6 +41,8 @@ int main(int argc, char *argv[])
       cerr << "Warning: Unable to load pong.cfg" << endl;
     }
 
+    bool no_sound = false; // set to true if -nosound is passed to pong
+
     for(int i = 0; i < argc; i++) {
       string arg(argv[i]);
       if(arg == "-fullscreen")
@@ -53,18 +55,33 @@ int main(int argc, char *argv[])
       else if(arg == "-height") {
        config.set("gfx", "height", atoi(argv[++i]));
       }
+      else if(arg == "-nosound") {
+       no_sound = true;
+      }
       else if(arg == "-help") {
        cout << "Usage: " << argv[0]
-            << "[-help] [-fullscreen] [-width WIDTH] -height [HEIGHT]" << endl;
+            << "[-help] [-fullscreen] [-width WIDTH] -height [HEIGHT]" << endl
+            << "[-nosound]" << endl;
        return 0;
       }
     }
 
-    Mixer mixer(config);
+    Mixer *mixer = NULL;
+    try {
+      if(no_sound)
+       mixer = new NullMixer(config);
+      else
+       mixer = new SDLMixer(config);
+    }
+    catch(Exception &e) {
+      cout << "Error opening SDL Mixer, starting w/o sound" << endl;
+      mixer = new NullMixer(config);
+    }
+
     Field field(config, mixer);
     Renderer renderer(config);
     MainMenu menu(field);
-    ButtonMapper mapper(config, field);
+    ButtonMapper mapper(config, field, menu);
     OptionsMenu options_menu(menu, config, mapper, renderer,
                             mixer, field); // this will need config
     menu.add("Options", &options_menu);
@@ -126,6 +143,7 @@ int main(int argc, char *argv[])
     }
 
     config.save("pong.cfg");
+    delete mixer;
     SDL_Quit();
     cout << "Goodbye" << endl;
     return 0;