【问题标题】:Randomizing object positions without duplication or overlapping [duplicate]随机化对象位置而不重复或重叠[重复]
【发布时间】:2014-10-06 01:06:15
【问题描述】:

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

【问题讨论】:

  • 我在您建议的帖子“创建主数组的本地 mutablearray 副本,并在获取随机值后,从本地数组中删除随机索引处可用的对象,处理它直到数组计数为 1。 “......你会知道我如何以编程方式创建它吗?
  • 我用你建议的方法写了上面的代码。

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


【解决方案1】:

你的方法有几个问题。首先,您传入一个名为 list 的可变数组,然后在方法的第一行重新定义 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;
}

【讨论】:

  • 我编写了您建议的代码并在我的更新方法中调用它,但没有任何反应。我从 - (NSMutableArray *)pickAndRemoveFromList 方法的初始定义中取出“list NSMutableArray”,并在方法中将其本地重新定义为我的全局 _objectlist 的副本。我有另一个对象在整个游戏过程中在屏幕上移动,所以我在我的更新方法中写了这个 if 语句,“if (moving object.position.x > 50){ [self - (NSMutableArray *)pickAndRemoveFromList]”但什么也没发生.
  • 这是我写的代码- (NSMutableArray *)pickAndRemoveFromList{ NSMutableArray *list = [_objectList copy]; NSInteger randomIndex = arc4random_uniform((int)list.count); Objects *object = [list objectAtIndex:randomIndex]; [list removeObject:object]; return list;
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多