-3

C ++で、ゲームメーカーの重力を再現しようとしてきましたが、これまでのところ、次のとおりです。

double script::lengthdir_y(double len,double dir){
        return -sin(dir* M_PI/180) * len;//Create equivalent GM lengthdir_y code.
}

double script::scr_findhsy(player* plr){
        if(plr->jumping==true)
        {
                int rpt, vspeed, y;//Make variables.
                rpt=(clock()-plr->LastMovingYUpdate)/(1000/30);
                //Check the current time, and take away the time when the player started jumping to find the time inbetween, then divide it by 1000/30 to find the ammount of GM steps.
                vspeed=plr->vspeed;//Players vspeed.
                y=plr->y;//players y.
                for(int i=0; i<rpt; i++)//Plus the lengthdir_y code to the vspeed, and plus the vspeed to the y the correct ammount of times.
                {
                        vspeed+=lengthdir_y(0.5, 270);
                        y+=vspeed;
                }
                return y;//return the new value.
        }
        else
                return plr->y;//If the player isnt falling, send the original Y value, because nothing needs to be updated.
}

プレーヤーの y 値は、ラグを減らすためにすべてのステップ (または C++ では 33.33 ミリ秒) で更新されるわけではないため、このスクリプトを作成して、すべてのステップではなく、必要なときに正しい Y 値を取得します。

しかし、それは決して適切に出ないようですOO

クライアントでのデバッグのテスト結果を次に示します。これらのテストでは、クライアントは適切な Y 値を送信し、サーバーはプレイヤーの Y 値と思われる値を送信します。

テスト 1
- サーバー: 384
- クライアント: 384
- 説明: 完全に静止して、完全に動作します。
テスト 2
- サーバー: 373
- クライアント: 349.50
- 説明: 完全に静止して、完全に動作します。
テスト 3
- サーバー: 318
- クライアント: 279.50
- 説明: 完全に静止して、完全に動作します。

したがって、プレーヤーがジャンプすると、Y が小さくなるため、値が減少することを意味します。これは、クライアントとサーバーの両方で機能し、値がかなりずれています。プレイヤーが重力のために落下し始めた後、サーバーはプレイヤーが地面にぶつかって値が更新されるまで「318」を読み取り続けます。

4

1 に答える 1

1

整数除算が原因である可能性があります。

1000/3033このサンプルでは、​​ notと等しくなり33.333ます。

に変更する必要があります

1000.0/30.0

さらに、結果を に保存します。intおそらく型rptである必要がありdoubleます。

認めます、私はここでストローをつかんでいます。

于 2012-07-26T12:55:53.690 に答える