我在2D屏幕中生成一种可以飞过的隧道。我想让墙壁随意地从左向右平滑移动。现在我最终得到了" spikes"。
我希望它看起来像这样
而不是
我使用代码看起来像是这样的墙,每个左右四十次。
if (Left1.center.y > 568) {
RandomPosition = arc4random() %55;
Left1.center = CGPointMake(RandomPosition, 0);
RandomPosition = RandomPosition + 265;
Right1.center = CGPointMake(RandomPosition, 0);
}
然后这个
RandomPosition = arc4random() %55;
Left1.center = CGPointMake(RandomPosition, 0);
RandomPosition = RandomPosition + 265;
Right1.center = CGPointMake(RandomPosition, 0);
但它并没有按照我想要的方式移动墙壁。
答案 0 :(得分:3)
您正在寻找的内容被称为"相关"随机数生成。
产生此类数字的最常用方法之一称为Perlin noise,这可能过于复杂,无法满足您的需求。
在你的情况下最简单的做法是跟踪最后一个墙的位置,并从中生成一个随机的偏移,而不是用于数值生成器的数值生成器。壁。这称为"random" or "drunken" walk。
为了保持隧道宽度不变,随机选择左墙的终点,然后将右墙的末端放置正确的距离。
CGFloat leftWallX = /* starting value */;
for( int i = 0; i < NUM_WALLS; i++ ){
// Generate a number from -MAX_OFFSET to MAX_OFFSET
CGFloat offset = (CGFloat)arc4random_uniform(2*MAX_OFFSET) - MAX_OFFSET;
leftWallX += offset;
rightWallX = leftWallX + tunnelWidth;
//...
}