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