We create a vertically scrolling game. So we need to figure out how to add a scrolling background.
First thing that comes to mind is to use an ImageView and position it in our game loop. Since we will be loading various data, we create a loadGame() method.
We will have various objects like
- background
- clouds
- player ship
- enemy ships
- bullets
- ...
We scroll the background by putting the background ImageView on the background layer and reposition it in the AnimationTimer.
package game;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application {
private double SCENE_WIDTH = 400;
private double SCENE_HEIGHT = 800;
/**
* Main game loop
*/
private AnimationTimer gameLoop;
/**
* Container for the background image
*/
ImageView backgroundImageView;
/**
* Scrolling speed of the background
*/
double backgroundScrollSpeed = 0.5;
/**
* Layer for the background
*/
Pane backgroundLayer;
@Override
public void start(Stage primaryStage) {
try {
// create root node
Group root = new Group();
// create layers
backgroundLayer = new Pane();
// add layers to scene root
root.getChildren().add( backgroundLayer);
// create scene
Scene scene = new Scene( root, SCENE_WIDTH,SCENE_HEIGHT);
// show stage
primaryStage.setScene(scene);
primaryStage.show();
// load game assets
loadGame();
// start the game
startGameLoop();
} catch(Exception e) {
e.printStackTrace();
}
}
private void loadGame() {
// background
// --------------------------------
backgroundImageView = new ImageView( getClass().getResource( "assets/maps/canyon.jpg").toExternalForm());
// reposition the map. it is scrolling from bottom of the background to top of the background
backgroundImageView.relocate( 0, -backgroundImageView.getImage().getHeight() + SCENE_HEIGHT);
// add background to layer
backgroundLayer.getChildren().add( backgroundImageView);
}
private void startGameLoop() {
// game loop
gameLoop = new AnimationTimer() {
@Override
public void handle(long l) {
// scroll background
// ---------------------------
// calculate new position
double y = backgroundImageView.getLayoutY() + backgroundScrollSpeed;
// check bounds. we scroll upwards, so the y position is negative. once it's > 0 we have reached the end of the map and stop scrolling
if( Double.compare( y, 0) >= 0) {
y = 0;
}
// move background
backgroundImageView.setLayoutY( y);
}
};
gameLoop.start();
}
public static void main(String[] args) {
launch(args);
}
}
Now we have a smooth scrolling background which looks like this:I'll upload my assets later. If you simply wish to check out the code, you can replace the file "assets/maps/canyon.jpg" by any of your images.

No comments:
Post a Comment