Добавить физику только к спрайтам, которые на мой взгляд

У меня есть 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
        {

        }
    }
}

0 ответов

Другие вопросы по тегам