NSMutableArray交互与碰撞相关的麻烦

时间:2015-07-28 19:36:54

标签: ios objective-c nsmutablearray spritebuilder collision

我无法使用Spritebuilder [版本1.4.9,来自Apple App Store]将对象添加到我的NSMutableArray中以正确记录(这肯定意味着他们无法正确处理任何适当的函数)。我正在使用相同的类创建多个对象,但每个新对象都会覆盖存在的旧对象。我认为一个数组有助于保持秩序(然后在碰撞时,我可以调用数组来检查哪个对象与之相撞),但它根本就没有那样工作 - 根本没有。这是相关的代码。

Main.h

@property Coven *coven;
@property Nellie *nellie;
@property NSMutableArray *array;  
//Physics, other things

的main.m

/Adding other things...

-(void) addCovenMember{
//This function is called on a RANDOM time interval
_array = [[NSMutableArray] alloc]init];
for (i = 0, i < 15, i++){
    _coven = (Coven*) [CCBReader load:@"CovenMember"];
    [_array addChild:_coven];
    }
[_physicNode addChild:_coven];
}

-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair nellie:(Nellie*)nellie coven:(Coven*)coven{
for (_coven in _array){
    NSLog(@"%@",_coven.name)
       if (CGRectIntersectsRect(_nellie.boundingBox, _coven.boundingBox){
       NSLog(@"We're intersecting!");
    }
}

巫。 ħ

//Nothing Important Here

Coven.m

-(void)didLoadFromCCB{
self.physicsBody.CollisionType = @"coven";
}

Nellie.h

//Nothing Here

Nellie.m

-(void) didLoadFromCCB{
self.physicsBody.CollisionType = @"nellie";
}

碰撞是在每次碰撞时记录 - 但只是作为要生成的LATEST _coven成员的名称,无论我碰撞的是什么。这也意味着_coven.boundingBox仅在最新的_coven成员上进行交互,只有当我在屏幕上生成新成员时才会发生交互。

有什么想法吗?有帮助吗?

注意:这也发布在Spritebuilder网站上 - 我决定在这里发布它,因为这些论坛上的答案可能会有点慢。

2 个答案:

答案 0 :(得分:0)

-(void) addCovenMember每次调用_array时都会覆盖{创建一个新实例)。因此,当您尝试迭代-ccPhysicsCollisionBegin:时,您只会看到1 coven

在数组创建周围添加一个零检查:

if(_array == nil) {
     _array = [[NSMutableArray] alloc]init];
}

-addCovenMember方法中的for循环看起来很糟糕(至少不是c循环)。将,;重新拼接:

for (i = 0; i < 15 i++){

此外,使用for(_coven in _array)似乎有误,您已经拥有了一个属性self.coven(可能),并且支持_coven ivar。尝试将其更改为for(Coven * c in self.array)并使用循环中的本地c

for (Coven * c in _array){
    NSLog(@"%@",c.name)
    if (CGRectIntersectsRect(_nellie.boundingBox, c.boundingBox){
       NSLog(@"We're intersecting!");
    }
}

答案 1 :(得分:0)

对于那些在他们的ccPhysicsCollisions中苦苦挣扎的人来说,阵列可能不是答案 - 这是一个简单的解决方案,让我无法忍受好几天。

使用spritebuilder附带的基本ccPhysicsCollisionsBegan,首先尝试不使用数组:

help persistent

我最初用以下方法创建了方法:

Scene.m
-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair nellie:(Nellie*)nellie coven:(Coven*)coven{
[_coven stopAction:coven.path];
}

是的,那个(下划线)让我回到了三个星期。确保你引用通过物理代理进行交互的对象,而不是对象本身,在我的情况下,对象本身不断被生成的新对象覆盖。

检查下划线。

解决! :d

感谢@thelaws的帮助!我最终会在Obj C上变得更好。