Вращение и масштабирование iPhone SpriteKitIOS

Программируем под IOS
Ответить
Anonymous
 Вращение и масштабирование iPhone SpriteKit

Сообщение Anonymous »

Я новичок в SpriteKit и пытаюсь попрактиковаться, создавая простую 2D-игру. Я дошел до того, что моя карта отображалась на экране и обрезалась так, чтобы заполнить только около 1/3 экрана (чтобы можно было оставить место для других элементов управления и т. д.).
Однако применение жестов вращения и масштабирования карты вызывает у меня головную боль. Я понял, что если я поверну камеру (SKCameraNode), то повернется весь экран, а это не то, чего я хочу. Если хотите, вы можете увидеть мою попытку: . В видео я хотел бы, чтобы карта вращалась и масштабировалась внутри зеленого прямоугольника и аккуратно обрезалась только внутри зеленого прямоугольника. Но, как видите, все вращается.
Я пытался поместить свой SKCameraNode внутри SKCropNode, но это не помогло.
Кроме того, я попытался применить поворот к моему объекту SKTileMapNode, и это действительно работает правильно и обрезает видимую область карты до 1/3 экрана. Однако вращение, похоже, не сосредоточено вокруг центрального представления пользователя, а ось вращения всегда находится немного левее или правее центра просматриваемой карты. Из-за этого очень сложно поворачивать и масштабировать карту любым полезным способом.
Есть ли способ использовать SKCameraNode и обрезать ее «правильно»? Если я поверну весь SKTileMapNode, то мне нужно будет выполнить некоторые сложные математические действия, чтобы вычислить новое положение SKTileMapNode после вращения, чтобы центрировать его в представлении, и это кажется мне очень сложным (не любителем математики). здесь, извините).
Вот как я визуализирую свою карту:
private func renderMap() {
guard let map = currentMap else { return }
guard let textureAtlas = textureAtlas else {
print("Texture atlas not loaded")
return
}
let tileSet = createTileSet(from: textureAtlas)
let columns = map.mapData[0].count
let rows = map.mapData.count
let tileMap = SKTileMapNode(tileSet: tileSet, columns: columns, rows: rows, tileSize: tileSize)
tileMap.anchorPoint = CGPoint(x: 0.5, y: 0.5)
// Fill the tile map with tiles based on the mapData
for row in 0 ..< rows {
for column in 0 ..< columns {
let tileName = map.mapData[row][column]
if let tileGroup = tileSet.tileGroups.first(where: { $0.name == tileName }) {
tileMap. setTileGroup(tileGroup, forColumn: column, row: row)
}
}
}
// Create a crop node
let cropNode = SKCropNode()
let cropWidth = tileSize.width * 3
let maskNode = SKShapeNode(rect: CGRect(x: 0, y: 0, width: cropWidth, height: 300))
maskNode.fillColor = .white
cropNode.maskNode = maskNode
cropNode.addChild(tileMap)
self.addChild(cropNode)
}

Вот мой обработчик вращения:
// Handle rotation
@objc private func handleRotation(gesture: UIRotationGestureRecognizer) {
print("handleRotation")
guard let camera = camera else { return }
if gesture. state == .changed | | gesture.state == .ended {
camera.zRotation -= gesture.rotation
gesture.rotation = 0.0 // Reset rotation factor
print("handleRotation complete")
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... nd-zooming
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»