好的,我已经看过像我这样的人,他们是编程初学者的很多问题。大多数时候,他们的问题难以回答或理解问题究竟是什么。我将尽我所能尽可能具体地解决我的问题,因此上述情况不会发生。
首先,我一直关注http://xnagpa.net/xna4rpg.php的教程。而我的磁贴引擎是基于杰米麦克马洪在他的RPG教程系列中制作的。只是让你知道我的磁贴引擎的一般结构是什么样的。
其次,我将尝试解释我在tile引擎中尝试做的事情。我最近发现了一篇关于原始文明如何生成他们的地图的文章。 http://forums.civfanatics.com/showthread.php?t=498630 如果愿意的话,我更喜欢这种生成“世界”风格地图的方法。即:海洋,大陆,岛屿等。所以我决定尝试将其应用到我的tile引擎中。它在很大程度上起作用。我添加到tile引擎的部分应该在指定的地图图层(y,x)中随机选择一个位置,然后从该位置生成一块土地(或图块),然后用地图图层中的图块替换在大块土地上创造的瓷砖。 (在一分钟内显示代码),然后对所需数量的任意数量的陆地(块)进行此操作,或继续创建大块土地,直到地块数量等于所需的地块数量。
我的问题: 我的程序做了它应该做的事情(如上所述),除了它只制造一块陆地。(地块块)它做其他一切都很好但是由于某种原因它不会超过一个陆地。现在我怀疑它实际上正在制造其他陆地,但不知何故,瓷砖引擎设置为显示地图图层的方式正在导致陆地被水覆盖。也许它是一个分层问题。但这不应该是因为陆地都是同一层的一部分。所以我完全不知道为什么这样做。
public void GenerateLandChunks(MapLayer layer)
{
Tile tile = new Tile(0, 3);
Random random = new Random();
int x = random.Next(8, layer.Width - 10);
int y = random.Next(10, layer.Height - 20);
int length = random.Next(10, 70);
for (int i = 0; i < length; i++)
{
if (length != 0 && x > 8 || x < layer.Width - 10 && y > 10 || y < layer.Height - 20)
{
layer.SetTile(y, x, tile);
layer.SetTile(y, x + 1, tile);
layer.SetTile(y + 1, x, tile);
}
x = random.Next(x - 1, x + 2);
y = random.Next(y - 1, y + 2);
}
}
这是我生成实际块的方法,它可以实现我想要的。 (上图)
MapLayer randomLayer = new MapLayer(100, 100);
for (int y = 0; y < randomLayer.Height; y++)
{
for (int x = 0; x < randomLayer.Width; x++)
{
Tile tile = new Tile(1, 3);
randomLayer.SetTile(x, y, tile);
}
}
int landMasses = 5;
for (int i = 0; i < landMasses; i++)
{
randomLayer.GenerateLandChunks(randomLayer);
}
这是我创建地图图层的地方。我最初将整个地图设置为水砖(瓷砖(1,3))然后我告诉它生成5个陆地。
看起来这应该有效。它确实如此,但我只说第一个。它不显示其他4个陆块。
我的问题: 你能在这里看到我做错了什么才能完成我想做的事情吗?
如果您需要更多代码来了解最新情况,请告诉我并告知您需要的内容。就像我说的那样,我发布的内容与Jamie McMahon的瓷砖引擎完全相同。
如果我不清楚或者我的问题很难回答,我很抱歉。我试图让它尽可能地直截了当。感谢您的时间。
答案 0 :(得分:1)
这么简单的答案的文字太多了。问题是每次都会生成一个新的Random
对象,因此每次“随机”值都是相同的。这就是随机数生成器的工作原理,数字实际上并不是随机的,而是“伪随机”,如果你使用相同的随机函数和相同的种子,你将获得看似随机数的相同进展。
默认Random
构造函数根据时间为生成器设置一些值,但如果两个生成器的创建时间非常短,则该时间值将相同。
将Random
对象移到函数外部,以便它用于所有随机生成,或将循环移动到内部(但Random
在循环外部。)