Игра Dev: Как переместить спрайт в зигзаг под углом 90 градусов? - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу создать линию, которая связала серию отрезков, которые становятся длиннее каждую секунду, и каждый раз, когда пользователь нажимает на направление роста, поворачивается на 90 градусов.

enter image description here

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

Не уверен, что это было хорошее решение. Пожалуйста, дайте мне совет или, возможно, идею для более элегантного решения.

Пока я получил это:

enter image description here

Вот мой код:

//
//  GameScene.swift
//  Flarrow
//
//  Created by Денис Андрейчук on 11/9/18.
//  Copyright © 2018 Денис Андрейчук. All rights reserved.
//

import SpriteKit

class GameScene: SKScene {
    //For state control
    enum State {
        case moveUp
        case moveLeft
        case moveRight
    }

    var currentState = State.moveUp
    var pathArray = [CGPoint]()
    let line = SKShapeNode()

    override func didMove(to view: SKView) {
        self.backgroundColor = .gray

        currentState = .moveUp

        pathArray.append(CGPoint(x: 0, y: -UIScreen.main.bounds.height))
        pathArray.append(CGPoint(x: 0, y: -UIScreen.main.bounds.height))
        createLine()
    }

    //When user touch on screen, check for touch position, change state based on that
    //and add duplicate of current last point
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first!
        let location = touch.location(in: self)

        if location.x > 0 {
            currentState = .moveRight
            pathArray.append(pathArray[pathArray.endIndex - 1])
        } else {
            currentState = .moveLeft
            pathArray.append(pathArray[pathArray.endIndex - 1])
        }
    }

    //Init line
    func createLine() {
        let path = CGMutablePath()
        path.move(to: pathArray[0])

        for point in pathArray {
            path.addLine(to: point)
        }

        line.path = path
        line.fillColor = .clear
        line.lineWidth = 5
        line.strokeColor = .red

        self.addChild(line)
    }

    //Update last point possition based on current state
    override func update(_ currentTime: TimeInterval) {
        let path = CGMutablePath()
        path.move(to: pathArray[0])

        switch currentState {
        case .moveUp:
            pathArray[1].y += 1
        case .moveLeft:
            pathArray[pathArray.endIndex - 1].y += 1
            pathArray[pathArray.endIndex - 1].x -= 1
        case .moveRight:
            pathArray[pathArray.endIndex - 1].y += 1
            pathArray[pathArray.endIndex - 1].x += 1
        }

        for point in pathArray {
            path.addLine(to: point)
        }

        line.path = path

    }
}

В последнем вопросе я не очень хорошо сформулировал свой вопрос, поэтому теперь я описал его более подробно.

...