2017-02-07 16 views
2

У меня есть спрайт с физическим телом. Чтобы переместить этот спрайт, в функции update() я постоянно устанавливаю скорость спрайта на 150 единиц, чтобы идти вправо, и -150, чтобы идти влево. (См. Прилагаемый код.)Выравнивание второго спрайта физическому телу первого спрайта в Spritekit/Swift

У меня есть второе физическое тело, которое я хотел бы следовать за первым спрайтом. Координаты этого второго физического тела находятся в нижней части первого, а 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() без успеха, а также ,

Я сделал другой тест, который просто позволяет использовать скорость для перемещения плеера, а вместо этого прямо увеличивает шарик.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) 

в моем исходном коде, в моем цикле обновления я также скорректировал позицию футбола, чтобы соответствовать мяч (игрок) позиции по мере необходимости, но в пересмотренном коде, из-за совместного бытия используется, по перемещая мяч, FootBall движется вместе с ним без какой-либо необходимости применять y силу или скорость или изменить положение x footBall.FootBall просто теги для поездки, которая работает.

Во-первых, этот новый метод работал неправильно, и я обнаружил через пробную версию и ошибку, что причина в том, что «footBall.physicsBody? .allowsRotation = false» не может быть указано как свойство на footBall. Однако, раскомментируя эту линию, она работает отлично.

Целью этого упражнения является использование footBall в качестве прыжковой контрольной точки, когда ноги игрока растягиваются во время прыжка. Таким образом, 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) 

то любой время, когда шарик перемещается, footBall также перемещается, поскольку это дочерний узел, поэтому вы можете удалить код обновления ручного положения для footBall.

+0

Такого рода вещь прекрасно работает для добавления спрайтов в другой спрайт, но он не работает с физическими телами. Я просто выяснил приемлемое решение моей проблемы, которое использует SKPhysicsJoint https://developer.apple.com/reference/spritekit/skphysicsjoint. Но я до сих пор не знаю, почему в моем исходном посте был переменный разрыв сжатия/расширения. Возможно, я пойму, почему это случилось однажды. –

+0

Спасибо за ваш ответ :) –