2015-07-28 2 views
1

У меня возникли проблемы с добавлением объектов в мой NSMutableArray для правильной записи (что определенно означает, что они не будут обрабатывать какие-либо правильные функции) с помощью 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"; 
} 

Столкновение входа с каждым столкновением - но только как имя ПОСЛЕДНИЕ _coven, который будет создан, независимо от того, с чем я сталкиваюсь. Это также означает, что _coven.boundingBox находится исключительно на последнем члене _coven, и взаимодействие возникает только тогда, когда я нажимаю новый член, как только он появляется на экране.

Любые идеи? Любая помощь?

Примечание: Это также опубликовано на веб-сайте Spritebuilder - я решил опубликовать его здесь, потому что ответы могут быть немного медленными на этих форумах.

ответ

0

-(void) addCovenMember перезаписывает (создает новый экземпляр) _array каждый раз, когда он называется. Таким образом, когда вы пытаетесь выполнить итерацию в -ccPhysicsCollisionBegin:, вы увидите только 1 coven.

Добавить нулевую проверку вокруг создания массива:

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

для цикла в методе -addCovenMember выглядит сломанную (по крайней мере, не кесарева петлю). Reaplace , с ;:

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

Кроме того, с помощью for(_coven in _array) кажется неправильным, у вас уже есть свойство self.coven (предположительно) с опорным _coven Ивар. Попробуйте изменить его 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!"); 
    } 
} 
+0

Благодарим вас за предложения, попробовал свои изменения, но по-прежнему та же проблема (добавлена ​​проверка nil, это было блестяще), заменил ',' на ';' и попытался сменить '_coven' на локальный ivar ('Coven * c') - до сих пор нет кубиков. Я решил добавить в него журнал, чтобы узнать, могу ли я понять, что происходит, и я просто понял, что журналы конфликтов (это исходный 'NSLog (@"% @ ", _ coven.name'), регистрирует i # одно и то же имя. Так что, если это 3, он регистрирует '' WitchA' 3 раза - конечно, если WitchA является последним, который был сгенерирован. –

+0

Когда вы меняете переменную цикла на 'c', вы должны заменить использование '_coven' с' c' внутри цикла. Кроме того, я не уверен, почему вы передаете 'Coven', в нем он не используется (он использует' Coven' в массиве) Однако, на основе кода, который вы опубликовали (например, цикла for), в приложении есть потенциально много ошибок, которые могут повлиять на ваш результат. – thelaws

+0

так что цикл сам по себе кажется прекрасным? Или вы говорите, что мой цикл неисправен, и поэтому мое приложение в целом неисправен (не обижен, просто для уточнения) –

0

Всем в мире борются со своими ccPhysicsCollisions, массивы не могут быть ответом - это было легко исправить, что оставил меня нетрудоспособным в течение нескольких дней ,

Использование основной ccPhysicsCollisionsBegan, который поставляется с spritebuilder, попробуйте это без массивов первых:

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

Сначала я создал метод с:

[_coven stopAction:_coven.path]; 

Да, (подчеркивание) поставил меня обратно три недель. Убедитесь, что вы ссылаетесь на объект, взаимодействующий через делегата физики, а не с самим объектом, который в моем случае постоянно переписывался новыми генерируемыми.

Проверьте свои символы.

Решенный! : D

Благодаря @thelaws за вашу помощь! Я получу лучше в Obj C ... в конце концов.