仅将物理场添加到我视图内的子画面

时间:2018-08-11 21:57:43

标签: swift xcode physics tiles sktilemapnode

我有一个tileMap,并且其中包含一些tileNode,我希望仅对屏幕视图内的tileNodes提供物理特性,并且随着玩家对世界的浏览,进入屏幕视图的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)
            }
        }
    }
}

玩家在touchesBegun中使用此功能向英雄添加冲动...

    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 个答案:

没有答案