2014-10-01 50 views
0

好吧,所以我有一個精靈,我有一個平臺上面。精靈從點(0,scene.frame.size.height/2)開始,平臺在(scene.frame.size.width/2,scene.frame.size.height-10)。所以精靈在左邊,平臺居中在屏幕的頂部。如何強制擺動路徑

我打算在精靈上應用強大的衝動。衝動的向量將有一個X但不是Y.基本上我會把它扔掉。

它應該在平臺下面,它會。我希望它做的是遵循擺動路徑,以樞軸點爲平臺中心。更重要的是,我想強制這條道路。不管物體x的動量如何,我希望它不得不沿着該擺動路徑擺動,而不會直接穿過它。

如果它有助於圖片擺動從藤蔓。我希望它在抓住藤蔓之前考慮到精靈的速度,但與現實世界不同的是,我希望它能夠迫使精靈在一個角度上傾倒,並通過類似於路徑的鐘擺向後傾斜。

我很難搞清楚我該如何去做這樣的事情,所以任何幫助將不勝感激。我知道我可能需要一個聯合來連接這兩個,如果這是全部的動量,我擔心我可能只用一個極限關節逃脫,但它實施擺動路徑並轉換動量部分,我被卡住了。

非常感謝您的幫助。

+0

。儘量讓它儘可能少地偏離路徑,但期待意想不到的效果,不要指望物理學永遠不會做你不想做的事情。它不會。 – LearnCocos2D 2014-10-01 07:36:28

+0

從Apple的文檔中,「一個SKPhysicsJointPin對象允許兩個物理實體圍繞錨點獨立旋轉,就好像固定在一起。」 – 0x141E 2014-10-01 08:23:43

回答

1

下面是如何實現的SKPhysicsJointPin一個例子:如果你需要強制你不能依靠使用的物理模擬,更別說如果機構將碰撞的特定行爲

-(id)initWithSize:(CGSize)size { 

    if (self = [super initWithSize:size]) { 

     CGPoint location = CGPointMake(self.frame.size.width/2, self.frame.size.height/2); 

     // Create the pendulum's pivot 
     SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:size]; 
     sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite.size]; 
     sprite.physicsBody.dynamic = NO; 

     sprite.position = location; 
     sprite.size = CGSizeMake(8, 8); 

     [self addChild:sprite]; 

     location = CGPointMake(self.frame.size.width/2-100, self.frame.size.height/2); 
     size = CGSizeMake(50, 200); 

     // Create the pendulum's bob 
     SKSpriteNode *sprite2 = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:size]; 
     sprite2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite.size]; 
     sprite2.physicsBody.dynamic = YES; 
     sprite2.physicsBody.affectedByGravity = YES; 
     sprite2.physicsBody.linearDamping = 0; 

     sprite2.physicsBody.mass = 0.1; 

     sprite2.size = CGSizeMake(32, 32); 
     sprite2.position = location; 
     [self addChild:sprite2]; 

     CGPoint point = CGPointMake(self.frame.size.width/2, self.frame.size.height/2); 

     // Create a joint that connects the pivot and the bob 
     SKPhysicsJointPin *pinJoint = [SKPhysicsJointPin jointWithBodyA:sprite.physicsBody 
                    bodyB:sprite2.physicsBody anchor:point]; 

     // Add the joint to the world 
     [self.physicsWorld addJoint:pinJoint]; 
    } 
    return self; 
} 
+0

這非常完美,非常感謝。有一件事似乎缺少了。我爲這個測試設置了sprite2的affectedByGravity屬性爲NO。我運行了一個動作來給sprite2一個衝動矢量(10,0)。結果是精靈根本沒有移動。當我向下施加同樣的力量時,它完美地工作。然後,我將精靈2下移20,然後嘗試。它工作,但轉換非常低。它似乎只是根據角度轉換一部分動量。我怎麼能確保所有動量都轉化爲擺動動量? – Ryoku 2014-10-03 10:50:44

+0

如果我要確保所應用的脈衝與sprite1和sprite 2成90度(0.5弧度)的角度,您認爲它可能有用嗎?如果是這樣,我將如何重新計算匹配給定角度的衝動(基本上,我如何將衝動從10,0轉換爲匹配必要角度所需的衝量)? – Ryoku 2014-10-03 11:05:33

+0

是的,你需要施加一個與sprite和sprite2角度垂直的脈衝。當我有機會時,我會更新我的答案。 – 0x141E 2014-10-03 20:05:52