我是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;
}
答案 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;
}