Изменить направление, а не скорость в SpriteKit (быстро)

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

            var impactX = contact.contactNormal.dx
            var impactY = contact.contactNormal.dy

            var radiansCon: Double = Double(atan((contact.contactNormal.dy / contact.contactNormal.dx)))
            var angleCon = Double(radiansCon * 180) / M_PI
            //println("Bounce Angle:\(angleCon)")

            if(angleCon < 60 && angleCon > 0) {
                println("Adjust angle Positive")
            } else if (angleCon > -60 && angleCon < 0) {
                println("Adjust angle Negative")
            }

Как изменить угол, когда мяч отскакивает, не меняя скорости?

(Я новичок в наборе спрайтов, поэтому дайте мне знать, если я пропущу какие-либо детали)


person inVINCEable    schedule 04.03.2015    source источник


Ответы (3)


Вероятно, это не лучший способ сделать это, но пока он работает:

            var impactX = contact.contactNormal.dx
            var impactY = contact.contactNormal.dy

            var radiansCon: Double = Double(atan((contact.contactNormal.dy / contact.contactNormal.dx)))
            var angleCon = Double(radiansCon * 180) / M_PI
            if(angleCon < 60 && angleCon > 0) {
                var newX = CGFloat(0.5)
                var newY = CGFloat(0.85)
                self.ball.body.applyImpulse(CGVectorMake(newX, newY))
            } else if (angleCon > -60 && angleCon < 0) {
                var newX = CGFloat(-0.5)
                var newY = CGFloat(0.85)
                self.ball.body.applyImpulse(CGVectorMake(newX, newY))
            }
person inVINCEable    schedule 04.03.2015

В учебнике Breakout Рэя Вендерлиха есть несколько полезных идей. Во-первых, поймите, что если мяч летит слишком горизонтально, скорость dx уже изменилась — она слишком низкая. В этом случае подтолкните его в направлении x. То же самое верно, если скорость dy слишком мала — теперь он подпрыгивает из стороны в сторону и никуда не попадает, поэтому подтолкните его в направлении y. Наконец, проверьте общую скорость мяча — если она слишком высока, уменьшите ее. Этот пример находится в методе didBegin для регулировки мяча, когда он отскакивает от ракетки:

// Get the absolute value of dx and dy
let dxSpeed = fabs(CGFloat((ball.physicsBody?.velocity.dx)!))
let dySpeed = fabs(CGFloat((ball.physicsBody?.velocity.dy)!))

let speed = sqrt(dxSpeed + dySpeed)

if dxSpeed <= 250.0 {
    ball.physicsBody?.applyImpulse(CGVector(dx: -20.0, dy: 0.0))
}

if dySpeed <= 250.0 {
    ball.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 20.0))
}

if speed > maxSpeed {
    ball.physicsBody?.linearDamping = 0.1
} else {
    ball.physicsBody?.linearDamping = 0.0   
}

Разумеется, цифры придется корректировать исходя из характеристик вашего мяча.

person squarehippo10    schedule 09.04.2017

Вы можете использовать свойство zRotation вашего спрайта и установить новый угол:

yourBody.zRotation = yournewAngle
person Christian    schedule 04.03.2015
comment
По какой-то причине это сбрасывает мою игру, я не совсем уверен, почему, но я изучаю это. Есть ли способ использовать applyImpulse или что-то подобное? - person inVINCEable; 04.03.2015
comment
Обновите это, zRotation всегда 0,0, независимо от угла. - person inVINCEable; 04.03.2015