Homchenkokostya
@Homchenkokostya

Как сделать столкновение персонажа?

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

c3b1c6211e404af9ba013a8ca86b0175.JPEG
  • Вопрос задан
  • 185 просмотров
Пригласить эксперта
Ответы на вопрос 2
Demetriy
@Demetriy
веб и мобильная разработка
Если кратко, то вам нужно включить физику для песка и корабля, задать ее свойства (по-умолчанию по-моему она будет считать физику по-аналогии с играми аля марио, т.е. ваш кораблик всегда будет падать вниз, поэтому нужно отключить это) и установить в свойствах, что песок и корабль могут сталкиваться друг с другом.

Вот урок, вроде подходит https://www.raywenderlich.com/123393/how-to-create...
Ответ написан
Homchenkokostya
@Homchenkokostya Автор вопроса
Вопрос решен. Можно перебрать каждую ячейку и наложить на нее пустой node, ну и соответственно наложить на каждый node физику по текстуре самой ячейки.

ef9c5fd27bc8466f458f179cf08794de.jpg
class GameScene: SKScene {
    var ground : SKTileMapNode!

    override func didMove(to view: SKView) {
        self.ground = self.childNode(withName: "//ground") as! SKTileMapNode

        let tileSize = self.ground.tileSize

        for col in 0..<self.ground.numberOfColumns {
            for row in 0..<self.ground.numberOfRows {
                let definition = self.ground.tileDefinition(atColumn: col, row: row)

                guard let texture = definition?.textures.first else {
                    continue
                }

                let x = CGFloat(col) * tileSize.width + tileSize.width / 2.0
                let y = CGFloat(row) * tileSize.height + tileSize.height / 2.0

                let tileNode = SKNode()
                tileNode.position = CGPoint(x: x, y: y)
                tileNode.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())
                tileNode.physicsBody?.affectedByGravity = false
                tileNode.physicsBody?.isDynamic = false

                self.addChild(tileNode)
            }
        }
    }
}


В данном примере scaleMode сцены стоит .resizeFill (так как пишем для macOS)
Сама сцена и слой карты (self.ground) имеет anchorPoint = CGPoint(x: 0, y: 0)
P.S. Пока это тестовый вариант, потому как еще не известно что же будет при больших картах, ну и думаю надо добавить что бы физика ложилась исключительно на крайние ячейки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы