1

我有一个旧项目,其中涉及使用展开地图和处理来绘制,嗯......地图哈哈。该项目运行良好,但我正在检查一些东西以帮助同事并遇到一些我不太了解的东西。

我的问题如下:如果我在Processing的方法中调用Unfolding Map的draw()方法( ) ,一切正常,一切都会不断重绘,我可以与应用程序正确交互等等。但是,如果我在 Processing 的方法中执行然后避免 Processing 的方法运行,那么地图不应该被绘制一次然后一切都被关闭吗?map.draw()draw()map.draw()setup()draw()

相反,当我跑map.draw()进去setup()然后强迫一切停止时,它不会画任何东西,甚至一次都没有。

另外,我尝试只运行一次 Processing 的方法,并在 Processing 的draw()方法中只调用map.draw()一次,draw()方法是noLoop()setup(). 我的项目真的很长,所以我只发布一些代码,只是为了测试我的这个小问题。

private static final boolean offline = false;
public static String mbTilesString = "/Users/roy/IdeaProjects/UnfoldingMaps/data/blankLight-1-3.mbtiles"
private UnfoldingMap map;

public void setup() {
    size(900, 700, OPENGL);

    if (offline) {
        this.map = new UnfoldingMap(this, 200, 50, 650, 600, new MBTilesMapProvider(mbTilesString));
    } else {
        this.map = new UnfoldingMap(this, 200, 50, 650, 600, new Microsoft.RoadProvider());
    }

    MapUtils.createDefaultEventDispatcher(this, this.map);

    noLoop(); // draw() gets called only once
}

public void draw() {
    this.map.draw();
}

我希望地图绘制一次,然后一切都停止。相反,我得到以下信息:

空白窗口

4

1 回答 1

2

你所说的一切都是有道理的,你的期望是正确的。您可以通过绘制矩形而不是地图来确认行为。

我最好的猜测是展开地图与该noLoop()功能不兼容。我假设展开地图有一些依赖于绘制循环的内部逻辑:异步加载地图图块,响应用户输入等。

您可以通过在setup()函数中执行以下操作来探索行为:

noLoop();

for(int i = 0; i < 100; i++){
  draw();
}

这是一个旨在探索行为的hack 。我不建议这是一个修复。如果我这样做,我会看到地图被部分加载:

部分加载的地图

这告诉我,展开地图以某种方式依赖于draw()多次调用来处理加载。这是有道理的,因为加载是异步的,并且随着时间的推移在后台发生。它可能与加载图像后需要在处理的主线程上绘图有关。如果您想确定,您可以查看Unfolding Maps的来源以了解其内部行为。

如果你真的需要使用noLoop()Unfolding Maps,你可以使用 hack 的delay()功能。或者您可以查看展开地图的文档;也许我们错过了一个有用的功能。或者您可以修改源以获得您想要的行为。或者,也许您可​​以使用 PGraphics 或其他东西将某些东西放在一起。

但大多数情况下,我认为您应该避免noLoop()与展开地图一起使用。

于 2019-01-10T17:32:56.563 回答