Вам не нужно каким-либо образом объединять узлы, составляющие стену, - просто разместите их на экране.Если у игрока нет питания , отключите бит для игрока в физическом теле 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
}
}
}