2017-02-07 42 views
2

我有一個物理主體的Sprite。 爲了移動這個精靈,在update()函數中,我不斷地將精靈的速度設置爲150個單位向右,並且-150向左。 (見附件代碼。)將Spritekit/Swift中第一個Sprite的物理主體與第二個Sprite對齊

我有第二個物理機構,我想要跟隨第一個精靈。第二個物理體的座標位於第一個物理體的底部,右邊20個點。

我想第二個物理機構總是跟着第一個,與偏移量。

我的代碼主要是的作品,但我注意到,第一個和第二個機構之間的距離稍有不同,我希望沒有變化。向右移動時,它們之間的距離被壓縮一點。向左移動時,它們之間的距離稍微增加。看到視頻的位置:https://www.youtube.com/watch?v=K9FhIdMwp7k

這裏是我使用的代碼:

override func update(_ currentTime: TimeInterval) { 

    switch playerDirection { 
    case "stopped": 
     playerSpeed = 0.0 
    case "right": 
     playerSpeed = 150.0 
    case "left": 
     playerSpeed = -150.0 
    default: 
     print("default") 
    } 

    // ball is the first sprite and footBall is the second sprite: 

    ball.physicsBody?.velocity = CGVector(dx: playerSpeed, dy: ball.physicsBody!.velocity.dy) 

    footBall.position = CGPoint(x: (ball.position.x + 20), y: ball.position.y - (ball.size.height/2) + 4) 

    myCam.position = CGPoint(x: round(ball.position.x), y: self.size.height/2) 

...

我一直在使用覆蓋FUNC didSimulatePhysics()沒有成功玩耍,還。

我做了一個不同的測試,只是不再使用速度來移動播放器,而是直接遞增ball.position.x(ball = player)和footBall.position.x,當我這樣做時,一切都是完美的對齊。但是如果我採用這條路線,我將不得不改變我的遊戲物理在遊戲中的其他地方的工作方式,我寧願忽略它。

謝謝你看看。

回答

0

我用SKPhysicsJoint來解決問題。這是我工作的代碼(測試在這一點上,所以還是有點草率,但它的原理工作):

//add a nice player 
    ball = SKSpriteNode(texture:spriteArray2[0]) 
    ball.size = CGSize(width: 150, height: 48) 
    //ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height/2) 
    ball.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 16, height: 48)) 
    ball.zPosition = 1 
    ball.physicsBody?.affectedByGravity = true 
    ball.position = CGPoint(x: 80.0, y: 200.0) 
    ball.physicsBody?.categoryBitMask = 1 
    ball.physicsBody?.collisionBitMask = UInt32(2 | 32 | 256) //2 = floors, 32 and 256= doors. 
    ball.physicsBody?.contactTestBitMask = 0 
    ball.physicsBody?.isDynamic = true 
    ball.physicsBody?.restitution = 0.0 
    ball.physicsBody?.allowsRotation = false 
    ball.physicsBody?.mass = 60.0 
    ball.physicsBody?.friction = 0.00 
    addChild(ball) 

    //add a nice ball for when jumping 
    footBall = SKSpriteNode(color: SKColor.blue, size: CGSize(width: 24, height: 16)) 
    footBall.position = ball.position 
    footBall.name = "footBall" 
    footBall.zPosition = 1 
    footBall.physicsBody = SKPhysicsBody(circleOfRadius: 4) 
    footBall.physicsBody?.affectedByGravity = false 
    footBall.physicsBody?.categoryBitMask = 16 
    footBall.physicsBody?.collisionBitMask = 2 // floors 
    footBall.physicsBody?.contactTestBitMask = UInt32(32 | 64 | 128 | 256) // the doors bear snake 
    footBall.physicsBody?.isDynamic = true 
    footBall.physicsBody?.restitution = 0.0 
    //footBall.physicsBody?.allowsRotation = false 
    //footBall.physicsBody?.mass = 60.0 
    //footBall.physicsBody?.friction = 0.00 
    addChild(footBall) 

    let myCGPoint = ball.position // sets joint position 

    let myJoint = SKPhysicsJointFixed.joint(withBodyA: ball.physicsBody!, bodyB: footBall.physicsBody!, anchor: myCGPoint) 

    scene?.physicsWorld.add(myJoint) 

...

然後在更新循環下來,我設定的速度爲玩家作爲這樣:

ball.physicsBody?.velocity = CGVector(dx: playerSpeed, dy: ball.physicsBody!.velocity.dy) 

在我的原代碼,在我的更新循環我也需要調整足球位置匹配球(玩家)的位置,但在修改後的代碼,因爲共同福祉的使用,由移動球的腳球隨着它移動而不需要另外應用y力或速度或更改足球的x位置。footBall只是標記順序,這是有效的。

起初,這種新方法無法正常工作,我通過反覆試驗發現,「footBall.physicsBody?.allowsRotation = false」的原因無法在footBall上指定爲屬性。但是,通過取消註釋這條線它工作正常。

這個練習的要點是使用footBall作爲跳躍時伸出球員腳的跳躍測試點。所以足球位於主要球員身體的稍前方。然後,我會根據跳轉需要動態打開或關閉此腳形球。

有點關係上「腳傳感器」以下頁面: http://gamedevwithoutacause.com/?p=1076 http://www.iforce2d.net/b2dtut/jumpability

0

如果您將第二個節點添加爲第一個節點,它是否符合您的要求?也就是說,不是在同一水平有兩種方式:

scene.addChild(ball) 
scene.addChild(footBall) 

替換爲:

scene.addChild(ball) 
ball.addChild(footBall) 

和剛剛成立的足球位置偏移,您需要:

footBall.position = CGPoint(x: 20, y: - (ball.size.height/2) + 4) 

那麼任何球移動的時候,足球也會移動,因爲它是一個子節點,因此您可以移除足球的手動位置更新代碼。

+0

這種事情的偉大工程精靈加入到另一個精靈,但它不與物理機構合作。我只是想出了一個可接受的解決方案,使用SKPhysicsJoint https://developer.apple.com/reference/spritekit/skphysicsjoint。但我仍然不知道爲什麼我原來的帖子中存在一個可變的「壓縮/擴展」差距。也許我會弄清楚爲什麼有一天發生了。 –

+0

謝謝你的迴應:) –

相關問題