Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!
  • Guest, before posting your code please take these rules into consideration:
    • It is required to use our BBCode feature to display your code. While within the editor click < / > or >_ and place your code within the BB Code prompt. This helps others with finding a solution by making it easier to read and easier to copy.
    • You can also use markdown to share your code. When using markdown your code will be automatically converted to BBCode. For help with markdown check out the markdown guide.
    • Don't share a wall of code. All we want is the problem area, the code related to your issue.


    To learn more about how to use our BBCode feature, please click here.

    Thank you, Code Forum.

Java JavaFX Tetris App: Can't get animation to work

NewCoder123

New Coder
I have a problem with JavaFX tetris app. So far I've been able to program it to drop the tetris piece until it hits the bottom of the screen. I used the Timeline API to move the tetris piece every 0.5 seconds, but what I've stuck on is how to repeat the cycle. I want my app to create a new tetris piece once the old one has already hit the bottom. How would I do this?


Java:
package application;

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javafx.fxml.FXML;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.PauseTransition;
import javafx.animation.Timeline;
import javafx.util.Duration;
 
public class LayoutController {
    @FXML private Text score;
    @FXML private Text level;
    @FXML private Pane tetrisGrid;
    @FXML private Pane scoreboard;
    @FXML private AnchorPane root;
    @FXML private VBox key;
    @FXML private HBox overview;

    @FXML
    protected void initialize() {
       
       
Rectangle[] newTetro = addTetro();
       
        Timeline clock = new Timeline(new KeyFrame(Duration.millis(500), e -> {
           
            crawl(newTetro);
        }));
         clock.setCycleCount(Animation.INDEFINITE); // loop forever
         clock.play();
    }
   
    protected Rectangle[] addTetro() {
        int randPiece = new Random().nextInt(100);
        int startPosX = 8 * Main.move;
        Rectangle a = new Rectangle(Main.size - 1, Main.size - 1, Main.size - 1, Main.size - 1);
        Rectangle b = new Rectangle(Main.size - 1, Main.size - 1, Main.size - 1, Main.size - 1);
        Rectangle c = new Rectangle(Main.size - 1, Main.size - 1, Main.size - 1, Main.size - 1);
        Rectangle d = new Rectangle(Main.size - 1, Main.size - 1, Main.size - 1, Main.size - 1);
       
        if(randPiece >=0 && randPiece < 20) {
            a.getStyleClass().add("o");
            b.getStyleClass().add("o");
            c.getStyleClass().add("o");
            d.getStyleClass().add("o");
           
           
            a.setX(startPosX);
            a.setY(0);
            b.setX(a.getX() + Main.move);
            b.setY(0);
            c.setX(a.getX());
            c.setY(a.getY() + Main.move);
            d.setX(c.getX() + Main.move);
            d.setY(c.getY());
        }
        else if(randPiece >= 20 && randPiece < 40) {
            a.getStyleClass().add("i");
            b.getStyleClass().add("i");
            c.getStyleClass().add("i");
            d.getStyleClass().add("i");
       
           
            a.setX(startPosX);
            a.setY(0);
            b.setX(a.getX() + Main.move);
            b.setY(0);
            c.setX(b.getX() + Main.move);
            c.setY(0);
            d.setX(c.getX() + Main.move);
            d.setY(0);
        }
        else if(randPiece >= 40 && randPiece < 60) {
            a.getStyleClass().add("z");
            b.getStyleClass().add("z");
            c.getStyleClass().add("z");
            d.getStyleClass().add("z");
           
            a.setX(startPosX);
            a.setY(0);
            b.setX(a.getX() + Main.move);
            b.setY(0);
            c.setX(b.getX());
            c.setY(b.getY() + Main.move);
            d.setX(c.getX() + Main.move);
            d.setY(c.getY());
        }
        else if(randPiece >= 60 && randPiece < 80) {
            a.getStyleClass().add("l");
            b.getStyleClass().add("l");
            c.getStyleClass().add("l");
            d.getStyleClass().add("l");
       
           
            a.setX(startPosX);
            a.setY(0);
            b.setX(a.getX());
            b.setY(a.getY() + Main.move);
            c.setX(a.getX());
            c.setY(b.getY() + Main.move);
            d.setX(a.getX() + Main.move);
            d.setY(c.getY());
        }
        else if(randPiece >= 80 && randPiece < 100) {
            a.getStyleClass().add("t");
            b.getStyleClass().add("t");
            c.getStyleClass().add("t");
            d.getStyleClass().add("t");
           
               
            a.setX(startPosX);
            a.setY(0);
            b.setX(a.getX() - Main.move);
            b.setY(a.getY() + Main.move);
            c.setX(a.getX());
            c.setY(a.getY() + Main.move);
            d.setX(a.getX() + Main.move);
            d.setY(Main.move);
        }
       
        tetrisGrid.getChildren().addAll(a, b, c, d);
        return new Rectangle[] {a,b,c,d};
    }
   
    protected boolean crawl(Rectangle[] piece) {
        if(checkBoundaries(piece)) {
               piece[0].setY(piece[0].getY() + Main.move);
               piece[1].setY(piece[1].getY() + Main.move);
               piece[2].setY(piece[2].getY() + Main.move);
               piece[3].setY(piece[3].getY() + Main.move);
             
        }
         else {
               for(int i = 0; i < piece.length; i++) {
                   int xGridPos = (int) (piece[i].getX() / Main.move);
                   int yGridPos = (int) (piece[i].getY() / Main.move);
                      Main.grid[xGridPos][yGridPos] = 1; //indicate pieces on grid that are occupied
                }
             
               return false;
          }
       
        return true;
    }
   
    protected boolean checkBoundaries(Rectangle[] piece) {
        boolean xB = true;
        boolean yB = true;
        boolean hitOther = true;
       
        for(int i = 0; i < piece.length; i++) {
               int xGridPos = (int) (piece[i].getX() / Main.move);
               int yGridPos = (int) (piece[i].getY() / Main.move);
           
            if(piece[i].getX() < 0 || piece[i].getX() >= (Main.size * Main.col) || piece[i].getY() < 0  || piece[i].getY() >= (Main.size * Main.rows) - Main.size || Main.grid[xGridPos][yGridPos] == 1) {
                xB = false;
                yB = false;
                hitOther = false;
                break;
            }
        }
       
        return xB && yB && hitOther;  
    }
}
 

New Threads

Latest posts

Buy us a coffee!

Back
Top Bottom