私は基本的な物理学を教えるための教育プラットフォームを構築しています。
Flash開発の経験から、私は以前に同様の問題に遭遇しました。
ゲーム時間は実際の時間と同じではありません。その場合、たとえば、コンピュータが遅れたり、何らかの理由で発射物がカバーする距離は、大きくなったり小さくなったりする可能性があります。
これは、上記のプラットフォームのスクリーンショットです。スクリーンショットに示されているように、私は基本的なs = v*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