cocos2d проверить коллизию

Я хочу проверить столкновение птиц и рыб.

У меня есть BirdCache, который содержит

-(void) isBirdCollidingWithRect:(CGRect) rect

которые проверяют каждую видимую птицу в кеше

-(void) update:(ccTime) delta

которые вызывают isFishCollidingWithRect для проверки каждой птицы, если YES, bird.visible = NO

и FishCache (похоже на BirdCache)

но в результате рыбы никогда не умирают при столкновении. (Я установил visible = NO в обоих обновлениях

Я думаю, что проблема в состоянии гонки, когда сначала bird.visible = NO, тогда рыба не будет сталкиваться с птицей. затем я попытался schedule:selector(delayedInvisible) interval: 1.0 / 10.0f, но все равно не удалось.

Есть ли какой-то общий подход к такого рода проблемам?


person John    schedule 15.03.2011    source источник


Ответы (1)


Итак, эта работа такова:

  • для каждой живой птицы вы проверяете, не сталкивается ли она с какой-либо рыбой, и если это происходит, вы убиваете птицу
  • для каждой живой рыбы вы проверяете, не сталкивается ли она с какой-либо птицей, и если это происходит, вы убиваете рыбу

Таким образом, если птица сталкивается с рыбой, погибает только птица.

Вы должны убить оба сталкивающихся объекта в каждом методе или добавить поле для птиц и рыб, которое говорит (это животное должно быть убито в следующем кадре), и установить это на столкновение, а не на видимое поле напрямую.

person ajuc    schedule 15.03.2011
comment
добавьте к птицам и рыбам поле с надписью (это животное должно быть убито в следующем кадре) и установите его на столкновение, а не на видимое поле напрямую. да, у меня есть метод delayedInvisible, который будет вызываться на 1/10 секунды позже. внутри delayedInvisible я сначала отменяю расписание: _cmd, а затем устанавливаю невидимый - person John; 15.03.2011
comment
Я бы обошёлся без многопоточности. У вас есть метод, который перебирает всех рыб и птиц в каждом кадре? - person ajuc; 15.03.2011
comment
ваше решение сработало !!! я просто позволил [fish gotHit], прежде чем вернуть true. но я все еще хочу знать, почему мой оригинальный способ не сработал. это один поток. и да, в isFish/BirdCollidingWithRect я проверил всех рыб/птиц - person John; 15.03.2011
comment
кстати, единственная оставшаяся проблема(может быть) это передвижение птиц. не могли бы вы проверить мой вопрос здесь? 5295028/ - person John; 15.03.2011
comment
Я не знаю ни цели c, ни какао, но подозреваю, что вы сначала проверили столкновения на наличие птиц, и когда произошло столкновение, вы установили эту птицу как убитую, но оставили столкнувшуюся рыбу в живых. Затем вы проверили столкновения каждой рыбы с каждой живой птицей, и наша рыба ни с одной не столкнулась, потому что птица, столкнувшаяся с рыбой, уже погибла. - person ajuc; 15.03.2011