如果我在 Processing 的设置方法中绘制地图并完全停止 运行 中的 draw(),我的地图不应该至少绘制一次吗?
If I draw a map in Processing's setup method and stop draw() from running at all, shouldn't my map be drawn at least once?
我有一个旧项目涉及使用展开地图和处理来绘制,好吧...地图哈哈。该项目运行良好,但我正在检查一些东西以帮助同事并遇到一些我不太了解的东西。
我的问题如下:如果我在 Processing 的 draw()
方法中调用 Unfolding Map 的 draw()
方法(map.draw()
),一切正常,一切都在不断重绘,我可以正确地与应用程序交互等等。但是,如果我在 Processing 的 setup()
方法中执行 map.draw()
,然后从 运行ning 中避免 Processing 的 draw()
方法,地图不应该绘制一次然后一切都关闭下来了吗?
相反,当我在 setup()
中 运行 map.draw()
然后强制一切停止时,它什么也没有画,一次也没有。
此外,我已经尝试了一次 运行ning Processing 的 draw()
方法,并且在 Processing 的 draw()
方法中只调用了一次 map.draw()
,使用 noLoop()
在 setup()
的末尾。我的项目真的很长,所以我只是post一些代码来测试我的这个小问题。
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();
}
我希望地图绘制一次,然后一切都停止。
相反,我得到以下信息:
您所说的一切都是有道理的,您的期望是正确的。您可以通过绘制矩形而不是地图来确认该行为。
我最好的猜测是展开地图与 noLoop()
功能不兼容。我假设展开地图有一些依赖于绘制循环的内部逻辑:异步加载地图图块、响应用户输入等。
您可以通过在 setup()
函数中执行类似的操作来探索行为:
noLoop();
for(int i = 0; i < 100; i++){
draw();
}
这是一个 hack 旨在探索行为。我不建议这是一个修复。如果我这样做,我会看到地图已部分加载:
这告诉我,展开地图在某种程度上依赖于 draw()
被多次调用来处理加载。这是有道理的,因为加载是异步的,并且随着时间的推移在后台发生。这可能与加载图像后需要在 Processing 的主线程上绘制有关。如果您想确定,可以查看展开地图的 the source 以了解其内部行为。
如果您真的需要将 noLoop()
与展开地图一起使用,您可以使用 delay()
功能的 hack。或者您可以查看 the documentation 的展开地图;也许我们错过了一个有用的功能。或者您可以修改源代码以获得您想要的行为。或者,也许您可以使用 PGraphics 或其他东西将某些东西放在一起。
但大多数情况下,我认为您应该避免将 noLoop()
与展开地图一起使用。
我有一个旧项目涉及使用展开地图和处理来绘制,好吧...地图哈哈。该项目运行良好,但我正在检查一些东西以帮助同事并遇到一些我不太了解的东西。
我的问题如下:如果我在 Processing 的 draw()
方法中调用 Unfolding Map 的 draw()
方法(map.draw()
),一切正常,一切都在不断重绘,我可以正确地与应用程序交互等等。但是,如果我在 Processing 的 setup()
方法中执行 map.draw()
,然后从 运行ning 中避免 Processing 的 draw()
方法,地图不应该绘制一次然后一切都关闭下来了吗?
相反,当我在 setup()
中 运行 map.draw()
然后强制一切停止时,它什么也没有画,一次也没有。
此外,我已经尝试了一次 运行ning Processing 的 draw()
方法,并且在 Processing 的 draw()
方法中只调用了一次 map.draw()
,使用 noLoop()
在 setup()
的末尾。我的项目真的很长,所以我只是post一些代码来测试我的这个小问题。
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();
}
我希望地图绘制一次,然后一切都停止。 相反,我得到以下信息:
您所说的一切都是有道理的,您的期望是正确的。您可以通过绘制矩形而不是地图来确认该行为。
我最好的猜测是展开地图与 noLoop()
功能不兼容。我假设展开地图有一些依赖于绘制循环的内部逻辑:异步加载地图图块、响应用户输入等。
您可以通过在 setup()
函数中执行类似的操作来探索行为:
noLoop();
for(int i = 0; i < 100; i++){
draw();
}
这是一个 hack 旨在探索行为。我不建议这是一个修复。如果我这样做,我会看到地图已部分加载:
这告诉我,展开地图在某种程度上依赖于 draw()
被多次调用来处理加载。这是有道理的,因为加载是异步的,并且随着时间的推移在后台发生。这可能与加载图像后需要在 Processing 的主线程上绘制有关。如果您想确定,可以查看展开地图的 the source 以了解其内部行为。
如果您真的需要将 noLoop()
与展开地图一起使用,您可以使用 delay()
功能的 hack。或者您可以查看 the documentation 的展开地图;也许我们错过了一个有用的功能。或者您可以修改源代码以获得您想要的行为。或者,也许您可以使用 PGraphics 或其他东西将某些东西放在一起。
但大多数情况下,我认为您应该避免将 noLoop()
与展开地图一起使用。