2016-02-22 5 views
0

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

the yosemite tile game

Вопрос: Есть ли способ, без использования Box2D и столкновений обнаружения, чтобы получить плитки передвигаться правильно?

Это связан с моим предыдущим вопросом:

Snap squares to a grid algorithm

, который я задаю, потому что физический движок оставляет плитки повсюду.

Там может быть несколько штук не хватает (в отличие от этой картины, где есть ровно один)

+1

Использование физического движка для этого было бы похоже на использование физического движка для добавления двух чисел. Если пользователь перемещает фрагмент в позиции сетки (x, y) в некотором направлении, переместите эту плиту * и все плитки, которые образуют смежный блок при перемещении в этом направлении *. Например. если движется вправо, 'for (i = x; i

+0

Я не понимаю, как это обеспечивает решение. Как вы определяете, есть ли смежный блок в определенном направлении? Предположим, вы начали двигаться вправо, а затем двигаетесь влево. Эти плитки больше не «касаются», и поэтому движение вправо снова не должно их перемещать. Моя точка зрения, вы в конечном итоге придется решать для столкновения снова, так что ... физический движок. –

+0

Непонятно из вашего вопроса (возможно, в связанном вопросе, но я не смотрел), но я полагаю, что «движение» пользователя в блоке может быть меньше полного квадрата сетки - например, только несколько пикселей? Это не меняет вещи принципиально: всякий раз, когда вы двигаетесь, скажем, в 10 пикселей, вы начинаете с 'z = 10' и продолжаете перемещать плитки, крайний левый край которых находится в <= z' пикселей справа от самого крайнего края текущего плитки , уменьшая «z» на размер зазора каждый раз. Когда 'z' станет отрицательным, вы можете остановиться. –

ответ

0

Оно сводилось к рекурсивной функции в большей «Совет». Спасибо за ввод. В основном просто нужно было знать, что это было легко.

func moveTile(tile:Tile, amount:CGFloat, direction:Direction) -> CGFloat { 
    var checkLocation:CGPoint = tile.position 
    var spaceBetween:CGFloat = 0 
    switch direction { 
    case .North: 
     checkLocation.y += amount + (tileSize.height/2) 
    case .South : 
     checkLocation.y -= amount + (tileSize.height/2) 
    case .East: 
     checkLocation.x += amount + (tileSize.width/2) 
    case .West: 
     checkLocation.x -= amount + (tileSize.width/2) 
    } 
    var maxAmount = amount 
    if !boundingEdgeRect.contains(checkLocation) { 
     switch direction { 
     case .North: 
      maxAmount -= checkLocation.y - boundingEdgeRect.height - boundingEdgeRect.origin.y 
     case .South : 
      maxAmount -= boundingEdgeRect.origin.y - checkLocation.y 
     case .East: 
      maxAmount -= checkLocation.x - boundingEdgeRect.width - boundingEdgeRect.origin.x 
     case .West: 
      maxAmount -= boundingEdgeRect.origin.x - checkLocation.x 
     } 
    } else { 
     let nodes = self.nodesAtPoint(checkLocation) 
     for node in nodes { 
      if let nextTile = node as? Tile { 
       switch direction { 
       case .North: 
        spaceBetween = nextTile.position.y - tile.position.y - tileSize.height 
       case .South : 
        spaceBetween = tile.position.y - nextTile.position.y - tileSize.height 
       case .East: 
        spaceBetween = nextTile.position.x - tile.position.x - tileSize.width 
       case .West: 
        spaceBetween = tile.position.x - nextTile.position.x - tileSize.width 
       } 
       let tileAmount = moveTile(nextTile, amount:amount - spaceBetween, direction:direction) + spaceBetween 
       if tileAmount < maxAmount { 
        maxAmount = tileAmount 
       } 
      } 
     } 
    } 
    switch direction { 
    case .North: 
     tile.position.y += maxAmount 
    case .South : 
     tile.position.y -= maxAmount 
    case .East: 
     tile.position.x += maxAmount 
    case .West: 
     tile.position.x -= maxAmount 
    } 
    return maxAmount 
} 

Плитки центрально закреплены, положение относительно доски, которая также находится на якоре.

Смежные вопросы