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;
}
}