2016-01-14 4 views
1

Я пытаюсь нарисовать простую линию с той точки, которую я начал касатьться и удерживать до точки, в которую я двигаю пальцем. Таким образом, это всегда простая строка с начальной и конечной точками. Я пробовал разные учебники, но ничего не рисует, и я не получаю никаких ошибок.Нарисуйте простую строку на GameScene

Это мой код в GameScene.swift

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    /* Called when a touch begins */ 

    if let touch = touches.first { 
     self.tapDown = true 
     self.firstPoint = touch.locationInView(self.view) 
    } 
} 

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    self.tapDown = false 
    self.firstPoint = CGPoint.zero 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    if let touch = touches.first where self.tapDown { 
     let currentPoint = touch.locationInView(self.view) 
     let context = UIGraphicsGetCurrentContext() 
     CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor) 
     let lines = [CGPointMake(self.firstPoint.x,self.firstPoint.y),CGPointMake(currentPoint.x,currentPoint.y)] 
     CGContextAddLines(context,lines,4) 
     CGContextStrokePath(context) 
    } 
} 

В ViewController.swift после viewDidLoad я кладу это:

UIGraphicsBeginImageContext(skView.frame.size) 

Что здесь не так?

ответ

1

UIGraphicsGetCurrentContext() возвращает текущий контекст чертежа CoreGraphics. Там только текущий контекст рисования в двух сценариях:

  • , если вы находитесь внутри метода UIView drawRect: (или код вызывается из одного, или аналогичные функции, такие как те, для CALayer с)
  • если вы начали свой собственный контекст CG и сделал его «текущим», вызвав UIGraphicsPushContext.

Ни один из них имеет место в вашем методе touchesMoved, поэтому вызов возвращает nil и последующий код рисования не удается. (Я был бы удивлен, если бы он терпел неудачу ... нет ли каких-то консольных сообщений о рисовании с нулевым контекстом?)

Кроме того, SpriteKit не рисует с использованием CoreGraphics - он отображает на GPU, используя OpenGL или Metal, поэтому вы не выдаете команды рисования в SpriteKit так, чтобы описать сцену, которую должен рисовать SpriteKit. См. this answer для примера использования SKShapeNode, чтобы добавить строку в сцену SpriteKit.

+0

Это именно ответ, который я написал бы, если бы я написал ответ. – Caleb

+0

Я не получаю свой нулевой контекст, потому что я назвал UIGraphicsBeginImageContext (skView.frame.size) в viewDidLoad. Таким образом, существует фактически доступный контекст – NovumCoder

+0

@NovumCoder 'UIGraphicsBeginImageContext' предназначен для создания внеэкранного изображения. Рисунок, который вы делаете с контекстом, созданным с помощью этой функции, не появится на экране. – Caleb

0

Хорошо, я получил его работу, теперь я использую SKShapeNode, но причина в том, что я использовал touch.locationInView вместо touch.locationInNode, который дал другие координаты для моей точки касания.

В чем разница между locationInView и locationInNode ???

Рабочий код:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    if let touch = touches.first { 
     self.tapDown = true 
     self.firstPoint = touch.locationInNode(self) 
    } 
} 

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    self.tapDown = false 
    self.firstPoint = CGPoint.zero 
    self.enumerateChildNodesWithName("line", usingBlock: {node, stop in 
     node.removeFromParent() 
    }) 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    self.enumerateChildNodesWithName("line", usingBlock: {node, stop in 
     node.removeFromParent() 
    }) 
    if let touch = touches.first where self.tapDown { 
     let currentPoint = touch.locationInNode(self) 
     let path = CGPathCreateMutable() 
     CGPathMoveToPoint(path, nil, self.firstPoint.x, self.firstPoint.y) 
     CGPathAddLineToPoint(path, nil, currentPoint.x, currentPoint.y) 


     let shapeNode = SKShapeNode() 
     shapeNode.path = path 
     shapeNode.name = "line" 
     shapeNode.glowWidth = 2.5 
     shapeNode.strokeColor = UIColor.blueColor() 
     shapeNode.lineWidth = 2 
     shapeNode.zPosition = 1 

     self.addChild(shapeNode) 
    } 
}