Spritekit физика разрушает анимацию объектов

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

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

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


person Beginner    schedule 09.12.2018    source источник


Ответы (1)


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

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

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

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

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

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

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
        }
    }
}
person Steve Ives    schedule 10.12.2018
comment
во-первых, спасибо за ваш ответ, я знаю о битмасках категории / контакта / столкновения. Я ищу лучший способ разрушить стены на маленькие кусочки, моя идея заключалась в том, чтобы сделать много спрайтов и соединить их вместе, а затем столкнуться со стеной, оттолкнуть ее назад и разорвать соединение, чтобы стена развалилась, но я не знаю. уметь соединять спрайты вместе - person Beginner; 10.12.2018
comment
как игрок ударяется о стену -> стена отталкивается (установите бит в contactTestBitmask) -> стена разваливается на части (узлы отсоединяются от своей точки привязки, и стена разваливается) - person Beginner; 10.12.2018
comment
Я думаю, вы слишком все усложняете — узлы, составляющие стену, не нужно соединять вместе, потому что что заставит их двигаться, если только игрок не столкнется с ними при включении питания? Таким образом, игрок сталкивается со стеной, когда коллизии включены, и узлы стены, в которые он попадает, отталкиваются. Они поражают другие узлы, заставляя их кувыркаться и вращаться. - person Steve Ives; 10.12.2018
comment
Я собираюсь посмотреть, смогу ли я написать небольшую демонстрацию — просто чтобы посмотреть, работает ли то, о чем я думаю. - person Steve Ives; 10.12.2018
comment
это было бы прекрасно! потому что, если у меня есть стена, и она сталкивается с игроком, я согласен, что тогда она движется или отталкивается, когда я устанавливаю правильный бит, но она не собирается разваливаться, поскольку она будет разрушена или что-то в этом роде. - person Beginner; 10.12.2018
comment
Я попробовал это сейчас, просто установив биты, стены при ударе кувыркаются и раскручиваются при столкновении, но они не взрываются и не разваливаются, как мне бы хотелось. - person Beginner; 13.12.2018
comment
как будто мой игрок супер сильный, он разрушает стены, а не пинает их - person Beginner; 13.12.2018
comment
Чтобы стена «взорвалась», вам нужно дать ей SKAction, который, вероятно, будет анимацией, за которой следует removeFromParent Механизм SK никогда не уничтожит узел, так как все узлы практически неразрушимы/ Я все еще надеюсь, что напиши демо :-) - person Steve Ives; 13.12.2018
comment
хорошо, спасибо, я надеюсь, что вы напишете эту демонстрацию :) я пытался изменить масштаб / размер с помощью действий, но это выглядит довольно странно: D - person Beginner; 13.12.2018
comment
@ Новичок - извините, что так долго. Я добавил пример кода, показывающий блок, ссылающийся на стену и разбивающий ее на части. Это что-то вроде того, что вы имели в виду? (обратите внимание, что «мяч» — это квадрат, но по физике тело — это круг) - person Steve Ives; 26.12.2018
comment
Я сам был очень занят, все равно спасибо за ответ! посмотрю на этой неделе - person Beginner; 07.01.2019