Добавить физику только к спрайтам, которые на мой взгляд
У меня есть tileMap, и внутри него есть несколько tileNodes, я хочу дать физику только тем плиткам, которые находятся в пределах экрана, и когда игрок перемещается по миру, мозаичные узлы, которые появляются в окне, получают физику, а мозаичные узлы выходят из вид экрана убрать их физику. Буду признателен за любую помощь, даже если это означает полностью переделать мой код. Спасибо.
Вот как я добавляю физику в свои плитки...
static func addPhysicsTo(map: SKTileMapNode)
{
let tileSize = map.tileSize
let halfWidth = CGFloat(map.numberOfColumns) / 2.0 * tileSize.width
let halfHeight = CGFloat(map.numberOfRows) / 2.0 * tileSize.height
for col in 0..<map.numberOfColumns
{
for row in 0..<map.numberOfRows
{
let tileDefinition = map.tileDefinition(atColumn: col, row: row)
let isUsedTile = tileDefinition?.userData?["Tile"] as? Bool
if (isUsedTile ?? false)
{
let x = CGFloat(col) * tileSize.width - halfWidth
let y = CGFloat(row) * tileSize.height - halfHeight
let rect = CGRect(x: 0, y: 0, width: tileSize.width, height: tileSize.height)
let tileNode = SKShapeNode(rect: rect)
tileNode.position = CGPoint(x: x, y: y)
tileNode.physicsBody = SKPhysicsBody.init(rectangleOf: tileSize, center: CGPoint(x: tileSize.width / 2.0, y: tileSize.height / 2.0))
tileNode.physicsBody?.isDynamic = true
tileNode.physicsBody?.allowsRotation = false
tileNode.physicsBody?.affectedByGravity = false
tileNode.physicsBody?.pinned = true
tileNode.physicsBody?.density = 200.0
tileNode.physicsBody?.categoryBitMask = GameConstants.physicsConstants.tileCategory
tileNode.physicsBody?.collisionBitMask = GameConstants.physicsConstants.playerCategory
//tileNode.physicsBody?.contactTestBitMask = GameConstants.physicsConstants.allCategory
map.addChild(tileNode)
}
}
}
}
Игрок добавляет в Героя импульс с помощью этой функции в прикосновениях Бегуна...
static func applyImpulse(sprite: SKSpriteNode, touchLocationX: CGFloat, touchLocationY: CGFloat)
{
let impulseX = (sprite.position.x - touchLocationX ) / 10
let impulseY = (sprite.position.y - touchLocationY ) / 20
sprite.physicsBody?.applyImpulse(CGVector(x: impulseX , y: impulseY))
}
Я создал класс tileNode, который будет активировать и деактивировать узлы, я просто не знаю, как должен выглядеть остальной код...
class TileNodes: SKSpriteNode
{
var isTileActivated: Bool = false
{
didSet
{
physicsBody = isTileActivated ? activatedBody : nil
}
}
private var activatedBody: SKPhysicsBody?
init(with size: CGSize)
{
super.init(texture: nil, color: UIColor.clear, size: size)
//I ASSUME THE CODE GOES HERE
physicsBody = isTileActivated ? activatedBody : nil
name = GameConstants.nameConstants.tileName
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Основываясь на некоторых вещах, которые я нашел в Интернете, мне кажется, что мне нужно использовать didSimulatePhysics(), но я не знаю, как..
override func didSimulatePhysics()
{
for node in tileMap[GameConstants.nameConstants.tileName]
{
if let tileNode = node as? TileNodes
{
}
}
}