We are making a Pentomino/Tetris game with Java and the back end just finished. However, on the front end, we are having some issues. For example, the alignment seems nice when I first select the pentominos or parcels. But when I also select the algorithm to work on, the pentominos/parcels automatically align lower. I don't know why and how to fix the problem but it should be something about the group system. I am providing you both the nice version and the version after selecting the algorithm.
. I am also providing you the code so that you can look into it. Thanks.
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import Phase3.Data3D.MyData;
import Phase3.MyBackend.MySolvers.DLXSolver;
import Phase3.MyBackend.MySolvers.Greedy;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.shape.Line;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Scale;
public class MyScene {
private double mouseX, mouseY;
Scene scene;
BorderPane borderPane;
BorderPane mainLayout;
String algo;
private boolean dlxSelected = true;
private String type = "Pe";
Group group;
int size = 20;
Group pentParcels;
Group algoGroup;
public MyScene() {
intGroup();
pentParcels = new Group();
algoGroup = new Group();
borderPane = initBorderPane();
initVBoxAlgo();
initLabel();
initMainLayout();
scene = new Scene(mainLayout, 1000, 700, Color.BLUEVIOLET);
initButtEng();
mousy();
}
private void intGroup() {
group = new Group();
group.setTranslateX(20);
group.setTranslateY(10);
group.setTranslateZ(90);
Scale scale = new Scale(0.8, 0.8, 0.8);
group.getTransforms().add(scale);
}
private void initButtEng() {
Group buttonsEng = new Group();
Button but1 = new Button("Search");
buttonsEng.getChildren().add(but1);
borderPane.getChildren().addAll(buttonsEng);
buttonsEng.setTranslateY(630);
buttonsEng.setTranslateX(130);
but1.setOnAction(e -> {
if (dlxSelected) {
DLXSolver solver;
if (type.equals("P"))
solver = new DLXSolver(type, MyData.indecesParc);
else
solver = new DLXSolver("Pe", MyData.indecesPent);
solver.solve();
int[][][] solution = solver.bestSolution();
initCube(solution);
System.out.println("Finished");
solver.getText();
} else {
Greedy greedy = new Greedy(type);
greedy.solve();
initCube(greedy.getContainer().getField());
System.out.println(greedy.getContainer().totalValue());
}
});
}
private void initMainLayout() {
mainLayout = new BorderPane();
mainLayout.setRight(borderPane);
mainLayout.setCenter(group);
BackgroundFill backgroundFill = new BackgroundFill(Color.AQUA, null, null);
Background background = new Background(backgroundFill);
mainLayout.setBackground(background);
}
private HBox initValuesBoxes() {
HBox valuesBoxes = new HBox(10);
TextField valueField1 = new TextField();
TextField valueField2 = new TextField();
TextField valueField3 = new TextField();
valuesBoxes.getChildren().addAll(valueField1, valueField2, valueField3);
valuesBoxes.setTranslateY(-200);
borderPane.setBottom(valuesBoxes);
return valuesBoxes;
}
private void initLabel() {
Label Title = new Label("KNAPSACK PROBLEM");
Title.setTranslateX(-80);
Title.setStyle(
"-fx-font-family: 'Helvetica Bold'; -fx-font-size: 25; -fx-text-fill: white; -fx-font-weight: bold; -fx-letter-spacing: 0.1em;");
borderPane.setRight(Title);
}
private void initVBoxAlgo() {
ComboBox<String> botList = initAlgoList();
ComboBox<String> shapeList = initShapList();
botList.setTranslateX(200);
shapeList.setTranslateX(0);
botList.setTranslateY(40);
algoGroup.setTranslateX(200);
algoGroup.setTranslateY(80);
pentParcels.setTranslateX(0);
pentParcels.setTranslateY(0);
VBox vbox = new VBox(15);
vbox.getChildren().addAll(botList, shapeList, algoGroup, pentParcels);
vbox.setTranslateY(80);
vbox.setTranslateX(50);
vbox.setPrefWidth(150);
borderPane.setLeft(vbox);
shapeList.setOnAction(e -> {
String selectedShape = shapeList.getValue();
if ("Pentominos".equals(selectedShape)) {
type = "Pe";
drawPentominos();
} else if ("Parcels".equals(selectedShape)) {
type = "P";
drawParcels();
}
});
botList.setOnAction(e -> {
String selectedShape = botList.getValue();
if (selectedShape.equals("Greedy")) {
dlxSelected = false;
drawGreed();
} else if (selectedShape.equals("Dancing Links")) {
dlxSelected = true;
drawDancing();
}
});
}
private ComboBox<String> initShapList() {
ObservableList<String> options2 = FXCollections.observableArrayList("Pentominos", "Parcels");
ComboBox<String> shapeList = new ComboBox<>(options2);
// shapeList.setStyle("-fx-font-family: 'Helvetica'; -fx-font-size: 16;
// FontWieght.EXTRA_BOLD; ");
shapeList.setValue("Which Shapes?");
shapeList.setPrefWidth(200);
return shapeList;
}
private ComboBox<String> initAlgoList() {
ObservableList<String> options1 = FXCollections.observableArrayList("Dancing Links", "Greedy");
ComboBox<String> botList = new ComboBox<>(options1);
// botList.setStyle("-fx-font-family: 'Helvetica'; -fx-font-size: 16;
// FontWieght.EXTRA_BOLD; ");
botList.setValue("Which Algorithm?");
botList.setPrefWidth(200);
return botList;
}
private BorderPane initBorderPane() {
BorderPane borderPane = new BorderPane();
borderPane.setStyle("-fx-background-color: navy; -fx-border-color: black; -fx-border-width: 2px; ");
borderPane.setPrefWidth(250);
return borderPane;
}
private void mousy() {
group.setOnMousePressed(event -> {
mouseX = event.getSceneX();
mouseY = event.getSceneY();
});
group.setOnMouseDragged(event -> {
double deltaX = event.getSceneX() - mouseX;
double deltaY = event.getSceneY() - mouseY;
Point3D center = calculateCenter(group);
Rotate rotateX = new Rotate(-deltaY, center.getX(), center.getY(), center.getZ(), Rotate.X_AXIS);
Rotate rotateY = new Rotate(deltaX, center.getX(), center.getY(), center.getZ(), Rotate.Y_AXIS);
group.getTransforms().addAll(rotateX, rotateY);
mouseX = event.getSceneX();
mouseY = event.getSceneY();
});
}
private Point3D calculateCenter(Group group) {
double totalX = 0, totalY = 0, totalZ = 0;
int count = 0;
for (Node node : group.getChildren()) {
if (node instanceof Box) {
Box box = (Box) node;
totalX += box.getTranslateX();
totalY += box.getTranslateY();
totalZ += box.getTranslateZ();
count++;
}
}
return new Point3D(totalX / count, totalY / count, totalZ / count);
}
public void initCube(int[][][] container) {
group.getChildren().clear();
for (int i = 0; i < container.length; i++) {
for (int j = 0; j < container[0].length; j++) {
for (int k = 0; k < container[0][0].length; k++) {
if (container[i][j][k] == 0)
continue;
Box box = new Box(size, size, size);
/*
* After this line, I changed to code for it to work properly whenever the
* method gets changed.
*/
box.setTranslateX(i * size - container.length * size / 2.0);
box.setTranslateY(j * size - container[0].length * size / 2.0);
box.setTranslateZ(k * size - container[0][0].length * size / 2.0);
PhongMaterial material = new PhongMaterial();
material.setDiffuseColor(getColor(container[i][j][k]));
material.setSpecularPower(10);
material.setSpecularColor(getColor(container[i][j][k]));
box.setMaterial(material);
group.getChildren().add(box);
}
}
}
}
private Color getColor(int i) {
if (i == 1) {
return Color.ORANGE;
} else if (i == 2) {
return Color.YELLOW;
} else if (i == 3) {
return Color.GREEN;
} else if (i == 4) {
return Color.SEAGREEN;
} else if (i == 5) {
return Color.BLUE;
} else if (i == 6) {
return Color.RED;
} else
return Color.GRAY;
}
String[] pents = new String[] { "L", "P", "T" };
void drawPentominos() {
try {
pentParcels.getChildren().clear();
for (int i = 0; i < pents.length; i++) {
Image image = new Image(new FileInputStream("Phase3/MyFrontend/Assets/" + pents[i] + ".png"));
ImageView view = new ImageView(image);
// Set the size
view.setFitHeight(120);
view.setFitWidth(120);
// Preserve the aspect ratio
view.setPreserveRatio(true);
// Set the position
if (i == 0) {
view.setX(50);
view.setY(0);
} else if (i == 1) {
view.setX(100);
view.setY(0);
} else if (i == 2) {
view.setX(50);
view.setY(55);
}
pentParcels.getChildren().add(view);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
String[] parcels = new String[] { "A", "B", "C" };
void drawParcels() {
try {
pentParcels.getChildren().clear();
for (int i = 0; i < parcels.length; i++) {
Image image = new Image(new FileInputStream("Phase3/MyFrontend/Assets/" + parcels[i] + ".png"));
ImageView view = new ImageView(image);
// Set the size
view.setFitHeight(100);
view.setFitWidth(100);
// Preserve the aspect ratio
view.setPreserveRatio(true);
// Set the position
if (i == 0) {
view.setX(20);
view.setY(0);
} else if (i == 1) {
view.setX(60);
view.setY(8);
} else if (i == 2) {
view.setX(20);
view.setY(76);
}
pentParcels.getChildren().add(view);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
void drawGreed() {
try {
algoGroup.getChildren().clear();
Image image = new Image(new FileInputStream("Phase3/MyFrontend/Assets/greed.jpg"));
ImageView view = new ImageView(image);
view.setX(110);
view.setY(0);
view.setFitHeight(70);
view.setFitWidth(70);
algoGroup.getChildren().add(view);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
void drawDancing() {
try {
algoGroup.getChildren().clear();
Image image = new Image(new FileInputStream("Phase3/MyFrontend/Assets/dancing.jpg"));
ImageView view = new ImageView(image);
view.setX(110);
view.setY(0);
view.setFitHeight(70);
view.setFitWidth(70);
algoGroup.getChildren().add(view);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public Scene getScene() {
return scene;
}
}