Переместить противника на новую позицию игрока - PullRequest
0 голосов
/ 15 октября 2019

В приведенном ниже коде я перемещаю игрока на тайл, к которому он прикасается, а затем я ожидаю, что противник переместится на новую позицию игрока. Что происходит на самом деле, так это то, что враг движется к плитке, на которой был игрок, прежде чем двигаться. Может кто-нибудь объяснить, почему это происходит и как получить желаемый результат ??

import SpriteKit
import GameplayKit

class GameScene: SKScene {

var player: SKSpriteNode!
var enemy: SKSpriteNode!
var grid: SKTileMapNode!

var turnState: String = "pause"

var touchLocation: CGPoint = .zero

override func didMove(to view: SKView) {
    self.backgroundColor = .white
    loadSceneNodes()
}

func loadSceneNodes() {
    setupGrid()
    setupCharacter()
    setupEnemy()
}

func setupGrid() {
    let columns = 10
    let rows = 10
    let size = CGSize(width: 64, height: 64)

    guard let tileSet = SKTileSet(named: "Ground Tiles") else {
        fatalError("Tile set not found")
    }

    grid = SKTileMapNode(tileSet: tileSet, columns: columns, rows: rows, tileSize: size)
    addChild(grid)

    grid.name = "grid"

    let tileGroups = tileSet.tileGroups

    guard let dirtLightTile = tileGroups.first(where: {$0.name == "DirtLight Tile"}) else {
        fatalError("No DirtLight tile definition found")
    }

    guard let dirtDarkTile = tileGroups.first(where: {$0.name == "DirtDark Tile"}) else {
        fatalError("No DirtDark tile definition found")
    }

    for column in 0...columns {
        for row in 0...rows {
            if (row % 2 == 0) && (column % 2 == 0) {
                grid.setTileGroup(dirtLightTile, forColumn: column, row: row)
            } else if (row % 2 != 0) && (column % 2 != 0) {
                grid.setTileGroup(dirtLightTile, forColumn: column, row: row)
            } else {
                grid.setTileGroup(dirtDarkTile, forColumn: column, row: row)
            }
        }
    }
}

func setupCharacter() {
    player = SKSpriteNode(imageNamed: "knight")
    let height = player.size.height
    let scaleFactor = grid.tileSize.height / height
    player.setScale(scaleFactor)
    player.position = grid.centerOfTile(atColumn: 0, row: 0)
    addChild(player)
}

func setupEnemy() {
    enemy = SKSpriteNode(imageNamed: "knight")
    let height = enemy.size.height
    let scaleFactor = grid.tileSize.height / height
    enemy.setScale(scaleFactor)
    enemy.position = grid.centerOfTile(atColumn: 9, row: 9)
    addChild(enemy)
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else { return }

    let touchedNodes = self.nodes(at: touchLocation)
    for node in touchedNodes {
        if node.name == "grid" {
            touchLocation = touch.location(in: self)
            turnState = "player"
        }
    }

    print("touch location: (row: \(grid.tileRowIndex(fromPosition: touchLocation)), column: \(grid.tileColumnIndex(fromPosition: touchLocation)))")
    print("player current position: \(getRowCol(character: player))")
}

override func update(_ currentTime: TimeInterval) {

    switch turnState {
    case "player":
        print("moving player")
        movePlayer()
        turnState = "enemy"
        print("finished moving player")
    case "enemy":
        print("moving enemy")
        moveEnemy()
        turnState = "pause"
        print("finished moving enemy")
    default:
        return
    }

    print("frame finished")
}


func movePlayer() {

    let touchRow = grid.tileRowIndex(fromPosition: touchLocation)
    let touchCol = grid.tileColumnIndex(fromPosition: touchLocation)

    print("moving player to: (row: \(touchRow), column: \(touchCol))")

    let newTile = grid.centerOfTile(atColumn: touchCol, row: touchRow)
    let move = SKAction.move(to: newTile, duration: 0.5)
    player.run(move)

}

func moveEnemy() {
    let playerRow = getRowCol(character: player).row
    let playerCol = getRowCol(character: player).column

    print("moving enemy to: (row: \(playerRow), column: \(playerCol))")

    let newTile = grid.centerOfTile(atColumn: playerCol, row: playerRow)
    let move = SKAction.move(to: newTile, duration: 0.5)
    enemy.run(move)
}


func getRowCol(character: SKSpriteNode) -> (row: Int, column: Int) {
    let row = grid.tileRowIndex(fromPosition: character.position)
    let col = grid.tileColumnIndex(fromPosition: character.position)

    return (row, col)

    }
}

вывод ниже при нажатии на плитку (строка: 0, столбец: 1):

touch location: (row: 0, column: 1)
player current position: (row: 0, column: 0)
moving player
moving player to: (row: 0, column: 1)
finished moving player
frame finished
moving enemy
moving enemy to: (row: 0, column: 0)
finished moving enemy
frame finished
...