Предотвратить перекрытие между двумя SKPhysicBody одного и того же типа - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть игра, в которой два шара должны проходить через третий объект, который функционирует как финишная черта.Два шара SKShapeNodes, финишная линия - SKSpriteNode.К каждому из них прикреплено SKPhysicBodys с категориями, установленными следующим образом:

struct PhysicsCategory {
    static let ball: UInt32 = 0x1 << 1
    static let line: UInt32 = 0x1 << 2
}


ball.physicsBody = SKPhysicsBody(circleOfRadius: ballSize)
ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
ball.physicsBody?.contactTestBitMask = PhysicsCategory.line
ball.physicsBody!.collisionBitMask = 1

line.physicsBody = SKPhysicsBody(rectangleOf: line.size)
line.physicsBody?.isDynamic = false
line.physicsBody?.categoryBitMask = PhysicsCategory.line
line.physicsBody?.contactTestBitMask = PhysicsCategory.ball
line.physicsBody!.collisionBitMask = 1

Поскольку я хочу, чтобы шары могли пересекать финишную черту без столкновения, и при этом иметь возможность получать уведомления об этомЯ установил collisionBitMask для шариков и линии на одно и то же значение.

Это дает мне результат, который я ищу.Однако, как представляется, побочным эффектом является то, что оба шара могут проходить друг через друга, что не должно происходить.

Кроме того, если я установлю значение collisionBitMask на что-либокроме 1, шарики и шишка друг от друга.Я прочитал документацию Apple по этому вопросу, но мне кажется, что я что-то здесь неправильно понял / пропустил.

Я предполагаю, что, поскольку оба шара видят друг друга как имеющие один и тот же collisionBitMask.Ожидается совпадение.Чего я не понимаю, так это как я могу избежать этого, не добавляя отдельную категорию на шар.

Может ли кто-нибудь указать мне правильное направление?Как сделать так, чтобы шары проходили через финишную черту, не перекрывая друг друга?

1 Ответ

0 голосов
/ 15 ноября 2018

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

Если все, что вас волнует, это обратный вызов коллизии на линии, которая в основном контролируется contactTestBitMask чтобы мяч, как у вас есть.Это то, что отправляет контакт в метод делегата.collisionBitMask контролирует то, что фактически контролирует физические вычисления, то есть то, что отскакивает друг от друга.

По умолчанию collisionBitMask будет сталкиваться со всем, поэтому вы хотите указать только то, на что вы хотите рассчитывать физику.У вас все установлено на 1, что не является чем-то конкретным в вашей сцене.Вот почему все проходит через друг друга.Я считаю, что 2 будет шариком, а 4 соответствует тому, что вы предоставили (если вы распечатываете PhysicsCategory.ball и PhysicsCategory.line, это то, что он выходит из системы).Обычно рекомендуется использовать созданные вами перечисления или структуры вместо указания числа.С учетом вышесказанного я склонен использовать 0 напрасно.

Чтобы это исправить, вы хотите сказать своим яйцам, что хотите, чтобы они сталкивались с PhysicsCategory.ball, и чтобы ваша линия сталкивалась ни с чем, поэтому вы хотите установитьэто до 0.

struct PhysicsCategory {
    static let ball: UInt32 = 0x1 << 1
    static let line: UInt32 = 0x1 << 2
}


ball.physicsBody = SKPhysicsBody(circleOfRadius: ballSize)
ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
ball.physicsBody?.contactTestBitMask = PhysicsCategory.line
ball.physicsBody!.collisionBitMask = PhysicsCategory.ball //changed to ball

line.physicsBody = SKPhysicsBody(rectangleOf: line.size)
line.physicsBody?.isDynamic = false
line.physicsBody?.categoryBitMask = PhysicsCategory.line
line.physicsBody?.contactTestBitMask = PhysicsCategory.ball
line.physicsBody!.collisionBitMask = 0 //you want no physics calculations
...