Я хочу создать линию, которая связала серию отрезков, которые становятся длиннее каждую секунду, и каждый раз, когда пользователь нажимает на направление роста, поворачивается на 90 градусов.
Мне наконец-то удалось создать хотя бы какой-нибудь рабочий прототип моей зигзагообразной линии .
Моя основная идея состоит в том, чтобы изначально создать две точки в одной позиции,
а затем просто переместите конечную точку в нужном направлении. Если игрок меняет состояние линии, мы добавляем еще одну точку в текущую позицию головы.
Не уверен, что это было хорошее решение. Пожалуйста, дайте мне совет или, возможно, идею для более элегантного решения.
Пока я получил это:
Вот мой код:
//
// 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
}
}
В последнем вопросе я не очень хорошо сформулировал свой вопрос, поэтому теперь я описал его более подробно.