1

わかりましたので、フロートに関するチュートリアルに従って、フレームあたり 1 ピクセル未満の速度でスプライトを移動させました。とても簡単。今、私は次の割り当てを取得します。

新しい戦車の位置の計算に重力の影響を追加して、毎回上部に跳ね返るのではなく、自動的に下降するようにします。

この重力をどうやって作るのですか?x と y に加算する方法だけを学びました... フレームごとに y の値を単純に加算しても、もちろんうまく機能しません。実際には重力ではありません。ここで何をすることが期待されているのか、よくわかりません。

短いチュートリアルのアイデアを得るには、ここにリンクがあります。それは簡単です。 http://www.devmaster.net/articles/intro-to-c++-with-game-dev/part6.php

これは、タンクを 4 方向に動かし、下降時に見えないようにするための私の悪いコードです。チュートリアルのためにフロートを追加しました。

 Sprite theSprite( new Surface("assets/ctankbase.tga"), 16 );


        float SpriteX = 50;
    float SpriteY = 0;    //the sprite starts at the top of the screen (2D coords system)
    float screenBottom = 400; //I'm assuming your screen is 200 pixels high, change to your size
    float speedY = 0.01; //the initial speed of the sprite
    float accelY = 0.01;  //the change in speed with each tick
    bool  Bottom = false;

    void Game::Tick( float a_DT )
    {
        m_Screen->Clear( 0 );

        theSprite.Draw(SpriteX, SpriteY, m_Screen ); // Draws sprite


        if(SpriteY >= screenBottom) //when we hit bottom we change the direction of speed and slow it
        {
            speedY = -speedY/2;
            Bottom = true;
        }

        if(Bottom == false)
        {
        SpriteY += speedY;
        }

        speedY += accelY;

    }

では、遅延の少ないコードで、この戦車を「重力」で画面上で跳ね返らせるにはどうすればよいでしょうか? ありがとう。これがばかげた質問であれば申し訳ありませんが、私はそれを見ていません。

4

3 に答える 3

2

ある種の「重力」(下向きの加速度とも呼ばれる)が必要なときに私が通常行うことは、positionspeedおよびacceleration変数を定義することです。に追加speedする各ティック 、そうすればposition、スプライトはティックごとに特定の方向に移動します。今度はspeed、動きの方向が徐々に変化するように も変更する必要があります。ここで、すべてのティックaccelerationに追加します。speed

擬似コードは次のようになります。

var posy = 50;
var speedy = 5;
var accely = -0.5;
tick() {
    posy += speedy;
    speedy += accely;
}

このようにして、速度は最終的に負になり、スプライトが上ではなく下に移動し始めます。

注:私の値は任意です。本当に必要な効果を得るには、値をいじる必要があります

Y簡単にするために、ボールが軸上でのみ動くと仮定しています。X自分で軸モーションを追加する必要があります。

float SpriteX = 50;
float SpriteY = 100;    //the sprite starts at the top of the screen (2D coords system)
float screenBottom = 200; //I'm assuming your screen is 200 pixels high, change to your size
float speedY = 0.23; //the initial speed of the sprite
float accelY = 0.02;  //the change in speed with each tick

void Game::Tick( float a_DT )
{
    m_Screen->Clear( 0 );

    theSprite.Draw(SpriteX, SpriteY, m_Screen ); // Draws sprite


    if(SpriteY >= screenBottom) //when we hit bottom we change the direction of speed and slow it
    {
        speedY = -speedY/2;
    }
    SpriteY += speedY;
    speedY += accelY;
}

このコードはまったくテストされていないため、実際に機能させるには、いじる必要があるかもしれません。また、値は任意ですが、ロジックは同じままです。バウンスに直接関係のないものはすべて削除しようとしましたが、それがどのように機能するか教えてください.

これが役に立ったことを願っています。

于 2011-10-09T10:10:30.510 に答える
0

スプライトの現在の速度を追跡する必要があります。

各反復で、速度に定数を追加する必要があります(この定数は加速度です)。次に、現在の速度に従って移動したかのようにスプライトを描画します。つまり、現在の位置に速度を追加します。もちろん、見栄えの良い結果を得るには、速度と加速度を2次元ベクトルにする必要があります。

地球上では、重力は地球に9.81 m/(sec^2)向けられた値を持つ加速度です。つまり、毎秒、オブジェクトの速度が9.81 m/s地球の方向に向かって増加します。

于 2011-10-09T10:17:33.810 に答える
0

その単純な物理学。

位置と速度には変数が必要です。速度は時間とともに線形に増加するため、フレームごとに定数を追加するだけです。次に、位置に速度を追加すると、正しい重力動作が得られます。

于 2011-10-09T10:10:15.917 に答える