Ошибка физики SKTileMap на реальных устройствах - PullRequest
1 голос
/ 27 марта 2019

Я занимаюсь разработкой 2D SpriteKit игры, в которой используются карты тайлов.Я дал своим картам плиток SKPhysicsBody с этой функцией:

import SpriteKit

func giveTileMapPhysicsBody(map: SKTileMapNode) {
    let tileMap = map
    let tileSize = tileMap.tileSize
    let halfWidth = CGFloat(tileMap.numberOfColumns) / 2.0 * tileSize.width
    let halfHeight = CGFloat(tileMap.numberOfRows) / 2.0 * tileSize.height

    for col in 0..<tileMap.numberOfColumns {

        for row in 0..<tileMap.numberOfRows {

            if let tileDefinition = tileMap.tileDefinition(atColumn: col, row: row)

            {

                //let isEdgeTile = tileDefinition.userData?["AddBody"] as? Int      //uncomment this if needed, see article notes
                //if (isEdgeTile != 0) {
                let tileArray = tileDefinition.textures
                let tileTexture = tileArray[0]
                let x = CGFloat(col) * tileSize.width - halfWidth + (tileSize.width/8)
                let y = CGFloat(row) * tileSize.height - halfHeight + (tileSize.height/8)
                _ = CGRect(x: 0, y: 0, width: tileSize.width, height: tileSize.height)
                let tileNode = SKNode()

                tileNode.position = CGPoint(x: x, y: y)
                tileNode.physicsBody = SKPhysicsBody(texture: tileTexture, size: CGSize(width: (tileTexture.size().width), height: (tileTexture.size().height)))
                tileNode.physicsBody?.linearDamping = 0.8 //60.0
                tileNode.physicsBody?.affectedByGravity = false
                tileNode.physicsBody?.allowsRotation = false
                tileNode.physicsBody?.restitution = 0.2
                tileNode.physicsBody?.isDynamic = false


                tileNode.physicsBody?.categoryBitMask = PhysicsCategory.tileMap
                tileNode.physicsBody?.contactTestBitMask = PhysicsCategory.player
                tileNode.physicsBody?.collisionBitMask = PhysicsCategory.player
                tileNode.physicsBody?.friction = 0.8 // 3.0

                tileMap.addChild(tileNode)
                //}
            }
        }
    }
}

Как вы можете видеть на первом скриншоте, когда я запускаю свою игру на симуляторе, все работает правильно, но когда я запускаю его наВ моем реальном iPhone или iPad есть ошибка в физике тайловой карты (второе изображение).Как вы можете видеть на втором изображении, есть физический пробел при запуске его на моих реальных устройствах.Вы знаете, что это может быть?

enter image description here

enter image description here

РЕДАКТИРОВАТЬ:

к сожалению это не работает на моем проекте.Физическая форма не будет соответствовать карте правильно.enter image description here

1 Ответ

0 голосов
/ 27 марта 2019

Попробуйте реализовать это так

typealias TileCoordinates = (column: Int, row: Int)

func giveTileMapPhysicsBody(map: SKTileMapNode)  {
    let tileMap = map

    var physicsBodies = [SKPhysicsBody]()

    for row in 0..<tileMap.numberOfRows {
        for column in 0..<tileMap.numberOfColumns {
            guard let tile = tile(in: tileMap, at: (column, row)) else { continue }

            let center = tileMap.centerOfTile(atColumn: column, row: row)
            let body = SKPhysicsBody(rectangleOf: tile.size, center: center)
            physicsBodies.append(body)
        }
    }

    tileMap.physicsBody = SKPhysicsBody(bodies: physicsBodies)
    tileMap.physicsBody?.categoryBitMask = PhysicsCategory.tileMap
    tileMap.physicsBody?.contactTestBitMask = PhysicsCategory.player
    tileMap.physicsBody?.collisionBitMask = PhysicsCategory.player
    tileMap.physicsBody?.linearDamping = 0.8 //60.0
    tileMap.physicsBody?.affectedByGravity = false
    tileMap.physicsBody?.allowsRotation = false
    tileMap.physicsBody?.restitution = 0.2
    tileMap.physicsBody?.isDynamic = false
    tileMap.physicsBody?.friction = 0.8 // 3.0
}

func tile(in tileMap: SKTileMapNode, at coordinates: TileCoordinates) -> SKTileDefinition? {
    return tileMap.tileDefinition(atColumn: coordinates.column, row: coordinates.row)
}
...