1

現在、COD4でマップのスクリプトを開発しています。問題はこの状況のアルゴリズムにあるので、言語は非常に単純なので、これを言語に依存しないものとしてタグ付けしていると思います。

幅960戸の部屋があります。そしてその中には真ん中にオブジェクトがあり、それを軸として数えます。ボールは、打たれるたびにランダムな位置に移動することになっていますが、壁を超えて移動することはできません。これが図です:

画像

ゲームのAPIは、私が知る限り、オブジェクトの相対的な位置の移動のみを許可しているので、私が思いついたコードを次に示します。問題は、head_move()を2回呼び出した後、予期しない結果が発生し始め、これが私の頭をクラッシュさせることです。誰かが私を助けてくれますか?

motionThink():

while (1)
{
    self waittill ("trigger", player); //Wait till player hits the object       
    head_origin thread head_move();

}



head_move()
{
    /* level.prevx is a global variable which I use to store
    the distance traveled in the previous shot. Defaults to 0 */

    /*This works in the first and second hit, but then it begins to show
    incorrect max and min values*/

    x_min = (0-480) + level.prevx;
    x_max = x_min + 960;

    x_units =  RandomIntRange( x_min, x_max ); //Create a random integrer

    log2screen("MIN: " + x_min + " and MAX: " + x_max + " and MOVED " + x_units);
    log2screen("Moved " + x_units);

    //Movement function, first parameter is the distance to be traveled, and the second one is the speed
    self movex (x_units , level.movespeed); 

    level.prevx = x_units;

}

編集: 明確にするために。ユーザーがボールを撃つと、その位置が特定の値に変わります。ここで、彼がもう一度ヒットした場合、ランダムintジェネレーターの最小値と最大値を変更して、ボールが壁の外に移動しないようにする必要があります。例:

  1. レベルが始まります。ボールは部屋の真ん中にあります。最小範囲と最大範囲はそれぞれ-480と480です
  2. ユーザーがボールを打ち、そのボールが-200ユニット(左に200ユニット)移動しました。
  3. これで、最小範囲と最大範囲は-280と680になります。

これが十分に明確であることを願っています。

編集2: FlipScriptが提案したようにサインを編集しました。log2screen関数からの出力は、実際に何が起こっているかです。

  1. 最小:-480および最大480。移動67
  2. 最小:-413および最大547。移動236
  3. 最小:-244および最大716。移動461

単なるサンプルケース。何かが逆行していると私は信じています。これらは正しい計算ではありません。

4

3 に答える 3

2

コードが機能するのは、self.prevxに開始位置からの変位、つまり絶対位置が含まれている場合のみです。ただし、保存しているのは、現在の位置からの変位です。その変位はたまたまあなたの絶対位置と同じであるため、最初の2回は機能しますが、もう一度移動すると、現在地をすべて追跡できなくなります。

代わりにすべきことは、最小値と最大値を取り除き、範囲内のランダムな絶対位置を計算することから始めます。次に、以前に保存した絶対位置を使用して、そこに到達するために必要な相対移動を計算し、新しい絶対位置を保存します。

head_move()
{    
    new_x = RandomIntRange( -480, 480 ); //create a random location

    delta_x = new_x - level.prev;  //determine relative movement needed to get there

    self movex (delta_x , level.movespeed); //move to new position

    level.prevx = new_x;  //store new position
}
于 2011-01-06T14:52:34.977 に答える
1

プログラミング環境についてはよくわかりませんが、この行は

    head_origin thread head_move();

トラブルの疑いがあります。これらのトークンは何ですか?スレッドがデータ構造を複製し、ローカル変数を誤ってスローしている可能性があると言っていることは何でもあります。

そして、なぜx_minとx_maxが変わるのですか?y_minとy_maxはどこにありますか?

于 2011-01-06T06:03:00.380 に答える
0

ここのこの行では、何かが正しく表示されません。

x_max = x_min - 960;

MAXは本当にMINMINUS960ですか?あなたの説明から、それは「+」記号でなければならないように聞こえます。

編集:

あなたの追加のコメントでは、マイナス記号はこれらの真実を許可しません:

  1. レベルが始まります....最小範囲と最大範囲はそれぞれ-480と480です
  2. ..。
  3. これで、最小範囲と最大範囲は-280と680になります。

コメント1と3は、その記号が「+」記号である必要があることを示しています。

于 2011-01-06T06:14:07.477 に答える