Как сделать динамическое тело статичным в 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