Resúmenes
Apuntes universitarios en formato Markdown desde Obsidian.
Animazioni con JavaFX
download Descargar MDNella cartella src/main/java andremo ad elencare i package di seguito, mentre nella cartella src/main/resources/images si trovano le immagini dell'omino che si muove.
PACKAGE: application
Per quanto riguarda il file Main.java:
package application;
public class Main {
public static void main(String[] args) {
MainApplication.main(args);
}
}
Per quanto riguarda il file MainApplication.java:
package application;
import application.controller.MovementController;
import application.view.GraphicPanel;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class MainApplication extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
GraphicPanel gp = new GraphicPanel();
MovementController controller = new MovementController(gp);
gp.addController(controller);
Scene scene = new Scene(gp);
primaryStage.setScene(scene);
primaryStage.setWidth(800);
primaryStage.setHeight(800);
primaryStage.setTitle("Java FX animation");
primaryStage.show();
GameLoop gameLoop = new GameLoop(controller);
gameLoop.start();
}
}
Per quanto riguarda il file GameLoop.java:
package application;
import application.controller.MovementController;
import javafx.animation.AnimationTimer;
public class GameLoop extends AnimationTimer {
private MovementController controller;
private long previousTime = 0;
private long frequency = 60 * 1000000;
public GameLoop(MovementController controller) {
this.controller = controller;
}
@Override
public void handle(long now) {
if(now-previousTime >= frequency) {
controller.update();
previousTime = now;
}
}
}
PACKAGE: application.controller
Per quanto riguarda il file MovementController.java:
package application.controller;
import application.model.Game;
import application.view.GraphicPanel;
import javafx.event.EventHandler;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
public class MovementController implements EventHandler<KeyEvent> {
private GraphicPanel gp;
public MovementController(GraphicPanel gp) {
this.gp = gp;
}
public void update() {
gp.update();
}
@Override
public void handle(KeyEvent event) {
if(event.getCode() != KeyCode.RIGHT)
return;
if(event.getEventType().equals(KeyEvent.KEY_PRESSED)) {
Game.getInstance().move();
gp.move();
}
else if(event.getEventType().equals(KeyEvent.KEY_RELEASED)) {
gp.stop();
}
}
}
PACKAGE: application.model
Per quanto riguarda il file Game.java:
package application.model;
public class Game {
private MyCharacter character;
private static Game game = null;
private Game() {
character = new MyCharacter();
character.x = 0;
character.y = 0;
character.speed = 10;
}
public static Game getInstance() {
if(game == null)
game = new Game();
return game;
}
public MyCharacter getCharacter() { return character; }
public void move() { character.x += character.speed; }
}
Per quanto riguarda il file MyCharacter.java:
package application.model;
public class MyCharacter {
int x; int y;
int speed;
public int getX() { return x; }
public int getY() { return y; }
}
PACKAGE: application.view
Per quanto riguarda il file CharacterView.java:
package application.view;
import java.util.ArrayList;
import javafx.scene.image.Image;
public class CharacterView {
private ArrayList<Image> images;
Image currentImage;
int dim;
private int index;
private boolean move;
CharacterView() {
images = new ArrayList<Image>();
dim = 147;
move = false;
index = 0;
for(int i = 0; i < 10; i++) {
Image img = new Image(getClass().getResourceAsStream
("/application/resources/"+i+".png"));
images.add(img);
}
currentImage = images.get(0);
}
public void move() { move = true; }
public void stop() { move = false; }
public void update() {
if(move) {
index++;
if(index == images.size()) index = 0;
}
else { index = 0; }
currentImage = images.get(index);
}
}
Per quanto riguarda il file GraphicPanel.java:
package application.view;
import application.controller.MovementController;
import application.model.Game;
import javafx.scene.canvas.Canvas;
import javafx.scene.layout.StackPane;
public class GraphicPanel extends StackPane {
private CharacterView cv = new CharacterView();
private Canvas canvas;
public GraphicPanel() {
canvas = new Canvas();
canvas.setFocusTraversable(true);
getChildren().add(canvas);
canvas.widthProperty().bind(this.widthProperty());
canvas.heightProperty().bind(this.heightProperty());
}
public void addController(MovementController controller) {
canvas.setOnKeyPressed(controller);
canvas.setOnKeyReleased(controller);
}
private void draw() {
canvas.getGraphicsContext2D().clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
int x = Game.getInstance().getCharacter().getX();
int y = Game.getInstance().getCharacter().getY();
canvas.getGraphicsContext2D().drawImage(cv.currentImage, x, y, cv.dim, cv.dim);
}
public void move() { cv.move(); }
public void stop() { cv.stop(); }
public void update() {
cv.update();
draw();
}
}