Спрайткит физика уничтожает объекты анимации

Возможно ли как-то уничтожить объект при контакте? Как не просто удалить его с экрана с помощью body.removeFromParent(), я хотел бы иметь анимацию.

У меня есть игрок и стены, и когда у игрока есть специальное усиление, я хочу, чтобы он мог разрушать стены при контакте. Я мог бы предположить, что у меня как будто стена раскололась как можно больше маленьких физических тел, и они держатся вместе, как опорная точка, и когда мой игрок ударяется о нее, они получают импульс от игрока (просто полагаю, что isDynamic равен true, я думаю) и теряем точка привязки, чтобы все спрайт-узлы пролетели так, чтобы стена была разрушена.

Можете ли вы дать мне некоторую помощь / совет относительно хорошего способа сделать это?

1 ответ

Вам не нужно каким-либо образом скреплять узлы, составляющие стену - просто разместите их на экране. Если у игрока нет включения питания, отключите бит для игрока в физике тел узлов стены collisionBitMask чтобы узлы стены не сталкивались с игроком. Затем, когда игрок ударяет о стену, он будет затронут столкновением (и отскочит), но узлы стены не будут затронуты.

Когда у игрока есть питание, сделайте так, чтобы узлы стены были затронуты столкновением, а также включите контакты между игроком и стеной (достаточно просто включить бит для категории стены в игроке. contactTestBitMask). Тогда узлы стены будут затронуты столкновением (и перемещением или разворотом) и вашим didBegin() будет вызван, и вы можете запустить действие на каждом узле стены, состоящую из анимации, которую вы хотите, и заканчивая removeFromParent(),

Руководство по столкновению и контактной проверке битовых масок: /questions/4357086/chto-takoe-kategoriya-maski-i-maska-stolknoveniya-ot-sprite-kit/4357093#4357093

Управление битовыми масками для включения и выключения столкновения и контактов. /questions/27535848/ponimanie-spritekit-collisionbitmask/27535855#27535855

Редактировать: Демонстрация SK, показывающая объект, падающий на стену из блоков:

Создайте новый проект SK и используйте его как GameScene,swift:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

    override func didMove(to view: SKView) {

        physicsWorld.gravity = CGVector(dx:0, dy:0)

        let ball = SKSpriteNode.init(color: .red, size: CGSize(width: 50, height: 50))
        ball.physicsBody = SKPhysicsBody.init(circleOfRadius: ball.size.width/2)
        ball.position = CGPoint(x: 0, y: 0)

        buildWall()

        addChild(ball)

        ball.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 50))
    }

    func buildWall() {
        let xStart : CGFloat = ((scene?.size.width)!/2) * -0.9
        var brickPosition = CGPoint(x: xStart, y: 500)
        let brickSize = CGSize(width: 20, height:20)

        for wallRow in 1...10 {
            for wallColumn in 1...30 {
                let brick = SKSpriteNode(color: .yellow, size: brickSize)
                brick.physicsBody = SKPhysicsBody.init(rectangleOf: brick.size)

                brick.position = brickPosition

                addChild(brick)
                brickPosition.x += brickSize.width + 1
            }
            brickPosition.x = xStart
            brickPosition.y -= 11
        }
    }
}
Другие вопросы по тегам