我希望节点向正确的方向移动,但是要设定强度的冲动。
let node: SKSpriteNode!;
node = SKSpriteNode(color: UIColor.greenColor(), size: CGSizeMake(50, 50));
node.physicsBody = SKPhysicsBody(rectangleOfSize: node.size);
node.physicsBody?.affectedByGravity = false;
node.physicsBody?.allowsRotation = false;
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
node.physicsBody?.velocity = CGVectorMake(0, 0);
// ver 1
node.physicsBody?.applyImpulse(CGVectorMake((0.4) * (location.x - node.position.x), (0.4) * (location.y - node.position.y)), atPoint: CGPointMake(position.x,position.y));
// ver 2
let offset:CGPoint = self.vecSub(location, b: ghost.position);
let direction: CGPoint = self.vecNormalize(offset);
var len: CGPoint = self.vecMult(direction, b: 40);
let impulseVector:CGVector = CGVectorMake(len.x, len.y);
ghost.physicsBody?.applyImpulse(impulseVector);
}
func vecAdd(a: CGPoint, b:CGPoint) -> CGPoint {
return CGPointMake(a.x + b.x, a.y + b.y);
}
func vecSub(a: CGPoint, b:CGPoint) -> CGPoint {
return CGPointMake(a.x - b.x, a.y - b.y);
}
func vecMult(a: CGPoint, b:CGFloat) -> CGPoint {
return CGPointMake(a.x * b, a.y * b);
}
func vecLenght(a:CGPoint)->CGFloat{
return CGFloat( sqrtf( CFloat(a.x) * CFloat(a.x) + CFloat(a.y) * CFloat(a.y)));
}
func vecNormalize(a:CGPoint)->CGPoint{
let len : CGFloat = self.vecLenght(a);
return CGPointMake(a.x / len, a.y / len);
}
版本1很糟糕
版本2没问题,但太贵了
版本3:一些不昂贵的东西并且施加15-100强度的脉冲,因为如果触摸位于屏幕的边缘,则节点应该仅移动其当前位置的15-100而不到达触摸位置
答案 0 :(得分:0)
您上面详述的两种方法都有效,所以我不确定您的问题是什么。另外,我不确定方法二是否过于昂贵,你是否使用帧速率下降?
但是我有另一种方法可以做你想要的事情,它基本上是第二个版本但是已经清理干净了。但首先我想用你当前的代码指出一些事情:
1。您不需要;
到每行的末尾。
2。您可以重载vecAdd
,vecSub
,+
和{{}},而不是使用-
,*
等。 {1}}运算符可以使您的代码更清晰,更清晰。这样,操作符也可以是全局的,因此您可以在需要操作向量的任何其他位置使用它们。
无论如何,这是我的尝试:
首先,扩展/
以添加您需要的功能。您定义为函数的CGVector
之类的内容可能是length
的属性:
CGVector
其次,使用新方法:
extension CGVector {
init(p1: CGPoint, p2: CGPoint) {
self.dx = p1.x - p2.x
self.dy = p1.y - p2.y
}
var length: CGFloat {
get { return hypot(dx, dy) }
set {
normalise()
dx *= newValue
dy *= newValue
}
}
mutating func normalise() {
dx /= length
dy /= length
}
}
或者,如果您希望脉冲的大小与用户按下的鬼魂的距离有关,请使用以下内容:
var vec = CGVector(p1: location, p2: ghost.position)
vec.length = 40
ghost.physicsBody!.applyImpulse(vec)
希望有所帮助!