Привет, ребята, я сейчас застрял в работе над приложением. Проблема в том, что у меня есть класс, который создает несколько экземпляров, каждый из которых состоит из CCPhysicsSprite и b2body. Во время столкновения с любым другим объектом из любого другого класса этот конкретный экземпляр должен исчезнуть. Теперь я создал контакт-слушатель, который определяет контакт, и проблема в том, что мне нужно получить доступ к конкретному экземпляру, чтобы его уничтожить. В лучшем случае я могу получить доступ к его CCPhysicsSprite и его тегу, но не могу получить конкретный экземпляр класса. Надеюсь, кто-то мне поможет.Определение экземпляра класса с учетом одной из его переменных
0
A
ответ
0
Передайте экземпляр как UserData в тело box2d. Когда происходит столкновение, вы можете получить экземпляр, вернув указатель на указатель пользовательских данных в его правильный тип и соответствующим образом обработайте его.
// C++ example
void SomeClass::BeginContact(b2Contact* contact)
{
b2Body* bA = contact->GetFixtureA()->GetBody();
b2Body* bB = contact->GetFixtureB()->GetBody();
b2MetaData* bAMeta = (b2MetaData*)bA->GetUserData();
b2MetaData* bBMeta = (b2MetaData*)bB->GetUserData();
delete bAMeta;
delete bBMeta;
}
Если экземпляр экземпляра Objective-C вам, вероятно, придется использовать листинг __bridge. Подробнее о том, как его использовать, можно найти здесь. SO - ARC and bridged cast
Помните, что удаление корпуса box2d должно выполняться вне мирового шага, поэтому лучше, если вы просто пометите тело для удаления каким-либо образом (флаг в нем или, возможно, добавьте его в список вызванный toBeRemoved), и после того, как шаг закончился, вы можете перебирать контейнер, удаляя тела box2d.
Показать код. Обычно поле userData объекта box2d имеет указатель на экземпляр CCPhysicsSprite. Поэтому, если вы можете получить доступ к объекту CCPhysicsSprite, то это тот экземпляр, который вы ищете. Разве вы не ищете третьего класса, не упомянутого в вопросе? – LearnCocos2D