如何在触摸角度上对节点施加脉冲

时间:2015-05-11 17:08:25

标签: swift touch skphysicsbody

我希望节点向正确的方向移动,但是要设定强度的冲动。

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而不到达触摸位置

1 个答案:

答案 0 :(得分:0)

您上面详述的两种方法都有效,所以我不确定您的问题是什么。另外,我不确定方法二是否过于昂贵,你是否使用帧速率下降?

但是我有另一种方法可以做你想要的事情,它基本上是第二个版本但是已经清理干净了。但首先我想用你当前的代码指出一些事情:

1。您不需要;到每行的末尾。

2。您可以重载vecAddvecSub+和{{}},而不是使用-*等。 {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)

希望有所帮助!