2015-05-11 14 views
2

我希望節點向正確的方向移動,但衝動是以設定的力度。如何在觸摸角度上向節點施加衝擊

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

你上面詳細說明的兩種方法都有效,所以我不確定你的問題是什麼。另外,我不確定方法二是否太昂貴,是否使用幀速率下降?

但我有另一種方式可以做你以後的事情,它基本上是第二個版本,但清理。但首先,我只想指出一些與你當前的代碼有關的東西:

1.你不需要;到每行的結尾。

2.而不是使用vecAdd的,vecSub等你可以重載+-*/運營商這將使你的代碼更清潔,更清晰。這樣,操作符也是全局的,所以你可以在任何需要操縱向量的地方使用它們。

總之,這裏是我的嘗試吧:

首先,延長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) 

另外,如果你想衝動的大小關係到用戶按下的鬼魂有多遠,請使用以下內容:

vec.length *= 0.1 

希望有所幫助!

+0

是的方法二有幀率下降,我會嘗試你的代碼,並希望工作,非常感謝你 – grape1

+0

這很奇怪,我試過方法二,似乎沒有更多的FPS下降當使用模擬器時比正常情況。使用方法二時,您是否嘗試過在設備上進行測試? – ABakerSmith

+0

我有iPhone 5s,開始時它下降到57-58 fps,節點的移動有滯後。 – grape1