Вызов моего Swift SKView в цикле for с запущенным представлением завершается сбоем после двух циклов - PullRequest
0 голосов
/ 04 февраля 2019

Инициализация

import SpriteKit
import PlaygroundSupport



var myScene = SKScene()
myScene.size = CGSize(width: 800, height: 800)

var rect = CGRect(x: 0, y: 0, width: 800, height: 800)
var myView = SKView(frame: rect)
myScene.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
myView.preferredFramesPerSecond = 1
myView.showsFPS = true 

PlaygroundPage.current.liveView = myView




public class agent{
//      pos x, y
var x: Double = 0
var y: Double = 0
//      velocity
var v: Double = 0
//      how far agent can "see"
var r: Double = 0
//      orientation
var o: Double = 0
//      turning characteristic
var alpha: Double = 0
init(alpha: Double?){
    self.alpha = alpha ?? 0
}
//      neighborly influence on alpha
var beta: Double = 0
var size: Double = 10
var color: CGColor = #colorLiteral(red: 0.5568627715110779, green: 0.3529411852359772, blue: 0.9686274528503418, alpha: 1.0)



func show(){

Я не уверен, что это лучший способ сделать круг, я использовал здесь чей-то код.

    let shapeLayer = CAShapeLayer()
    let orientLayer = CAShapeLayer()

    if shapeLayer.fillColor != color{
        shapeLayer.fillColor = color
        shapeLayer.strokeColor = #colorLiteral(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
        shapeLayer.lineWidth = 1.0        

        orientLayer.strokeColor = #colorLiteral(red: 0.2549019753932953, green: 0.27450981736183167, blue: 0.3019607961177826, alpha: 1.0)
        orientLayer.lineWidth = 3
    } 

    let circlePath = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: CGFloat(size), startAngle: CGFloat(0), endAngle: CGFloat(Double.pi * 2), clockwise: true)

    let orientLine = UIBezierPath()
    var ox = size * cos(o) + x
    var oy = size * sin(o) + y
    orientLine.move(to: CGPoint(x: x, y: y))
    orientLine.addLine(to: CGPoint(x: ox, y: oy))
    orientLayer.path = orientLine.cgPath

    //          circlePath.append(orientLine)

    shapeLayer.path = circlePath.cgPath

Это также может быть проблемойно я не знаю, как еще добавить их в представление.

    myView.layer.addSublayer(shapeLayer)
    myView.layer.addSublayer(orientLayer)
}


func go(){
    var n: Double = 0
    var tempV = v
    var angle: Double = 0
    var neighbors: [agent] = []

    func see(){
        //          1. Check if there are any other agents in r
        for i in 0..<agents.count{
            if agents[i] !== self{
                var x1 = x
                var x2 = agents[i].x
                var y1 = y
                var y2 = agents[i].y

                var d = sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2))

                if d < r{
                    neighbors.append(agents[i])
                }
            } 
        }
        //          2. See if more are on left/right
        //               the line between self and neighbor  exist at an angle of more than pi(from self perspective), it is left 
    }
    //          3. Add/ subtract beta from n    
    see()
    if neighbors.count >= 1{
        tempV += 50
    }
    angle = o + n

    var newX: Double = 0
    var newY: Double = 0
    newX = tempV * cos(angle) + x
    newY = tempV * sin(angle) + y
    x = newX
    y = newY
    o += alpha
    tempV = v
    neighbors = []
}
   }
    var agents: [agent] = []


var a = agent(alpha: M_PI * 1.2)
a.y = 600.0
a.x = 300.0
a.o = M_PI * 3 / 1.93
a.r = 50
a.v = 40

var b = agent(alpha: M_PI * 1 / 7)
b.y = 600.0
b.x = 500.0
b.o = M_PI * 3.25 / 3.93
b.r = 80
b.v = 40
b.color = #colorLiteral(red: 0.9254902005195618, green: 0.23529411852359772, blue: 0.10196078568696976, alpha: 1.0)

agents.append(contentsOf: [a, b])

for i in 0...150{
agents.forEach{agent in
    agent.show()
    agent.go() 

Когда я помещаю 'myView.presentScene (myScene)', 'myView' или myView.setNeedsDisplay 'в этот блок кода, он нене работаетОн выдает одну и ту же ошибку каждый раз.

    }
}

myView.presentScene(myScene)

После того, как эта часть кода запускается дважды, он говорит: «Ошибка поиска проблем в вашем коде».Это не указывает на какие-либо ошибки в моем коде.Я использую Swift для iPad, и у меня нет кода. Я не пытаюсь заставить приложение просто заставить его работать.

...