Friday, January 23, 2015

Anansi: Global Keyboard Handler for Screenshots


Like in the prototype we want to integrate a screenshot creation mechanism. Taking screenshots isn't part of the game, so the keyboard handler got excluded from the input class. Instead we add a global event listener.

While we're at it, it's easy to add a button for pause/resume and to toggle the debug layer.

Let's get coding:

primaryStage.addEventFilter(KeyEvent.KEY_RELEASED, globalKeyEventHandler);
...
private EventHandler globalKeyEventHandler = new EventHandler() {
 
  @Override
  public void handle(KeyEvent event) {

   // toggle pause
          if( event.getCode() == KeyCode.P) { 

           if( gamePaused) {
            resumeGame();
           } else {
            pauseGame();
           }
           
          }
          // toggle debug overlay
          else if( event.getCode() == KeyCode.F10) { 

           debugLayer.setVisible( !debugLayer.isVisible());
           
          }
          // take screenshot, open save dialog and save it
          else if( event.getCode() == KeyCode.F12) {

           takeScreenshot();

          }
 }
};

And the previously mentioned utility method to take a screenshot from a scene:
public class Utils {

 /**
  * Take a screenshot of the scene in the given stage, open file save dialog and save it.
  * @param stage
  */
 public static void screenshot( Stage stage) {
  
  // take screenshot
     WritableImage image = stage.getScene().snapshot( null);

     // create file save dialog
     FileChooser fileChooser = new FileChooser();
     
     // title
        fileChooser.setTitle("Save Image");
        
        // initial directory
        fileChooser.setInitialDirectory(
                new File(System.getProperty("user.home"))
            );              
        
        // extension filter
        fileChooser.getExtensionFilters().addAll(
            // new FileChooser.ExtensionFilter("All Images", "*.*"),
            // new FileChooser.ExtensionFilter("JPG", "*.jpg"),
            new FileChooser.ExtensionFilter("PNG", "*.png")
        );
        
        // show dialog
        File file = fileChooser.showSaveDialog( stage);
        if (file != null) {
         
            try {
             
                // save file
                ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file);
                
            } catch (IOException ex) {
             
                System.err.println(ex.getMessage());
                
            }
        }
 }
 
}

No comments:

Post a Comment