0

卓球ゲームを作っています。そして、パドルへの衝撃に基づいてボールの方向を制御する機能を作成したいと思います。ボールがvy=4で下がっている場合。vx = 4;

パドルはvx=-5で左に移動しています。パドルの動きの速さに応じて、ボールの進路を少し変えてほしい。衝突時にボールのvx速度が低下する可能性があるため、ボールが上に移動するときに、ボールがより真っ直ぐに(Y軸に近く)移動します。しかし、私がクレイジーな試行錯誤の旅に出る前に、誰かが答えを知っているか、おそらく何か情報源を持っているかどうかを知りたいと思っていました。

おそらくこれを行うための解決策は、パドルの速度を測定することだと思います。私の問題は、パドルがマウスによって制御されており、特定の速度がないことです。x軸上を移動するマウスの速度を測定する方法を見つけようとしています。

私はおそらく、マウスがどこにあり、どこにあるかを判断するために、数秒ごとに起動するタイマーを作成するつもりです。違いを理解し、それが速度になります

誰かが答えを持っているなら、それは素晴らしいことです。ありがとう

4

3 に答える 3

1

パドルの速度を測定する最も簡単な方法は、前のフレームのパドルの位置のキャッシュを保持することです。したがって、x-xPrevを指定すると、このフレームのパドルの動きのデルタ、つまり相対速度が得られます。

その速度から、ボールの反射ベクトルのx速度に、修飾子(おそらく縮小)として追加できます。

これは単純なゲームのように聞こえますが、フレームレートは問題になりません。ただし、参考までに、速度を追跡したい場合は、前のフレームの合計時間にアクセスすることで、簡単な物理計算を行うことができます。シミュレーションのフレームレートに関係なく、時間的に一貫した動作を可能にします。

于 2010-01-04T18:09:49.870 に答える
0

私は問題を解決するためにいくつかのことができました。私はインターネットで次のことをすることを見つけました、そして物理学はいくらか良く見えます。ボールはまだ時々パドル内に詰まっています

以下をから変更しました

xspeed = xspeed + (paddle.cspeed/10);

xspeed = xspeed + ( paddle.cspeed * .4 );
于 2010-01-04T21:12:41.953 に答える
0

K、私は解決策を見つけます。ただし、まだ衝突検出に取り組む必要があります。最大ではありません。ボールがパドルに引っかかることがある。フラッシュ オブジェクト ヒット テストを使用しています。とにかく。これは、私がやりたいことを実現するために使用したコードです。進むべき方向をサポートしているように見えますが、そうでない場合もあります。

それは機能しますが、問題は速度をマイナスに落とすことで、時々方向がずれることがあります。ボールが動く方向は、-1 または 1 によって決定されるためです。数値が想定とは逆になる可能性があります。

以下はパドルクラスです

public var cspeed:Number;
        private var timer:Timer;
        public var vx:Number = 0;
        public var vy:Number = 0;
        private var prevx:Number = 0;
        private var prevy:Number = 0;

        public function Paddle():void
        {
            timer = new Timer(60);
            timer.start();
            timer.addEventListener(TimerEvent.TIMER,checkSpeed);
        }


        private function checkSpeed(e:TimerEvent):void
        {
            if(prevx == 0)
            {
                prevx = x;
            }
            else
            {
                cspeed = x - prevx;
                prevx = 0;
            }
        }

ボール クラス内での衝突をチェックします。それはすべてを打つものだからです。以下はコードです

以下は私のボールクラスです。チェック ウォール クラスでは、壁またはパドルに当たるかどうかをチェックします。パドルの参照を ball クラスに渡しました。

private function checkWalls():void
        {

            if(y > sRef.stageHeight || y < 0)
            {
                yDir = yDir * -1;
            }
            else if ( x > sRef.stageWidth || x < 0)
            {
                xDir = xDir * -1;
            }
             //trace(dist);
            /*var dx:Number = paddle.x - x;
            var dy:Number = paddle.y - y;
            var dist:Number = Math.sqrt(dx * dx + dy * dy);*/


             if(hitTestObject(paddle))
             {
                 xspeed = (paddle.cspeed/100) + xspeed;
                 yDir = yDir * -1;
             }
            //trace(paddle.cspeed);
        }

        private function moveBall():void
        {

            x += xspeed * xDir;
            y += yspeed * yDir;
        }

私はまだたくさんのトゥインクが必要です。しかし、私がそれに取り組むならば。私はそれを私がやりたいことをさせることができると思います。

于 2010-01-04T18:57:17.857 に答える