0

私はこのビデオ ゲームに取り組んでおり、画面を横切るたくさんのモンスターが登場します。問題は、ある時点でモンスターが領域を通り過ぎて (y 座標の上に移動し)、ずっと上に戻らなければならないことです。この転送を下から上にランダムな時間 (0、1、2、または 3 秒) 遅らせてくださいという提案を受け取りました。今のところ、途切れることなくひたすら上に登っていきます。私の問題は、この休憩を実装することです。以下に示すように、ループでストールするなど、さまざまな方法を試しました

            // if( monster is below 400 on y-axis
        if( sbgBackFootY[ i ] >= 400 ) {
            // random number that determines how long it will take to go to top
            int randCo = ( int ) ( Math.random() * 3 );

            if( randCo == 0 ) {
                //moves monster to top
                sbgHeadX[ i ] = 200;
                sbgHeadY[ i ] = 80;
                sbgMouthX[ i ] = 206;
                sbgMouthY[ i ] = 110;
                sbgBackX[ i ] = 190;
                sbgBackY[ i ] = 95;
                sbgBackFootX[ i ] = 190;
                sbgBackFootY[ i ] = 115;
                sbgFrontFootX[ i ] = 197;
                sbgFrontFootY[ i ] = 115;
                sbgLeftEyeX[ i ] = 205;
                sbgLeftEyeY[ i ] = 90;
                sbgRightEyeX[ i ] = 215;
                sbgRightEyeY[ i ] = 90;
                sbgLeftEyebrowStartX[ i ] = 203;
                sbgLeftEyebrowStartY[ i ] = 83;
                sbgLeftEyebrowEndX[ i ] = 210;
                sbgLeftEyebrowEndY[ i ] = 90;
                sbgRightEyebrowStartX[ i ] = 220;
                sbgRightEyebrowStartY[ i ] = 83;
                sbgRightEyebrowEndX[ i ] = 215;
                sbgRightEyebrowEndY[ i ] = 90;

            }

            if( randCo == 1 ) {
                //loop is supposed to stall program 
                for( int w = 0; w <= 1000000000; w++ ){
                    SBGco[ i ]++;
                }

                if( SBGco[ i ] == 1000000000 ) {
                    //moves monster to top
                    sbgHeadX[ i ] = 200;
                    sbgHeadY[ i ] = 80;
                    sbgMouthX[ i ] = 206;
                    sbgMouthY[ i ] = 110;
                    sbgBackX[ i ] = 190;
                    sbgBackY[ i ] = 95;
                    sbgBackFootX[ i ] = 190;
                    sbgBackFootY[ i ] = 115;
                    sbgFrontFootX[ i ] = 197;
                    sbgFrontFootY[ i ] = 115;
                    sbgLeftEyeX[ i ] = 205;
                    sbgLeftEyeY[ i ] = 90;
                    sbgRightEyeX[ i ] = 215;
                    sbgRightEyeY[ i ] = 90;
                    sbgLeftEyebrowStartX[ i ] = 203;
                    sbgLeftEyebrowStartY[ i ] = 83;
                    sbgLeftEyebrowEndX[ i ] = 210;
                    sbgLeftEyebrowEndY[ i ] = 90;
                    sbgRightEyebrowStartX[ i ] = 220;
                    sbgRightEyebrowStartY[ i ] = 83;
                    sbgRightEyebrowEndX[ i ] = 215;
                    sbgRightEyebrowEndY[ i ] = 90;

                }
            }

しかし、コンピューターの計算が速すぎるため、変数 w は 1000000000 倍速になります。これを行うもう 1 つの方法は、スレッドを作成して Thread.sleep(randCo) などに移行することですが、マルチスレッドにならないようにしています。これを行う他の方法はありますか?

4

3 に答える 3

1

Thread.sleep(..) が最良の選択肢だと思います。スレッドが 1 つあり、それをスリープ状態にしたからといって、マルチスレッドを使用しているとは限りません。

于 2012-05-30T22:43:34.563 に答える
1

おそらく、スプライトのパスを事前に計算してから速度を割り当てたほうがよいでしょう。次に、「描画」ステップで、スプライトのパス、速度、および時間に基づいて位置を計算します。

于 2012-05-30T22:46:27.133 に答える
0

彼が画面から離れていた時間を記録し、画面に戻ったら元に戻してみてはいかがでしょうか。

int initTime= 0;
int elapsedTimeOffScreen = 0

if( sbgBackFootY[ i ] >= 400 ) {
if(initTime!= 0)
   initTime= DateTime.Now;
elapsedTimeOfScreen  = DateTime.Now - initTime;

if(elapsedTimeOffscreen > 1000)
{
  initTime = 0
  elapsedTimeOffScreen = 0;
 //go back on screen
}

initTime は、キャラクターが画面から離れている時間を時間を使用して確認するたびにリセットされます。確かに、CPU サイクルを使用するよりもはるかに信頼性が高くなります。

于 2012-05-30T22:50:36.563 に答える