I'd like to get rid of the border around the screenshots of our game. Until now I did them with windows print screen key. JavaFX has a built-in snapshot command. So let's use that one.
Here's a small utility class that I created using a tutorial on the Oracle website.
package game.utils; import java.io.File; import java.io.IOException; import javafx.embed.swing.SwingFXUtils; import javafx.scene.image.WritableImage; import javafx.stage.FileChooser; import javafx.stage.Stage; import javax.imageio.ImageIO; 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()); } } } }We can use it by extending our KEY_RELEASED event handler. The utility method demands a stage as parameter, so we need to keep a reference of the primary stage in a global variable.
Stage primaryStage; @Override public void start(Stage primaryStage) { this.primaryStage = primaryStage; ... }
The screenshot key will be F12.
... @Override public void handle(KeyEvent event) { // register key up keyboardBitSet.set(event.getCode().ordinal(), false); // take screenshot, open save dialog and save it if( event.getCode() == KeyCode.F12) { // pause game gameLoop.stop(); // save screenshot Utils.screenshot( primaryStage); // resume game gameLoop.start(); } } ...And now we got nice PNG files without the windows border whenever we press the screenshot key:
No comments:
Post a Comment