Спрайткит физика уничтожает объекты анимации - PullRequest
0 голосов
/ 09 декабря 2018

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

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

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

1 Ответ

0 голосов
/ 10 декабря 2018

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

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

Руководство по битовым маскам коллизий и contactTest: https://stackoverflow.com/a/40596890/1430420

Управление битовыми масками для включения и выключения коллизий и контактов.https://stackoverflow.com/a/46495864/1430420

Редактировать: Демонстрация 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
        }
    }
}
...