我想做的事情:
我尝试使用画布为用户渲染游戏板。用户 将能够放大。
当用户使用时,渲染整个游戏板是不可能的 放大,因为游戏板非常大。相反,我会渲染什么 每隔1/30秒在屏幕上显示。
我想创造整个游戏板众生的错觉 在像ScrollPane 这样的gui里面,用户可以用它滚动 鼠标。
实际上, ScrollPane将完全链接到单个画布 视口的大小。
我不确定正确的方法是什么。滚动窗格似乎没有允许您假装它有一个大对象的属性。我可以在滚动窗格中放置一个大画布,但是大型画布会占用内存,正如我的崩溃所暗示的那样。 我应该使用AnchorPane还是什么?这样做的正确方法是什么?
答案 0 :(得分:0)
似乎将一个AnchorPane放入ScrollPane,将AnchorPane设置为正确的大小(整个游戏板的大小)可以很好地让用户自由滚动。从那里你要做的就是在AnchorPane的正确位置放一个画布并继续移动它(并重新绘制它)使一切都运作完毕。为了让它顺利运行,我认为你应该在ScrollPane的视口之外渲染100到500个像素。这是我项目中的一些示例代码:
public class GridViewPane {
/** ScrollPane that this grid exits in */
private ScrollPane gridScroll;
/** The anchor pane immediately inside of {@link #gridScroll}. The
* dimensions of this equals the dimensions of the {@link #can} if it was to
* render the entire grid at once */
private Pane gridView;
/** Exists in {@link #gridView} and is exactly the size of the viewport of
* {@link #gridScroll} */
private Canvas can;
/** A label the specifies what hex is currently moused-over */
private Label currentHexLabel;
public void update() {
// sets the canvas to the right size if needed
final Bounds viewportSize = gridScroll.getBoundsInLocal();
if (can == null || !can.getBoundsInLocal().equals(viewportSize)) {
can = new Canvas(viewportSize.getWidth(),
viewportSize.getHeight());
gc = can.getGraphicsContext2D();
}
// sets the anchorpane to the right size
final double[] dim = getPixleSizeOfGrid(w.columns(), w.rows(), r);
if (gridView == null) {
gridView = new AnchorPane();
gridScroll.setContent(gridView);
}
Bounds oldDim = gridView.getBoundsInLocal();
if (!(oldDim.getWidth() == dim[0]
&& oldDim.getHeight() == dim[1])) {
gridView.setPrefSize(dim[0], dim[1]);
}
// puts the canvas in the right position
if (!gridView.getChildren().contains(can))
gridView.getChildren().add(can);
double[] x = getXScreenRange();
double[] y = getYScreenRange();
can.relocate(x[0], y[0]);
// *********** Drawing Hexes ***********/
}
}