Алгоритм движения для игры - PullRequest
1 голос
/ 06 января 2011

Я сейчас разрабатываю скрипт для карты в COD4.Я думаю, что язык настолько прост, что я помечаю его как независимый от языка, поскольку проблема заключается в алгоритме для этой ситуации.

Существует комната, ширина которой составляет 960 единиц.И внутри него есть объект посередине, который мы будем считать осью.Мяч должен перемещаться в случайную позицию при каждом ударе, но не должен проходить дальше стен.Вот диаграмма:

image

API игры позволяет, насколько я знаю, только перемещать объекты относительно их положения, поэтому вот код, который я придумал.Проблема в том, что после второго вызова head_move () начинает давать неожиданные результаты, и это разбивает мою голову.Может ли кто-нибудь помочь мне?

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;

}

РЕДАКТИРОВАТЬ: Просто чтобы уточнить.Когда пользователь стреляет мячом, его положение меняется на определенное значение.Теперь, если он нажмет его снова, минимальные и максимальные значения генератора случайных чисел должны измениться, чтобы предотвратить перемещение шара за пределы стен.Пример:

  1. Уровень начинается.Мяч в середине комнаты.Минимальный и максимальный диапазоны составляют -480 и 480 соответственно
  2. Пользователь ударяет по мячу и его перемещенным -200 единицам (200 единиц влево).
  3. Теперь минимальный и максимальный диапазон долженбыть -280 и 680.

Надеюсь, это достаточно ясно.

РЕДАКТИРОВАТЬ 2: Отредактировал знак в соответствии с предложением FlipScript.Вот вывод функций log2screen: что на самом деле происходит:

  1. MIN: -480 и MAX 480. MOVED 67
  2. MIN: -413 и MAX 547. MOVED 236
  3. MIN: -244 и MAX 716. MOVED 461

Просто пример кейса.Я считаю, что что-то задом наперед, это неправильные вычисления.

Ответы [ 3 ]

2 голосов
/ 06 января 2011

Ваш код работает только тогда, когда self.prevx содержит ваше смещение от начальной позиции, то есть вашу абсолютную позицию.Однако то, что вы храните, это ваше смещение с вашей текущей позиции.Первые два раза это срабатывает, потому что это смещение совпадает с вашей абсолютной позицией, но как только вы снова двигаетесь, вы теряете все следы того, где вы находитесь.

Вместо этого вы должны избавиться от минимума.и max, и начнем с вычисления случайной абсолютной позиции в пределах границ.Затем используйте ранее сохраненную абсолютную позицию, чтобы рассчитать относительное движение, необходимое для того, чтобы вы там оказались, и сохраните новую абсолютную позицию.

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
}
1 голос
/ 06 января 2011

Я не очень разбираюсь в среде программирования, но эта строка

    head_origin thread head_move();

подозрительна для создания проблем.Что это за токены?Все, что говорит о потоке, может дублировать структуры данных и сбивать ваши локальные переменные.

И почему меняются x_min и x_max?Где y_min и y_max?

0 голосов
/ 06 января 2011

В этой строке что-то не так:

x_max = x_min - 960;

Действительно ли МАКС - МИНУТА МИНУС 960? Из вашего описания это звучит так, как будто это знак «+».

EDIT:

В ваших дополнительных комментариях знак минус не допустит этих истин:

  1. Уровень начинается .... Минимальный и максимальный диапазоны составляют -480 и 480 соответственно
  2. ...
  3. Теперь минимальный и максимальный диапазон должен быть -280 и 680.

Комментарии 1 и 3 указывают на то, что знак должен быть '+' знак.

...