【问题标题】:Draw straight line for aiming画直线用于瞄准
【发布时间】:2016-05-05 20:44:04
【问题描述】:

如果你在熟悉我想要做的事情之前玩过愤怒的小鸟或任何台球游戏,基本上我想要的是:

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)
            }
        }

我添加了 - before 位置,以便在节点前面绘制线,从而提供更好的瞄准感,但这给我留下了两个问题:

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

2- 我仍然不知道如何让它在撞到墙壁或其他东西时反射到直角,这样它就可以知道节点会从墙上反弹。

【问题讨论】:

  • 我不是 Sprite-kit 甚至 Swift 专家,但看起来您需要改变 SKShapeNode 对象而不是构造一个新对象。

标签: swift sprite-kit line cgpath skshapenode


【解决方案1】:

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

【讨论】:

  • 这很好用,关于撞墙反射的事情有什么想法吗?
  • 相同的概念,但您添加了第二个 skshapenode,它从第 1 行的末尾开始,一直移动到第 2 点的末尾
【解决方案2】:

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)
      }
   }
}

在您的情况下,只需执行类似的操作,我已使用 update 删除/添加新行,但我想您可以使用 touchesMoved(touches:withEvent) 来执行此操作。

【讨论】:

  • 我现在有一个代码,它删除了 touchesMoved 函数开头的行并在完成后再次添加,请检查我的更新。
猜你喜欢
  • 2011-07-21
  • 2015-06-23
  • 2019-09-10
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多