绘制直线进行瞄准

时间:2016-05-05 20:44:05

标签: swift sprite-kit line cgpath skshapenode

如果您在熟悉我想要做的事情之前玩过“愤怒的小鸟”或任何游泳池游戏,基本上我想要的是:

1-在touchesMoved中画一条线,这样玩家就可以知道他瞄准的方向。

2-我希望线条在碰到其他物体时以正确的方向反射。 到目前为止,我有这个:

更新

   var ref = CGPathCreateMutable()

        override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

            for touch in touches {
                let location = touch.locationInNode(self)

                let path = CGPathCreateMutable()
                CGPathMoveToPoint(ref, nil, position.x - 100 , position.y - 100 )
                CGPathAddLineToPoint(ref, nil, -location.x, -location.y)

                line.removeFromParent()
                line.path = ref

                line.strokeColor = UIColor.redColor()
                line.lineWidth = 20
                line.antialiased = true
                line.fillColor = UIColor.blueColor()
                addChild(line)
            }
        }

我添加了 - 之前的位置,以便在节点前面绘制线条,它可以提供更好的瞄准感,但是这给我带来了两个问题:

1-我希望该行有一个限制,它在节点前面,但同时,我希望它的结束是当前的触摸位置。 (基本上,我希望它通过节点)

2-我仍然不知道当它碰到墙壁时,我怎么能让它反射到正确的角度,这样才能让它知道节点会从那堵墙上反弹。

2 个答案:

答案 0 :(得分:0)

SpriteKit不是绘图API。在SpriteKit中,您基本上可以向场景添加元素并为元素设置动画。你需要做的是删除前一行(如果有的话),然后每帧向场景中添加一个新行。 这是伪代码,让您了解如何执行此操作:

class ParentNode: SKNode {

   private var lines = [SKShapeNode]()

    /// Called before each frame is rendered
    override func update(currentTime: CFTimeInterval) {
      self.drawLine()
    }

    func drawLine() {
      let _ = self.lines.map { $0.removeFromParent() }
      self.lines.removeAll()

      if let path = self.createDrawingPath() {
         let lineNode = SKShapeNode()
         lineNode.path = path
         lineNode.strokeColor = UIColor.whiteColor()
         lineNode.lineWidth = 3.0

         self.addChild(lineNode)
         self.lines.append(lineNode)
      }
   }
}

在你的情况下,只是做类似的事情,我已经使用更新删除/添加新行,但我想你可以使用touchesMoved(touches:withEvent)来做它。

答案 1 :(得分:0)

每帧删除和添加一个线节点的替代方法,使SKShapeNode为1像素乘1像素,然后在x轴上缩放从pt到pt的距离,然后旋转它。使用let angle = arctan2(P2_y - P1_y , P2_x - P1_x)(我相信arctan2为你处理除以0)来获得角度