Обнаружение столкновений в наборе Sprite не обнаруживает столкновение

Я создаю игру, которая должна будет использовать много обнаружения столкновений, и я только узнаю об этом сегодня.

Теперь у меня есть два SKSpriteNodes, но один является дочерним элементом SKNode. SKSpriteNode без родителя называется character, а спрайт с родителем называется buildingStructure.

Теперь категория characterstatic const uint32_t playerCategory = 0x1 << 20;, а категория buildingStructure_buildingStructureCategory = 0x1 << 0;. Категория buildingStructure установлена ​​в другом классе map.m через @property.

Переменные правильно передаются другому классу с именем main.m (где установлена ​​категория character). Я создаю character с помощью метода, устанавливая его физическое тело, позицию и так далее.

Свойстваcharacter

character.name = @"character";
character.size = CGSizeMake(250, 400);
character.zPosition = 500;
character.position = CGPointMake(self.scene.size.width/2, self.scene.size.height/2+200);
character.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:character.size];
character.physicsBody.restitution = 0;
character.physicsBody.density = 0.1;
character.physicsBody.allowsRotation = NO;
character.physicsBody.categoryBitMask = playerCategory;
character.physicsBody.collisionBitMask = categoryBitManager.buildingStructureCategory;

СвойстваbuildingStructure

buildingStructure.name = @"buildingStructure";
buildingStructure.position = CGPointMake(building.position.x, building.position.y);
buildingStructure.size = CGSizeMake(500, 400);
buildingStructure.physicsBody.dynamic = NO;

buildingStructure.physicsBody.categoryBitMask = _buildingStructureCategory;

С другой стороны, buildingStructure не имеет набора physicsBody, потому что я хочу, чтобы character проходил через buildingStructure, но я также хочу, чтобы он определял, когда character находится "поверх" buildingStructure для выполнения действия.

Поскольку buildingStructure не имеет определенного physicsBody, это то, что заставляет didBeginContact:contact не распознавать контакт столкновения?


person Mutch95    schedule 06.05.2014    source источник


Ответы (1)


Свойство physicsBody SKNode (или его подкласса) по умолчанию имеет значение nil. Да, дайте BuildingStructure физическое тело и правильно настройте его для достижения желаемого поведения.

Чтобы получить желаемое поведение между двумя физическими телами, сначала поймите, что есть 'столкновения' и есть 'контакты'. SKPhysicsBody имеет два свойства с именами collisionBitMask и contactTestBitMask.

Для collisionBitMask значение по умолчанию — 0xFFFFFFFF (все биты установлены), а для contactTestBitMask значение по умолчанию — 0x00000000 (все биты очищены). Вы можете видеть, что по умолчанию каждое физическое тело будет сталкиваться с другими, но контакта не будет.

Столкновение — это когда вы хотите, чтобы симуляция физики влияла на рассматриваемое тело, а контакт — это то место, где вы хотите получить уведомление, чтобы вы могли что-то сделать. Так что это вызовет didBeginContact:

Я предлагаю установить collisionBitMask для обоих тел на 0 (чтобы их физика не затрагивалась и они проходили сквозь друг друга). Затем установите свойство contactTestBitMask для персонажа на значение здания, как показано ниже:

character.physicsBody.contactTestBitMask = categoryBitManager.buildingStructureCategory;
person Bamsworld    schedule 06.05.2014
comment
только что понял это для себя раньше, это подводит итог, спасибо. Мне также пришлось установить collisionBitMask buildingStructure на 0x0, иначе при столкновении character и buildingStructure character будет толкать buildingStructure. - person Mutch95; 06.05.2014