Cocos2d iphone 速度如何影响Cocos2d花栗鼠的CCSprite?

Cocos2d iphone 速度如何影响Cocos2d花栗鼠的CCSprite?,cocos2d-iphone,velocity,cocos2d-x-3.0,ccsprite,chipmunk,Cocos2d Iphone,Velocity,Cocos2d X 3.0,Ccsprite,Chipmunk,我需要基本了解速度变化是如何工作的?i、 e.当设定一定速度时,CCSprite如何能够在特定高度跳跃 让我给你举一个我目前正在研究的例子。我正在准备一个类似flappy bird的演示,我想让我的鸟降落在垂直管道上。所以,就像,我的小鸟从一根管子跳到另一根管子:微笑:。检查我在此处放置的gif: 我正在使用Sprite Builder,我用重力=(0,-300)制作了这个演示。管道之间的距离是149。所以,当演示开始时,我的小鸟掉到平台上,在小鸟和平台发生碰撞时执行以下方法 注 距离OBST=

我需要基本了解速度变化是如何工作的?i、 e.当设定一定速度时,CCSprite如何能够在特定高度跳跃

让我给你举一个我目前正在研究的例子。我正在准备一个类似flappy bird的演示,我想让我的鸟降落在垂直管道上。所以,就像,我的小鸟从一根管子跳到另一根管子:微笑:。检查我在此处放置的gif:

我正在使用Sprite Builder,我用重力=(0,-300)制作了这个演示。管道之间的距离是149。所以,当演示开始时,我的小鸟掉到平台上,在小鸟和平台发生碰撞时执行以下方法

距离OBST=149

__球员=小鸟

dummyPos=第一根管道的起始X位置

英雄=玩家

平台=管道

这就像当我开始弹起小鸟时,它会从管道的中心正确弹起,但当它在几秒钟后继续弹起时,小鸟会移位并到达管道的左/右边缘,有时会掉到地上:张开嘴:。检查此GIF:

我观察到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)
}
在这里的更新中,我只是跟随“_播放器”,这样它就可以留在屏幕上

有人能给我正确的指导吗,我应该怎么做,因为我在这里取的值是常数,如果我想增加速度,我会增加X速度,或者可能会减少Y速度,这也会影响管道之间的距离

有没有公式可以让我计算速度,并将其精确设置为移动149距离

我在谷歌上搜索了很多,找到了一些速度方程,但无法找到它们如何应用于Cocos2d花栗鼠。有谁能告诉我,花栗鼠是如何从简单的速度(80283)和重力(0,-300)决定弹跳的高度、持续时间和距离的

这些答案将对我大有帮助。谢谢各位

***********更新-2015年8月16日*****************

我修改了我的代码,现在不用固定值,而是使用一些公式来计算速度、时间、高度和距离。这样我就可以得到我想要的完美答案

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
    }
现在将进行预解碰撞

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
    }
但我的结果与我的预期不符


伙计们,请回答或者至少提示一下,因为我已经精疲力竭,找不到任何合适的解决方案:(.

我正在使用“v0=x/t-½at”,并在1.8667秒内获得速度(80279)和距离148.8。但结果保持不变,距离连续减小(现在,让我们删除X速度并在更新方法中使用80的滚动速度。因此,每个帧X将更新80像素*增量时间。但结果仍然保持不变。有时,距离为147.454556…有时,距离为149.0023045.:(我使用“v0=X/t-½at”并获得速度(80279)在1.8667秒内,距离为148.8。但结果保持不变,连续距离减小。:(现在,让我们删除X速度并在更新方法中使用80的滚动速度。因此,每个帧X将更新80像素*增量时间。但结果仍然保持不变。有时,距离为147.45456…有时,距离为149.0023045.:(
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
    }
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
    }