2016-02-29 84 views
1

我對C++/Cocos2d非常陌生,但我一直在取得相當不錯的進展。 :)Cocos2D BezierBy隨着時間的推移不斷增加的速度

我想要做的是在玩家獲得它之後,讓一個硬幣從屏幕上掉下來。我已經成功實現了兩種不同的方式,但每種方式都有其主要缺點。

目標:玩家獲得一枚硬幣後,硬幣應該「跳躍」,然後從屏幕上「跌落」。理想情況下,硬幣就好像受到重力作用一樣,因此它以一個快速的速度跳起,減速到停止,然後繼續以增加的速度向下。

嘗試至今:

void Coin::tick(float dt) { 
    velocityY += gravity * dt; 
    float newX = coin->getPositionX() + velocityX; 
    float newY = coin->getPositionY() + velocityY; 
    coin->setPosition(newX, newY); 
    // using MoveBy(dt, Vec2(newX, newY)) has same result 
    } 
    // This is run on every 'update' of the main game loop. 

這種方法,我想也正是它做的儘可能的運動,然而,幀速率變得非常不連貫,它開始幀之間「跳」,有時相當顯着的距離。

ccBezierConfig bz; 
    bz.controlPoint_1 = Vec2(0, 0); 
    bz.controlPoint_2 = Vec2(20, 50); // These are just test values. Will normally be randomized to a degree. 
    bz.endPosition = Vec2(100, -2000); 
    auto coinDrop = BezierBy::create(2, bz); 
    coin->runAction(coinDrop); 

這其中有「完美」的幀率,在沒有抖動現象任何的好處,但是,它移動在其廢墟它掉落的經驗以恆定的速率,只是使它看起來像它的隨意一起移動一些設定的路徑。 (這是,它是。)

有沒有人遇到類似的情況或知道修復?要麼更好地處理第一個的幀速率(MoveBy/To不工作 - 仍然有波濤洶涌的效果)或以編程方式設置第二個的速度(改變曲線中某些點的速度)

我的另一個想法是使用一些不同的速度不同的MoveBy動作,但是這會產生尷尬的「尖尖」曲線和速度的尷尬變化,所以不是真正的解決方案。

任何想法/幫助是/非常感謝。 :)

回答

0

是的,我遇到了類似的情況。這就是'放鬆'派上用場的地方。有許多內置的緩動功能可供您使用,例如緩入或緩出。所以,你的新的代碼看起來是這樣的:

coin->runAction(cocos2d::EaseBounceOut::create(coinDrop));

此頁面顯示幾種常見的寬鬆方法圖表: http://cocos2d-x.org/docs/programmers-guide/4/index.html

你的目的(增加速度隨着時間的推移)我會建議您嘗試了「 EaseIn'方法。