2015-09-11 4 views
2

Как сделать спрайт сидеть на движущемся спрайте и путешествовать с ним. Я сделал прыжок с красным полем с импульсом, и когда он падает на черный блок, который движется, красная коробка остается, когда он упал, скользит движущийся объект, как нет трения. Условия тяжести, трение 1.0 в обоих даже пытались увеличить массу, но ничего не работало. Пожалуйста, дайте мне какие-либо подробности, как заставить его работать? благодаря переопределение функ didMoveToView (вид: SKView) { /* Настройка вашей сцены здесь */Как сделать спрайт сидеть на движущемся спрайте

self.physicsWorld.gravity = CGVectorMake(0.0, -9.8) 
    SquareOne.fillColor = UIColor.orangeColor() 
    SquareOne.position = CGPoint(x: self.frame.midX, y: self.frame.midY) 
    SquareOne.physicsBody = SKPhysicsBody(rectangleOfSize: SquareOne.frame.size) 
    SquareOne.physicsBody?.friction = 1.0 
    SquareOne.physicsBody?.restitution = 0.0 

    addChild(SquareOne) 


    SquareTwo.fillColor = UIColor.greenColor() 
    SquareTwo.position = CGPoint(x: self.frame.midX, y: self.frame.midY - 100) 
    SquareTwo.physicsBody = SKPhysicsBody(rectangleOfSize: SquareTwo.frame.size) 
    SquareTwo.physicsBody?.dynamic = false 
    SquareTwo.physicsBody?.affectedByGravity = false 
    SquareTwo.physicsBody?.friction = 1.0 
    SquareTwo.physicsBody?.restitution = 0.0 
    addChild(SquareTwo) 

} 

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    /* Called when a touch begins */ 

    for touch in (touches as! Set<UITouch>) { 
     let location = touch.locationInNode(self) 
     SquareTwo.runAction(SKAction.moveByX(-100, y: 0.0, duration: 3.0)) 
    } 
} 

How i want it to work

+0

Чтобы сделать это более простым, если есть только два блок красные и черные. Красный страдает от тяжести, а черный не влияет на мою гравитацию. При нажатии кнопки «Бэган», когда я прикасаюсь, черные начинают двигаться в направлении х. Когда он перемещает красные блокировки блока. Как сделать это прикрепленным к черному блоку. –

+1

У вас есть правильная идея. Вам просто нужно использовать физику для перемещения черных блоков. Вот как http://stackoverflow.com/questions/31590885/how-to-move-platform-with-velocity – 0x141E

ответ

2

В физическом моделировании вы должны применять скорость и силы для правильной работы симулятора. Физику нельзя смоделировать правильно, используя SKAction.

Сначала необходимо сделать динамическое, чтобы оно выполнялось силами. Сделайте массу SquareTwo большой, так что на нее не влияет другой SquareOne, столкнувшийся с ней.

SquareTwo.physicsBody?.dynamic = true 
SquareTwo.physicsBody?.affectedByGravity = false 
// Make the mass big so that the body is not affected by the other body colliding with it. 
SquareTwo.physicsBody?.mass = 1000000 

Тогда внутри touchesBegan вы можете установить скорость для SquareTwo

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    /* Called when a touch begins */ 

    for touch in (touches as! Set<UITouch>) { 
     let location = touch.locationInNode(self) 
     SquareTwo.physicsBody?.velocity = CGVectorMake(-10, 0) 
    } 
} 
+0

Спасибо за ответ. Это сработало. Это единственный способ реализовать? –

0

Вы можете удалить красный блок затем добавить его в качестве дочернего узла к движущемуся блока :

var redBlockPosition = childNodeWithName("redBlockName")?.position //find where red block is in self 
var movingBlockPosition = childNodeWithName("movingBlockName")?.position //find where moveing block is in self 
var redBlockPositionFromMovingBlock = CGPointMake(redBlockPosition.x + movingBlockPosition.x, redBlockPosition.y - movingBlockPosition.y) //find where red block is from moving block's origin 
childNodeWithName("redBlockName")?.removeFromParent() //remove red block 
redBlock.position = redBlockPositionFromMovingBlock //change redBlock's position 
childNodeWithName("movingBlockName")?.addChild(redBlock) //add red block as a child node of moving block 

Надеюсь, это помогло и удачи.

+0

Я не могу удалить красный блок как основной блок, и он продолжает прыгать с одного черного блока на другой. Поэтому мне нужно удалить и добавить красный блок для каждого движущегося черного блока. Который я не чувствую, является эффективным способом. –

+0

Попробуйте увеличить трение до максимума, чтобы блок не мог скользить. –

0

Попробуйте redBox.physicsBody.allowsRotation = NO,

Логическое значение, которое указывает, является ли тело физика влияет угловых сил и импульсов приложенных к нему.

и отрегулировать redBox.physicsBody.restitution от 0,0 до 1,0,

bounciness тела физики.

+0

Он не работает, но красная коробка уходит. –

+0

@vaidhyanathan Если вы предоставите образец проекта, я посмотрю. – WangYudong

+0

Я загрузил на Google Drive https://drive.google.com/file/d/0BwsEelZ-x-VKbnJCeXc3ZXhsWDA/view, пожалуйста, позвольте мне –

Смежные вопросы