画直线瞄准
Draw straight line for aiming
如果你之前玩过愤怒的小鸟或任何台球游戏,你就会熟悉我正在尝试做的事情,基本上我想要的是:
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)
}
}
我在 location 之前添加了 - 以便在节点前面绘制线 ao 它提供更好的瞄准感,但这给我带来了 2 个问题:
1- 我希望这条线在节点前面有一个限制,但与此同时,我希望它的末端是当前的触摸位置。 (基本上,我希望它通过节点)
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 { [=10=].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)
}
}
}
在你的情况下,只需做类似的事情,我已经使用更新到 delete/add 新行,但我想你可以使用 touchesMoved(touches:withEvent) 来完成它。
每帧删除和添加线节点的替代方法,制作一个 1 像素乘 1 像素的 SKShapeNode,然后在 x 轴上缩放点到点的距离,然后旋转它。使用 let angle = arctan2(P2_y - P1_y , P2_x - P1_x)
(我相信 arctan2 会为您处理除以 0)以获得角度
如果你之前玩过愤怒的小鸟或任何台球游戏,你就会熟悉我正在尝试做的事情,基本上我想要的是:
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)
}
}
我在 location 之前添加了 - 以便在节点前面绘制线 ao 它提供更好的瞄准感,但这给我带来了 2 个问题:
1- 我希望这条线在节点前面有一个限制,但与此同时,我希望它的末端是当前的触摸位置。 (基本上,我希望它通过节点)
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 { [=10=].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)
}
}
}
在你的情况下,只需做类似的事情,我已经使用更新到 delete/add 新行,但我想你可以使用 touchesMoved(touches:withEvent) 来完成它。
每帧删除和添加线节点的替代方法,制作一个 1 像素乘 1 像素的 SKShapeNode,然后在 x 轴上缩放点到点的距离,然后旋转它。使用 let angle = arctan2(P2_y - P1_y , P2_x - P1_x)
(我相信 arctan2 会为您处理除以 0)以获得角度