随机化对象位置而不重复或重叠

时间:2014-10-06 01:06:16

标签: ios objective-c iphone sprite-kit arc4random

我是SpriteKit的新手,我正在创建一个游戏,当用户达到一定的分数增量时,该游戏会让我的屏幕上的对象的CGPoint位置随机化。我创建了一个8个设置位置的plist,我希望我的对象在调用此方法时可以选择,但是我的对象选择重复的plist位置并相互重叠时遇到问题。我可以调用一个方法来阻止我的对象在调用该方法时从plist中选择相同的位置作为另一个对象吗?

仅供参考,我打算在整个游戏过程中多次调用这种随机化方法。

我写了下面的代码,但我的游戏崩溃了。

- (NSMutableArray *)pickAndRemoveFromList:(NSMutableArray *)list {

    list = [_objectList copy];

    NSInteger randomIndex = arc4random()%list.count;
    Objects *object = [list objectAtIndex:randomIndex];

    [list addObject:object];
    [list removeObject:object];

    return list;
}

1 个答案:

答案 0 :(得分:1)

您的方法有几个问题。首先,你传入一个名为list的可变数组,但是在方法的第一行中你重新定义了什么列表。你要么不应该在列表中传递,要么你不应该重新定义它。其次,如果_objectList是一个不可变数组,则需要使用mutableCopy使其成为可变数组,而不是复制数组。第三,没有必要将对象添加到列表中,然后在下一行中转身并将其删除。另外一个更好的随机数函数是arc4random_uniform()。所以,如果你传入一个可变数组,你的方法应该是,

- (NSMutableArray *)pickAndRemoveFromList:(NSMutableArray *)list {

    NSInteger randomIndex = arc4random_uniform((int)list.count);
    Objects *object = [list objectAtIndex:randomIndex];
    [list removeObject:object];
    return list;
}