Как скорость влияет на CCSprite в бурундуке Cocos2d?

Мне нужно базовое понимание того, как работает изменение скорости? то есть как CCSprite может прыгать на определенной высоте, когда установлена ​​некоторая скорость?

Позвольте привести пример, над которым я сейчас работаю. Я готовлю демо, похожее на птичку, в которой я хочу, чтобы моя птица приземлилась на вертикальные трубы. Так вот, как будто моя птичка прыгает с трубы на другую трубу:smile:. Проверьте gif, который я помещаю здесь: https://www.dropbox.com/s/n46vak6qy5wu4x4/jumpyBall_15_jul_152.gif?dl=0

Я использую Sprite Builder и сделал это демо с гравитацией = (0, -300). Расстояние между трубами составляет 149. Итак, когда начинается демонстрация, моя птичка падает на платформу и при столкновении птицы и платформы выполняется следующий метод.

Заметка

distanceObst = 149

__player = птичка

dummyPos = начальная позиция X самой первой трубы

hero = __player

платформа = труба

func ccPhysicsCollisionPreSolve(pair: CCPhysicsCollisionPair!, hero: Player!, platform: Obstacle!) -> Bool {
        if (dummyPos < 120) {    // This is to confirm that velocity X is set only once in lifetime.
            __player.physicsBody.velocity.x = 80
        }
        hero.physicsBody.velocity.y = 283

        NSLog("--- Velocity \(hero.physicsBody.velocity.y) and distance \(ccpSub(hero.position, ccp(dummyPos, 0)))")
        dummyPos = hero.position.x

        return true
    }

Сначала проверьте консоль на выполнение этого кода

2015-08-09 02:34:05.042 tsb[15327:94829] cocos2d: surface size: 1136x640
2015-08-09 02:34:05.750 tsb[15327:94829] --- Velocity 283.0 and distance (135.0,153.25)
2015-08-09 02:34:07.617 tsb[15327:94829] --- Velocity 283.0 and distance (149.334320068359,154.448120117188)
2015-08-09 02:34:09.483 tsb[15327:94829] --- Velocity 283.0 and distance (149.333770751953,155.526428222656)
2015-08-09 02:34:11.366 tsb[15327:94829] --- Velocity 283.0 and distance (150.664428710938,151.796905517578)
2015-08-09 02:34:13.233 tsb[15327:94829] --- Velocity 283.0 and distance (149.331237792969,153.140319824219)
2015-08-09 02:34:15.100 tsb[15327:94829] --- Velocity 283.0 and distance (149.331237792969,154.349395751953)
2015-08-09 02:34:16.967 tsb[15327:94829] --- Velocity 283.0 and distance (149.33642578125,155.437561035156)
2015-08-09 02:34:18.850 tsb[15327:94829] --- Velocity 283.0 and distance (150.671020507812,151.716918945312)

Это похоже на то, как когда я начинаю подпрыгивать птичку, она правильно отскакивает от центра трубы, но когда она продолжает подпрыгивать через несколько секунд, птичка смещается и подходит к левому / правому краю трубы, а иногда и падает на землю:open_mouth:. Проверьте этот GIF: https://www.dropbox.com/s/v07lfah35iojitz/jumpyBall_15_jul_153.gif?dl=0

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

Если вы хотите проверить мой метод обновления,

override func update(delta: CCTime) {
        __player.position = ccp(__player.position.x /*+ (scrollSpeed * CGFloat(delta))*/, __player.position.y)
        __physicsWorld.position = ccp(firstObstPos - __player.position.x, __physicsWorld.position.y)
}

Здесь, в обновлении, я просто следую "__player", чтобы он мог оставаться на экране.

Может ли кто-нибудь дать мне правильное руководство о том, что мне делать, потому что значения, которые я здесь взял, являются постоянными, и если я хочу увеличить скорость, я увеличу скорость X или могу уменьшить скорость Y, что также повлияет на расстояние между трубами.

Есть ли какая-нибудь формула, чтобы я мог рассчитать скорость и установить ее на точное расстояние 149?

Я много гуглил и нашел некоторые уравнения скорости, но не смог выяснить, как их можно применить в бурундуке Cocos2d. Может кто-нибудь сказать мне, как Бурундук решает высоту, продолжительность и расстояние отскока от простой скорости (80, 283) и гравитации (0, -300)?

Эти ответы будут огромной помощью для меня. Спасибо, парни.

*********** Обновление - 16/08/15 *****************

Я изменил свой код и теперь вместо того, чтобы принимать фиксированные значения, я использую некоторую формулу для вычисления скорости, времени, высоты и расстояния. Таким образом, я получаю идеальные ответы на то, что я хочу.

let Pi = CGFloat(M_PI)
let degreesToRadians = CGFloat(Pi / 180)
let radiansToDegrees = CGFloat(180 / Pi)

    func d2R(angle: CGFloat) -> CGFloat {
        return angle * degreesToRadians
    }

    func updateSpeed() {
        // t = (2*V*Sin(a))/g -> V = (t*g)/(2*sin(a))
        // h = ((V*V)/2g)*Sin^2(a))
        // D = ((V*V)/g)*sin(2*a)

        let angle = d2R(cAngle)
        velocity_y = (delta_t * gravity)/(2*sin(angle))
        maxJumpHeight = ((velocity_y*velocity_y)/(2*gravity))*(sin(angle)*sin(angle))
        //distanceObst = ((velocity_y*velocity_y)/gravity)*sin(2*angle)

        // Distance in terms of speed rather than velocity
        distanceObst = delta_t*scrollSpeed

        var a = 10      // Debug line
    }

Теперь preSolve столкновение будет

func ccPhysicsCollisionPreSolve(pair: CCPhysicsCollisionPair!, hero: Player!, platform: Obstacle!) -> Bool {
        let diff = ccpSub(hero.position, ccp(dummyPos, 0))
        let distance = distanceObst + (distanceObst - diff.x)
        NSLog("--- Velocity \(hero.physicsBody.velocity) and \(hero.position) -> \(dummyPos) distance \(diff) and \(distance)")

        if ((dummyPos > firstObstPos) && (diff.x > 0)) {
            // TODO: Adjustment for the bounce point when distance travelled differs
            //velocity_y = velocityForDistance(distance)
            //delta_t = ((delta_t*diff.x)/distance)
            //updateSpeed()
        }
        hero.physicsBody.velocity.y = velocity_y

        dummyPos = hero.position.x

        return false
    }

Но мой результат не совпадает с тем, что я ожидаю.

Ребята, пожалуйста, ответьте или, по крайней мере, намекните, поскольку я исчерпан этим и не могу найти правильного решения:(.

0 ответов

Другие вопросы по тегам