Почему положения узлов в моей сетке влияют на макет моей сетки? - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь воссоздать игру «змея», используя GridPane в JavaFX.Мой код, кажется, работает правильно, за исключением этой конкретной ошибки, когда всякий раз, когда я использую свои ключи, чтобы пройти зеленый узел (озаглавленный заголовок) к желтому узлу (озаглавленный питание), строки или столбцы сетки, кажется, сокращаются на одну единицу,вызывая коллапс сетки в некотором роде.Есть ли способ остановить изменение размера GridPane?Ниже мой код:

package snake;

import java.util.ArrayList;
import java.util.Random;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.TilePane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class snakemain extends Application {
    Random random = new Random();
    int posX = random.nextInt(21), posY = random.nextInt(21), foodposX = random.nextInt(24), foodposY = random.nextInt(24);

    public static void main(String... args) {
        launch(args);
    }

    public void start(Stage stage) {
        //Creates Scene and stage setting + gridpane
        stage.setTitle("Snake by Yeldor");
        GridPane gridpane = new GridPane();
        Random random = new Random();
        Scene scene = new Scene(gridpane, 500, 500);
        scene.setFill(Color.WHITE);
        gridpane.setGridLinesVisible(true);
        gridpane.setHgap(20);
        gridpane.setVgap(20);
        //creates head of snake, Arraylist of snakes body parts, and food consumable for snake
        ArrayList<Rectangle> snakeBody = new ArrayList<Rectangle>();
        Rectangle head = new Rectangle(20,20,Color.GREEN.brighter().brighter());
        //invisible block to manage grid
        Rectangle food = new Rectangle(20,20, Color.YELLOW.brighter().brighter());
        //adds rectangles to grippane
        gridpane.add(head, posX, posY);
        gridpane.add(food, foodposX, foodposY);
        //makes food non mangaged by the gridpane
        scene.setOnKeyPressed(e -> 
        {
            String s = e.getCode().toString();
        try {

            switch(s) {
            case "W":   gridpane.getChildren().remove(head);
                        gridpane.add(head, posX, --posY);
                    break;
            case "A":   gridpane.getChildren().remove(head);
                        gridpane.add(head, --posX, posY);
                    break;
            case "S":   gridpane.getChildren().remove(head);
                        gridpane.add(head, posX, ++posY);
                    break;
            case "D":   gridpane.getChildren().remove(head);
                        gridpane.add(head, ++posX, posY);
                    break;
            }


            if (posX == 24 || posY == 24 || posX == -1 || posY == -1) {
                missionFailed();
                stage.close();
            }

        }

        catch(IllegalArgumentException error) {
            missionFailed();
            stage.close();
        }

        });

        stage.setScene(scene);
        stage.show();

    }

    void missionFailed() {
        Stage failedPopup = new Stage();
        failedPopup.setTitle("You Died!");
        failedPopup.initModality(Modality.APPLICATION_MODAL);
        Button OK = new Button("OK");
        Group group = new Group();
        Scene miniScene = new Scene(group, 150, 100);
        group.getChildren().add(OK);
        failedPopup.setScene(miniScene);
        failedPopup.show();
        OK.setOnMouseClicked(q -> {
            failedPopup.close();
        });
    }

}

1 Ответ

0 голосов
/ 21 октября 2018

Использование hgap и vgap не изменяет размер столбца, оно изменяет пространство между столбцами .Например, если вы поместите Rectangle s рядом друг с другом по горизонтали (один и тот же индекс строки, индекс столбца, отличающийся на 1), расстояние между обоими узлами будет vgap;ровно 2 столбца заполнены и имеют ширину! = 0. Теперь переместите Rectangle s в ту же ячейку, и только один столбец с шириной! = 0 приведет к неожиданным результатам.

Вместо этогоВы должны ограничить размер строк / столбцов:

// gridpane.setHgap(20);
// gridpane.setVgap(20);

int rows = 500 / 20;
int columns = 500 / 20;

RowConstraints rConstraints = new RowConstraints(20);
ColumnConstraints cConstraints = new ColumnConstraints(20);

for (int i = 0; i < columns; i++) {
    gridpane.getColumnConstraints().add(cConstraints);
}
for (int i = 0; i < rows; i++) {
    gridpane.getRowConstraints().add(rConstraints);
}
...