英文:
Convert my coordinate to actual JavaFx coordinate
问题
我正在尝试制作一个名为Cascadia的游戏。由于每个图块都是六边形,为了表示它,我使用了一个哈希映射来存储点(坐标)和图块。
HashMap<Point, Tile> board;
这个点遵循这个结构。
每个图块的宽度为100像素。
示例图块的示例。
问题是如何将我在哈希映射中使用的这些点转换为场景上的实际坐标?
对于图块向左或向右移动,我没有问题,因为我只需添加或减去100像素。
英文:
I'm trying to build a game called Cascadia. Since every tile is a hexagon, to represent it I used a hashmap to store the point(coordinate) and the tile.
HashMap<Point, Tile> board;
The point follows this structure.
Each tile is a width of 100 pixels.
example of a tile.
The problem is how do I convert those points that I used in my hashmap and convert it into the actual coordinate on my scene?
I have no problem with the tiles going left or right since I can just add or subtract 100(pixels).
答案1
得分: 3
将坐标存储为字段
在这种方法中,Hexagon
实例有两个整数表示坐标。任何六边形都会将 x 和 y 打印为舞台标题,如下所示:
这是一个可以尝试的单一 JavaFX 应用程序
App.java
public class App extends Application {
@Override
public void start(Stage stage) {
double HexagonRadius = 100;
Hexagon hexagon1 = new Hexagon(1, 2, HexagonRadius, Color.CADETBLUE);
Hexagon hexagon2 = new Hexagon(1, 0, HexagonRadius, Color.MEDIUMPURPLE);
hexagon2.setTranslateY(hexagon1.getOffsetY() * 2);
Hexagon hexagon3 = new Hexagon(1, 1, HexagonRadius, Color.MEDIUMSEAGREEN);
hexagon3.setTranslateY(-hexagon1.getOffsetY() * 2);
Hexagon hexagon4 = new Hexagon(0, 0, HexagonRadius, Color.CORNFLOWERBLUE);
hexagon4.setTranslateY(-hexagon1.getOffsetY());
hexagon4.setTranslateX(hexagon1.getOffsetX());
Hexagon hexagon5 = new Hexagon(2, 2, HexagonRadius, Color.YELLOW);
hexagon5.setTranslateY(-hexagon1.getOffsetY());
hexagon5.setTranslateX(-hexagon1.getOffsetX());
Hexagon hexagon6 = new Hexagon(2, 0, HexagonRadius, Color.ORANGE);
hexagon6.setTranslateY(hexagon1.getOffsetY());
hexagon6.setTranslateX(-hexagon1.getOffsetX());
Hexagon hexagon7 = new Hexagon(2, 3, HexagonRadius, Color.SKYBLUE);
hexagon7.setTranslateY(hexagon1.getOffsetY());
hexagon7.setTranslateX(hexagon1.getOffsetX());
Group hexagonsGroup
= new Group(hexagon1, hexagon2, hexagon3, hexagon4, hexagon5, hexagon6, hexagon7);
StackPane stackPane = new StackPane(hexagonsGroup);
var scene = new Scene(stackPane, 640, 480);
scene.setFill(Color.ANTIQUEWHITE);
stage.setScene(scene);
stage.show();
}
// ... 省略其他部分 ...
}
public final class Hexagon extends Group {
// ... 省略其他部分 ...
public Hexagon(int x, int y, double radius, Paint color) {
this.x = x;
this.y = y;
this.radius = radius;
makeHexagon(radius, color);
offsetY = calculateApothem();
offsetX = radius * 1.5;
changeTittle();
}
// ... 省略其他部分 ...
public void changeTittle() {
polygon.setOnMouseClicked(e -> {
Stage stage = (Stage) this.getScene().getWindow();
stage.setTitle("cordinate =" + x + "," + y);
});
}
// ... 省略其他部分 ...
}
public static void main(String[] args) {
launch();
}
英文:
Storing coordinates as field
In this approach Hexagon
instances have two integers wich represent coords . Any hexagon will print x and y as stage tittle like so :
This is a single javafx app you can try
App.java
public class App extends Application {
@Override
public void start(Stage stage) {
double HexagonRadius = 100;
Hexagon hexagon1 = new Hexagon(1, 2, HexagonRadius, Color.CADETBLUE);
Hexagon hexagon2 = new Hexagon(1, 0, HexagonRadius, Color.MEDIUMPURPLE);
hexagon2.setTranslateY(hexagon1.getOffsetY() * 2);
Hexagon hexagon3 = new Hexagon(1, 1, HexagonRadius, Color.MEDIUMSEAGREEN);
hexagon3.setTranslateY(-hexagon1.getOffsetY() * 2);
Hexagon hexagon4 = new Hexagon(0, 0, HexagonRadius, Color.CORNFLOWERBLUE);
hexagon4.setTranslateY(-hexagon1.getOffsetY());
hexagon4.setTranslateX(hexagon1.getOffsetX());
Hexagon hexagon5 = new Hexagon(2, 2, HexagonRadius, Color.YELLOW);
hexagon5.setTranslateY(-hexagon1.getOffsetY());
hexagon5.setTranslateX(-hexagon1.getOffsetX());
Hexagon hexagon6 = new Hexagon(2, 0, HexagonRadius, Color.ORANGE);
hexagon6.setTranslateY(hexagon1.getOffsetY());
hexagon6.setTranslateX(-hexagon1.getOffsetX());
Hexagon hexagon7 = new Hexagon(2, 3, HexagonRadius, Color.SKYBLUE);
hexagon7.setTranslateY(hexagon1.getOffsetY());
hexagon7.setTranslateX(hexagon1.getOffsetX());
Group hexagonsGroup
= new Group(hexagon1, hexagon2, hexagon3, hexagon4, hexagon5, hexagon6, hexagon7);
StackPane stackPane = new StackPane(hexagonsGroup);
var scene = new Scene(stackPane, 640, 480);
scene.setFill(Color.ANTIQUEWHITE);
stage.setScene(scene);
stage.show();
}
public final class Hexagon extends Group {
private Polygon polygon;
private final double radius;
private final double radianStep = (2 * Math.PI) / 6;
private final int x;
private final int y;
private final double offsetY;
private final double offsetX;
public int getX() {
return x;
}
public int getY() {
return y;
}
public Hexagon(int x, int y, double radius, Paint color) {
this.x = x;
this.y = y;
this.radius = radius;
makeHexagon(radius, color);
offsetY = calculateApothem();
offsetX = radius * 1.5;
changeTittle();
}
private void makeHexagon(double radius, Paint color) {
polygon = new Polygon();
this.getChildren().add(polygon);
polygon.setFill(color);
polygon.setStroke(Color.WHITESMOKE);
polygon.setEffect(new DropShadow(10, Color.BLACK));
polygon.setStrokeWidth(10);
polygon.setStrokeType(StrokeType.INSIDE);
for (int i = 0; i < 6; i++) {
double angle = radianStep * i;
polygon.getPoints().add(Math.cos(angle) * radius / 1.1);
polygon.getPoints().add(Math.sin(angle) * radius / 1.1);
}
}
public void changeTittle() {
polygon.setOnMouseClicked(e -> {
Stage stage = (Stage) this.getScene().getWindow();
stage.setTitle("cordinate =" + x + "," + y);
});
}
public double getOffsetY() {
return offsetY;
}
public double getOffsetX() {
return offsetX;
}
private double calculateApothem() {
System.out.println(Math.tan(radianStep) * radius);
return (Math.tan(radianStep) * radius) / 2;
}
}
public static void main(String[] args) {
launch();
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论