2014-12-10 7 views
3

Единственная причина, по которой я пытаюсь это сделать, так это я могу получить доступ к местоположениям каждой плитки, что позволяет управлять сеткой. Я просмотрел около 15 различных учебников, используя другие языки программирования, но даже с этими знаниями мне все еще очень сложно создать одно в Swift.Пытаясь сделать изометрическую сетку программно с помощью Swift

Я попытался создать вложенный цикл, но я даже не уверен, если код внутри петли сделать логический смысл для создания изометрической сетки, я просто взял его одной из учебных пособий, которые я нашел:

func generateGrid() { 
    for (var i = 0; i < 5; i++) { 
     for (var j = 5; j >= 0; j--){ 
      tile.position = CGPoint(x: (j * Int(tile.size.height)/2) + 
             (i * Int(tile.size.width)/2), 
            y: (i * Int(tile.size.height)/2) - 
             (j * Int(tile.size.width)/2)) 
      addChild(tile) 
     } 
    } 
} 

Затем я попытался вызвать это в функции «didMoveToView», но, очевидно, вы не можете добавить один и тот же узел более одного раза.

Пожалуйста, дайте мне любое направление, которое вы можете.

+1

вы должны создать новую плитку каждый раз, а затем установить свою позицию и добавить его на сцену – Okapi

+0

Как создать новая переменная для каждого запуска цикла for? –

+0

Как бы вы сделали это за пределами цикла for? Так же. –

ответ

7

Для создания изометрической сетки, как так

Isometric grid

один должен создать две петли. Один из них выполняет итерацию по строкам, а другой выполняет итерацию через столбцы. Обратите внимание, что центр каждого другого столбца сдвинут на половину высоты плитки и то же самое для каждой другой строки. Чтобы компенсировать это, мы проверяем, являются ли строки и столбцы четными или нечетными и соответственно корректируют их. Потенциальная функция будет выглядеть примерно так:

func generateGrid() { 

    for i in 0..<5 { 

     // Every other line needs to be shifted 
     var offsetX = 0 
     if i % 2 == 0 { 
      offsetX = 0 
     } else { 
      offsetX = tile.size.width/2.0 
     } 

     for j in 0..<5 { 
      var tile = Tile() 

      // Every other line needs to be shifted 
      var offsetY = 0 
      if i % 2 == 0 { 
       offsetX = 0 
      } else { 
       offsetX = tile.size.height/2.0 
      } 

      tile.position = CGPoint(x: (i * tile.size.width) - offsetX, y: (j * tile.size.height) - offsetY) 
      addChild(tile) 
     } 
    } 
} 
8

Вот пример того, как создать изометрическую сетку в SpriteKit:

Define сетки настройки

let tileHeight:CGFloat = 16.0 
let tileWidth:CGFloat = 32.0 
let numRows = 5 
let numCols = 6 

Создание элементов сетки и добавить их к месту происшествия в соответствующих местах

let size = CGSizeMake(tileWidth, tileHeight) 
for row in 1...numRows { 
    for col in 1...numCols { 
     // Create a new tile object 
     let tile = newTile(size) 
     // Convert (col,row) to (x,y) 
     tile.position = tilePosition(col, row: row) 
     self.addChild(tile) 
    } 
} 

Эта функция преобразует положение сетки для координат сцены x и y. Используйте это, чтобы создать сетку и добавить здания в сетку.

func tilePosition(col:Int, row:Int) -> CGPoint { 
    let x = (CGFloat(row) * tileWidth/2.0) + (CGFloat(col) * tileWidth/2.0) 
    let y = (CGFloat(col) * tileHeight/2.0) - (CGFloat(row) * tileHeight/2.0) 
    return CGPointMake(x+100.0, y+100.0) 
} 

Эта функция создает новый ромбовидные SKShapeNode

func newTile(size:CGSize) -> SKShapeNode { 
    let shape = SKShapeNode() 
    let path = UIBezierPath() 
    path.moveToPoint(CGPointMake(0, size.height/2.0)) 
    path.addLineToPoint(CGPointMake(size.width/2.0, 0)) 
    path.addLineToPoint(CGPointMake(0, -size.height/2.0)) 
    path.addLineToPoint(CGPointMake(-size.width/2.0, 0)) 
    path.closePath() 
    shape.path = path.CGPath 
    shape.lineWidth = 1.0 
    shape.fillColor = SKColor.grayColor() 
    return shape 
} 

Эта функция определяет соответствующую позицию г для того, чтобы здания, размещенные на сетке, будет оказана в правильном порядке.

func buildingZPosition(col:Int, row:Int) -> CGFloat { 
    return CGFloat(row*numCols + numCols-col) 
} 

Isometric grid with buildings

Рисунок 1. Изометрическая Сетка Создано с выше код