Scenes in Processing

@Quertz
@quark

I worked further on this.

There is the classic approach I often used. With states and switches.

And the new approach using ONE class for each state. Using interface / implements.

  • This class contains a method showState, a method keyPressed and a method mousePressed. Therefore we just call it and don’t need switch. When we change the state, we just say currentState = new statePause(); for example.

I’d like to discuss which approach might be better.

What do you all think?

My thoughts:

  • It’s good to get rid of the switch (pro new approach)
  • we change the object inside the class (is this evil?) (in the new approach)
  • a variant of the new approach would be an array of the objects of each state and then use int state as index. Might be faster than currentState = new StateGame();

Thank you all!

Chrisir


// This is the classic approach

// Links:
// https://discourse.processing.org/t/beginner-new-pages/17774
// https://discourse.processing.org/t/scenes-in-processing/40386/5

//
// states
final int stateGame  = 0; // consts
final int statePause = 1;
int state = stateGame;    // current

// -------------------------------------------------

void setup() {
  // init (runs only once)
  size(800, 600);
} // func

void draw() {
  // runs on and on

  switch (state) {

  case stateGame:
    // Game
    handleStateGame();
    break;

  case statePause:
    // Pause
    handleStatePause();
    break;

  default:
    // error
    println("Error number 939; unknown state : "
      + state
      + ".");
    exit();
    break;
  } // switch
  //
} // func

// functions for states - called from draw()

void handleStateGame() {
  // Game
  background(11);
  fill(244, 3, 3); // red
  text ("This is the Game....\n Don't touch the red rectangle...", 210, 313);

  //
  noStroke();
  fill(255, 2, 2) ;
  rect(100, 100, 100, 100);
  fill(255, 2, 255) ;
  // rect(300, 100, 100, 100);

  if (mouseX > 100 &&
    mouseX < 100 + 100  &&
    mouseY > 100   &&
    mouseY < 100 + 100) {
    println ("collide");
    state = statePause;
  }
} // func

void handleStatePause() {
  // Pause
  background(255);
  fill(244, 3, 3); // red
  text ("You LOST....  "
    + "   ...   ", 210, 313);

  text ("Hit p to start Game", 210, 385);
} // func

// ----------------------------------------
// keyboard input

void keyPressed() {

  switch (state) {

  case stateGame:
    // Game
    keyPressedForStateGame();
    break;

  case statePause:
    // Pause
    keyPressedForStatePause();
    break;

  default:
    // error
    println("Error number 1039; unknown state : "
      + state
      + ".");
    exit();
    break;
  } // switch
} // func

// ----

void keyPressedForStateGame() {
  if (key == CODED)
  {
    if (keyCode == UP) {
      //
    } else if (keyCode == DOWN) {
      //
    }

    if (keyCode == LEFT) {
      //
    } else if (keyCode == RIGHT) {
      //
    } else {
      // do nothing
    } // else
  } //  if (key == CODED) {
  else
  {
    // not CODED ----------------------
    if (key == 'p') {
      // Pause
      state = statePause;
    } else {
      // do nothing
    } // else
  } // else not CODED
} // func

void keyPressedForStatePause() {
  if (key == CODED)
  {
    if (keyCode == UP) {
      //
    } else if (keyCode == DOWN) {
      // none
    }

    if (keyCode == LEFT) {
      //
    } else if (keyCode == RIGHT) {
      //
    } else {
      // do nothing
    } // else
  } //  if (key == CODED) {
  else
  {
    // not CODED ----------------------
    if (key == 'p') {
      //
      state = stateGame;
    } else {
      // do nothing
    } // else
  } // else not CODED
} // func

//----------------------------------------------------------------------

void mousePressed() {

  switch (state) {

  case stateGame:
    // Game
    println("mouse 1");
    break;

  case statePause:
    // Pause
    println("mouse 2");
    break;

  default:
    // error
    println("Error number 1046; unknown state : "
      + state
      + ".");
    exit();
    break;
  } // switch
} // func
// -------------------------------------------------------


New approach.




// This is the NEW approach

// Links:
// https://discourse.processing.org/t/beginner-new-pages/17774
// https://discourse.processing.org/t/scenes-in-processing/40386/5
// Interface example
// https://discourse.processing.org/t/classes-and-arraylist/9626/3

StateInterface currentState = new StateGame();

// -------------------------------------------------

void setup() {
  // init (runs only once)
  size(800, 600);
} // func

void draw() {
  // runs on and on
  currentState.showState();
}

// ----------------------------------------
// keyboard input

void keyPressed() {
  currentState.keyPressedState();
}

//----------------------------------------

void mousePressed() {
  currentState.mousePressedState();
}

// ===============================================================================================

class StateGame implements StateInterface {
  // Game
  void showState() {
    // Game
    background(11);
    fill(244, 3, 3); // red
    text ("This is the Game....\n Don't touch the red rectangle...", 210, 313);

    //
    noStroke();
    fill(255, 2, 2) ;
    rect(100, 100, 100, 100);
    fill(255, 2, 255) ;
    // rect(300, 100, 100, 100);

    if (mouseX > 100 &&
      mouseX < 100 + 100  &&
      mouseY > 100   &&
      mouseY < 100 + 100) {
      println ("collide");
      currentState = new statePause();
    }
  } // func

  void keyPressedState() {
    if (key == CODED)
    {
      if (keyCode == UP) {
        //
      } else if (keyCode == DOWN) {
        //
      }

      if (keyCode == LEFT) {
        //
      } else if (keyCode == RIGHT) {
        //
      } else {
        // do nothing
      } // else
    } //  if (key == CODED) {
    else
    {
      // not CODED ----------------------
      if (key == 'p') {
        // Pause
        currentState =  new statePause();
      } else {
        // do nothing
      } // else
    } // else not CODED
  } // func

  void mousePressedState() {
    // Game
    println("mouse 1");
  }//func
}//class

// ===========================================================================================

class statePause implements StateInterface {
  void showState() {
    // Pause
    background(255);
    fill(244, 3, 3); // red
    text ("You LOST....  "
      + "   ...   ", 210, 313);

    text ("Hit p to start Game", 210, 385);
  } // func

  void keyPressedState() {
    if (key == CODED)
    {
      if (keyCode == UP) {
        //
      } else if (keyCode == DOWN) {
        // none
      }

      if (keyCode == LEFT) {
        //
      } else if (keyCode == RIGHT) {
        //
      } else {
        // do nothing
      } // else
    } //  if (key == CODED) {
    else
    {
      // not CODED ----------------------
      if (key == 'p') {
        //
        currentState = new StateGame();
      } else {
        // do nothing
      } // else
    } // else not CODED
  } // func

  void mousePressedState() {
    // Pause
    println("mouse 2");
  }//func
}

// =====================================

interface StateInterface {

  // Let's abstract

  // Let's abstract display()
  void showState();
  void keyPressedState();
  void mousePressedState();
}
//

Thank you all.

Chrisir

2 Likes