如何从自定义SKAction Swift中引用节点

如何从自定义SKAction Swift中引用节点,swift,skaction,Swift,Skaction,我可以按如下方式创建自定义操作: extension SKAction { class func move(from: CGPoint, halfWayTo: CGPoint, duration: TimeInterval) -> SKAction { let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 ) return SKAction.move(to: mid

我可以按如下方式创建自定义操作:

extension SKAction {
  class func move(from: CGPoint, halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
extension SKNode {
  func move(halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let from = self.position
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
//Setup
let node = SKNode()
node.position = CGPoint(x: 50, y: 50)
let destination = CGPoint(x: 100, y: 100)

//Move from node's current position half way towards the destination
let action2 = node.move(halfWayTo: destination, duration: 1)
node.run(action2)
然后我用这个:

//Setup
let node = SKNode()
node.position = CGPoint(x: 50, y: 50)
let destination = CGPoint(x: 100, y: 100)

//Move from node's current position half way towards the destination
let action = SKAction.move(from: node.position, halfWayTo: destination, duration: 1)
node.run(action)
但按照标准:

SKAction.move(to: destination, duration: 1)
我宁愿说:

let action = SKAction.move(halfWayTo: destination, duration: 1)
node.run(action)

但我不知道如何从自定义SKAction中引用“节点”,以便获得它的位置并计算中间点?

您使用
self

extension SKAction {
  class func move(halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let from = self.position
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
然后打电话(如你所说)


您可以使用
self

extension SKAction {
  class func move(halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let from = self.position
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
然后打电话(如你所说)


我仍然不确定SKAction是否有对它所应用的节点的引用——即使它正在运行——或者即使有,我也不确定是否有办法访问它。如果有人知道,请告诉我

我想到了如下一种方法:

extension SKAction {
  class func move(from: CGPoint, halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
extension SKNode {
  func move(halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let from = self.position
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
//Setup
let node = SKNode()
node.position = CGPoint(x: 50, y: 50)
let destination = CGPoint(x: 100, y: 100)

//Move from node's current position half way towards the destination
let action2 = node.move(halfWayTo: destination, duration: 1)
node.run(action2)
扩展SKNode而不是扩展SKAction,如下所示:

extension SKAction {
  class func move(from: CGPoint, halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
extension SKNode {
  func move(halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let from = self.position
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
//Setup
let node = SKNode()
node.position = CGPoint(x: 50, y: 50)
let destination = CGPoint(x: 100, y: 100)

//Move from node's current position half way towards the destination
let action2 = node.move(halfWayTo: destination, duration: 1)
node.run(action2)
然后按如下方式使用:

extension SKAction {
  class func move(from: CGPoint, halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
extension SKNode {
  func move(halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let from = self.position
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
//Setup
let node = SKNode()
node.position = CGPoint(x: 50, y: 50)
let destination = CGPoint(x: 100, y: 100)

//Move from node's current position half way towards the destination
let action2 = node.move(halfWayTo: destination, duration: 1)
node.run(action2)

我仍然不确定SKAction是否有对它所应用的节点的引用——即使它正在运行——或者即使有,我也不确定是否有办法访问它。如果有人知道,请告诉我

我想到了如下一种方法:

extension SKAction {
  class func move(from: CGPoint, halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
extension SKNode {
  func move(halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let from = self.position
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
//Setup
let node = SKNode()
node.position = CGPoint(x: 50, y: 50)
let destination = CGPoint(x: 100, y: 100)

//Move from node's current position half way towards the destination
let action2 = node.move(halfWayTo: destination, duration: 1)
node.run(action2)
扩展SKNode而不是扩展SKAction,如下所示:

extension SKAction {
  class func move(from: CGPoint, halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
extension SKNode {
  func move(halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let from = self.position
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
//Setup
let node = SKNode()
node.position = CGPoint(x: 50, y: 50)
let destination = CGPoint(x: 100, y: 100)

//Move from node's current position half way towards the destination
let action2 = node.move(halfWayTo: destination, duration: 1)
node.run(action2)
然后按如下方式使用:

extension SKAction {
  class func move(from: CGPoint, halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
extension SKNode {
  func move(halfWayTo: CGPoint, duration: TimeInterval) -> SKAction {
    let from = self.position
    let midPoint = CGPoint(x: (from.x + halfWayTo.x)/2, y: (from.y + halfWayTo.y)/2 )
    return SKAction.move(to: midPoint, duration: duration)
  }
}
//Setup
let node = SKNode()
node.position = CGPoint(x: 50, y: 50)
let destination = CGPoint(x: 100, y: 100)

//Move from node's current position half way towards the destination
let action2 = node.move(halfWayTo: destination, duration: 1)
node.run(action2)

非常感谢ValyreanGroup。我现在已经尝试了你的建议。我在“let from=self.position”行中得到一个编译错误,它说:“类型‘SKAction’没有成员‘position’,我意识到我原来的问题中有语法错误,这意味着可以执行node.move,但这是错误的。它需要是SKAction.move,所以我编辑了我的原始问题。正如@Adahus所指出的,SKAction没有
职位
成员。非常感谢ValyreanGroup。我现在已经尝试了你的建议。我在“let from=self.position”行中得到一个编译错误,它说:“类型‘SKAction’没有成员‘position’,我意识到我原来的问题中有语法错误,这意味着可以执行node.move,但这是错误的。它需要是SKAction.move,所以我编辑了我的原始问题。正如@Adahus所指出的,SKAction没有
位置
成员。我一直在尝试做类似的事情,我想不出任何方法来做。正如您所意识到的,当您调用
SKAction.move(中途转到:)
时,
SKAction
无法访问相关的
SKNode
。您对
SKNode
的扩展是一个有趣的想法,但我认为我将继续使用对
SKAction
的扩展,并只传递起点,就像您在原始示例中所做的那样。似乎最好在代码中明确说明我们正在创建一个
SKAction
。我同意作为SKAction的扩展更好。我一直在尝试做类似的事情,但我想不出任何方法。正如您所意识到的,当您调用
SKAction.move(中途转到:)
时,
SKAction
无法访问相关的
SKNode
。您对
SKNode
的扩展是一个有趣的想法,但我认为我将继续使用对
SKAction
的扩展,并只传递起点,就像您在原始示例中所做的那样。似乎最好在代码中明确说明我们正在创建一个
SKAction
。我同意作为SKAction的扩展更好。