2

私はいくつかのゲームを行っており、現在、タンクの移動動作を実装しようとしているところですが、うまく実装できません。

問題は、その位置を計算し、それが (430,130) のようで、rand_floatRange 関数を使用して、0 と画面の高さ (500) の間の値を自分自身に与えることです。320 としましょう。画面から消えます。

私のデバッグプロセスにはまったくエラーはありません。それは問題なく構築され、戦車はフィールド上を移動しますが、高い値に達するのを止める制限がないため、しばらくすると画面から消えます (例: 戦車の位置は (450,100) で、画面は (600,600) です) 、そしてタンクが新しいターゲットを取得した場合(そのターゲットはその場所から( 300,200 )に到達します( 0 から 600 の値を取ります)、それは(750,300)になり、画面から消えます。

screenHeight と screenWidth の範囲で問題なく動作するように修正できるものは他にありますか。

void Tank::Wander()
{
    float randXs,randZs;
    srand(time(NULL));
    for(int i=0;i<tanks.size();i++)
    {
        randXs = rand_FloatRange(screenHeight);
        randZs = rand_FloatRange(screenHeight);
        {
            if(randXs < tanks[i]->givePosX() && randZs < tanks[i]->givePosZ() )
            {
                tanks[i]->posX= tanks[i]->givePosX() - 0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() - 0.1;
            }
            else if(randXs > tanks[i]->givePosX() && randZs < tanks[i]->givePosZ() )
            {
                tanks[i]->posX= tanks[i]->givePosX() +0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() - 0.1;
            }
            else if(randXs > tanks[i]->givePosX() && randZs > tanks[i]->givePosZ() )
            {
                tanks[i]->posX= tanks[i]->givePosX() + 0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() +0.1;
            }
            else 
            {
                tanks[i]->posX= tanks[i]->givePosX() - 0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() + 0.1;
            }
        }
    }
}  

float Tank::rand_FloatRange(float a)
{
    float c;
    c = rand() % (int) a;
    return c;
}

他に必要なものがありましたら、こちらで提供させていただきます。

4

1 に答える 1

1

私の C++ はあまり良くありませんが、ロジックに問題があることがわかります。

randXs = rand_FloatRange(screenHeight);
randZs = rand_FloatRange(screenHeight);

ところで、あなたの randXs は実際には screenWidth に対してランダムだと思いますか? そこにscreenHeightがあります(おそらく同じですか?)

とにかく、それをする代わりに、次のようなことをしてください:

randXs = rand_FloatRange(screenWidth - tanks[i]->posX);
randZs = rand_FloatRange(screenHeight - tanks[i]->posZ);

これが何をするかというと、戦車が画面の端に近づくと、範囲内に収まるようにランダム範囲が縮小されます。

これにより、画面の外にあるランダムな値を取得しないようにする必要があります! うまくいかなかったらまた報告!幸運を!


編集:

私のソリューションを振り返ってコードをもう一度見てみると、私のソリューションが正しい結果をもたらすかどうかは実際にはわかりません。ただし、画面の幅と高さを正しく処理するようにしてください。おそらくこれが問題でしたか?

また、2軸を別々に扱うこともできます。私があなたならそうします。次のように:

if(randXs < tanks[i]->givePosX())  
{
  tanks[i]->posX = tanks[i]->givePosX() - 0.1;
}
else if(randXs > tanks[i]->givePosX())
{
  tanks[i]->posX= tanks[i]->givePosX() +0.1;
}

if(randZs > tanks[i]->givePosZ() )
{
  tanks[i]->posZ= tanks[i]->givePosZ() +0.1;
}
else if (randZs < tanks[i]->givePosZ() )
{
  tanks[i]->posZ= tanks[i]->givePosZ() - 0.1;
}

ここで、else ブロックだけでなく、else の後に反対の if ステートメントを使用することが重要であることに注意してください。これが私が意味することです:

これを行います: if (...) { ... } else if (... 最初の if の反対) { ... }

ではない:

if (...)
{
...
}
else //no if here. 
{
...
}

それ以外の場合、ランダム値が自身の値と同じ場合、戦車は移動します。ランダム値が同じ場合、あなたが望むのは、(特定の方向に)静止する必要があることです。たとえば、x の値が 5 の戦車があり、x の値が 5 の場合、x には動きがないはずであり、上記のコードはこれを保証します。

あなたの場合、条件のないelseブロックがあるため、タンクが画面を離れる可能性があります(ただし、それは一瞬だけである必要があります). 私が投稿した最初の解決策は間違っていると確信していますが、混乱しないようにそのままにしておきます (私の解決策が突然変更されました!)

于 2012-06-21T22:01:32.977 に答える