Как скорость влияет на 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
}
Но мой результат не совпадает с тем, что я ожидаю.
Ребята, пожалуйста, ответьте или, по крайней мере, намекните, поскольку я исчерпан этим и не могу найти правильного решения:(.