0

私は基本的な物理学を教えるための教育プラットフォームを構築しています。

Flash開発の経験から、私は以前に同様の問題に遭遇しました。

ゲーム時間は実際の時間と同じではありません。その場合、たとえば、コンピュータが遅れたり、何らかの理由で発射物がカバーする距離は、大きくなったり小さくなったりする可能性があります。

これは、上記のプラットフォームのスクリーンショットです。スクリーンショットに示されているように、私は基本的なs = v*tの関係を教えるためのレッスンを開発しているだけです。

s = u*tの関係を教えるためのレッスン

必要な背景

赤い線は、目標距離である69.06284mの位置を示しています。時間11.56087秒は与えられた値です。

ユーザーは速度を入力し、指定された時間内に赤い線に到達するために発射体を0mから右に移動することになっています。

緑の線は、時間切れになったときの発射体の位置を示しています。

小数点以下5桁までの正確な速度を入力しているので、この場合は人為的ミスはありません。

黄色の長方形は無視してください。これは単なるUI要素です。

画面の幅は800ピクセルであるため、10ピクセルは1メートルを表します。

問題を解決する方法

率直に言って、どうしたらよいかわかりません。しかし、誰かから、可変時間ステップは実世界の時間をよりよく表すと聞きました。しかし、物理シミュレーションエンジンであるFarseerは、固定の時間ステップで使用する必要がありますね。

アドバイスをいただければ幸いです。

編集:ここのスクリーンショットでは、発射体がカバーする実際の距離は約66.3 mですが、理論上の距離は69.1mです。また、目標距離(現在69.1 m)が小さい場合(赤い線がはるかに左に移動する場合)、誤差が小さいことにも気づきました。

発射物を発射するにはどうすればよいですか?

public override void ShootProjectile(Vector2 start, float angle, float speed) {
    GameTemplate g = Game as GameTemplate;
    Arrow a = new Arrow(Game, start, this);
    a.Initialize();
    a.Restitution = 0f;
    a.Friction = 0f;
    a.LinearVelocity = new Vector2(speed, 0);
    Console.WriteLine("Speed: "+a.LinearVelocity.X);
    _fireTime = g.SinceGameStarts;

    //Console.WriteLine("Fire time: "+_fireTime);
    _projectiles.Add(a);
}

Arrowクラスでは、基本的にCreateBodyメソッドを使用してFarseerを設定します。

protected override void CreateBody() {
    GameTemplate g = Game as GameTemplate;
    Vector2 positionInMeters = _initPos / g.MeterInPixels;
    float width = 30f / g.MeterInPixels;
    float height = 40f / g.MeterInPixels;
    _body = BodyFactory.CreateRectangle(g.GameWorld.World, width, height, 1f, positionInMeters);
    _body.BodyType = BodyType.Dynamic;
    _origin = new Vector2(15f, 40f);
}

発射体の飛行時間を計算するにはどうすればよいですか?

_fireTime=g.SinceGameStart行に興味があるかもしれません。sinceGameStartは、GameTemplateの変数_currTimeのゲッターです。_currTimeの値は、Update(gameTime)が呼び出されるたびに更新されます。したがって、発射物がどれくらい飛んでいるか知りたい場合は、次のようにします。

time = _currTime - projectile.FireTime
4

0 に答える 0