Спрайткит физика уничтожает объекты анимации
Возможно ли как-то уничтожить объект при контакте? Как не просто удалить его с экрана с помощью 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
}
}
}