Как сделать динамическое тело статичным в Cocos2d v3.0 с Бурундуком

Я использую Cocos2d v3 и хочу изменить тело с динамического на статическое после столкновения с другим телом. На данный момент у меня есть:

-(void)ccPhysicsCollisionPostSolve:(CCPhysicsCollisionPair *)pair static:(CCNode *)nodeA wildcard:(CCNode *)nodeB
{
   _player.physicsBody.type = CCPhysicsBodyTypeStatic;
}

или же

-(BOOL)ccPhysicsCollisionPreSolve:(CCPhysicsCollisionPair *)pair static:(CCNode *)nodeA wildcard:(CCNode *)nodeB
{
   _player.physicsBody.type = CCPhysicsBodyTypeStatic;
   return YES;
}

но ни один не работает. Я получаю ошибку:

Прерывание из-за ошибки Бурундука: Эту операцию нельзя выполнить безопасно во время вызова cpSpaceStep() или во время запроса. Поместите эти вызовы в обратный вызов. Не выполнено условие:! Пробел-> заблокирован

Затем я попытался сделать соединение в точке столкновения, но это не работает правильно.

Есть ли способ изменить тело на динамическое, как только оно столкнется в v3? Я могу сделать это в более поздних версиях, используя Box2D. Я хочу остановить гравитацию и другие силы, чтобы она не двигалась. Я хочу, чтобы он выглядел так, как будто он застрял на поверхности.

Прочитайте немного о пост-шаговых колбэках, но я не знаю, как их использовать.

Любая помощь будет оценена.

1 ответ

Решение

Как говорится в сообщении об ошибке, вам необходимо реализовать обратный обратный вызов. Чтобы сделать это на Cocos2d 3.0 и с Objective Chipmunk, вам сначала нужно импортировать новый заголовочный файл для доступа к расширенным свойствам chipmunk:

#import "CCPhysics+ObjectiveChipmunk.h"

Затем добавьте обратный вызов в ваш обработчик столкновений:

-(void)ccPhysicsCollisionPostSolve:(CCPhysicsCollisionPair *)pair static:(CCNode *)nodeA wildcard:(CCNode *)nodeB
{
    [[_physicsNode space] addPostStepBlock:^{
        _player.physicsBody.type = CCPhysicsBodyTypeStatic;
    } key:_player];
}

Обратите внимание, что я предполагаю, что у вас есть доступ к вашему CCPhysicsNode в _physicsNode , Пространство Бурундука CCPhysicsNode заблокирован, пока вычисляется шаг физики. Во время вычисления шага конфликты разрешаются и объекты перемещаются - изменение типа тела во время этого вычисления может привести к неожиданному поведению.

Поэтому вы добавляете postStepBlock Перезвоните. Это место, где тип телосложения можно смело менять.

key Значение, которое вы передаете в обратный вызов, используется, чтобы гарантировать, что код вызывается только один раз (особенно полезно при удалении объектов, но это также имеет смысл в этом случае).

Если также добавлен пример реализации: https://www.makegameswith.us/gamernews/367/make-a-dynamic-body-static-in-cocos2d-30-with-chi

Другие вопросы по тегам