Программирование игр для Windows. Советы профессионала

         

Случайные передвижения


Что я понимаю под случайным передвижением? Это выполнение персонажем какого-нибудь совершенно непредсказуемого действия. Нечто подобное мы уже сделали в программе из Листинга 13.2. Однако, мы можем расширить эту концепцию не только выбирая способ реагирования, но и определяя, нужна ли реакция как таковая. Почему бы нам не добавить еще один тип поведения нашей "Мухе" -  случайное передвижение.

Случайные перемещения используются во многих видеоиграх как один из способов реагирования виртуального мира на действия игрока. Такой образ Действий можно назвать "неявной логикой". Неявная логика помогает принять Рвение при отсутствии части необходимой информации, или вообще информации как таковой.

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

К примеру, когда вы сталкиваетесь с решением некоторого вопроса, такого как обход препятствия, возникшего на вашем пути, вы попытаетесь избежать встречи с ним, двигаясь направо или налево. Если все варианты равны между собой и одинаково возможны, решение, скорее, случайно и, следовательно является «неявным решением». Если бы кто-нибудь спросил вас, например почему вы решили обойти столб справа, а не слева, то вряд ли вы сумели бы внятно объяснить мотивы своего поведения. В другом случае мы можем использовать случайные переменные для выбора направления движения нашей маленькой «Мухи». Алгоритм 13.5 создает маленькую точку, которой теперь полагается летать, двигаясь в случайном направлении.

Алгоритм 13.5. Случайное передвижение.

while(идет игра)

{ ...код программы

if (перемещение точки по текущей траектории закончено) then

{

выбор новой траектории, иными словами, выбираем новый фактор преобразования координат

}

двигаем точку несколько раз по новой траектории

...код программы



}

Алгоритм 13.5 моделирует «грубый разум», который выбирает направление дальнейшего движения случайным образом. Напишем программу, которая создает одиноко летящую точку в пространстве с помощью этого алгоритма, Посмотрим, как это работает, на примере программы из Листинга 13.3.




Листинг 13.3. Одинокая муха. (DFLY.C).

// ВКЛЮЧАЕМЫЕ ФАЙЛЫ ////////////////////////////////////////

#include <stdio.h>

#include <graph.h>

#include <math.h>

// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ////////////////////////////////////////

// Указатель на системную переменную, содержащую

// значение таймера. Содержимое этой 32-битовой ячейки

// обновляется 18.2 раза в секунду

unsigned int far *clock=(unsigned int far *)0x0000046C;

//////////////////////////////////////////

void Timer(int clicks)

{

// эта функция использует значение таймера для формирования

// задержки. Необходимое время задержки задается в "тиках"

// интервалах в 1/18.2 сек. Переменная, содержащая 32-битовое

// текущее значение системного таймера расположена

// по

адресу 0000:046Ch

unsigned int now;

// получить текущее время

now = *clock;

// Ничего не делать до тех пор пока значение таймера не

// увеличится на требуемое количество "тиков".

// Примечание: один "тик" соответствует примерно 55 мсек.

while(abs(*clock - now) < clicks){}

} // конец функции Timer

// ОСНОВНАЯ ФУНКЦИЯ /////////////////////////////////////

void main(void)

{

int ex=160,ey=100; // начальная позиция "Мухи"

int curr_xv=1,curr_yv=0, // текущие факторы

// преобразования Координат.

clicks=0;             // время, через которое

// "Муха" прекращает движение

//в произвольном направлении.

_setvideomode(_MRES256COLOR) ;

printf("     The Dumb Fly - Any Key to Quit");

//главный игровой цикл

while(!kbhit())

{

// очищаем точки на экране

_setcolor(0);

_setpixel(ex,ey); // перемещение "Мухи"

// "мозговой штурм"

// закончить ли движение в текущем направлении?

if (++clicks—20)

{

curr_xv = -5 + rand()%10; // от -5 до +5

curr_yv = -5 + rand()%10; // от -5 до +5

clicks=0;

} // конец задания нового направления

// перемещаем "Муху"

ex+=curr_xv;                                           

ey+=curr_yv;

// убеждаемся, что "Муха" находится в пределах экрана

if (ex>319) ex=0; if (ех<0)   ех=319;

if (ey>199) ey=0; if (еу<0)   еу=199;

// конец "мозгового штурма"                     

// рисуем "Муху"

_setcolor(12);

_setpixel(ех,еу);

// небольшая задержка...

Timer(1);                         

} // конец

цикла while

_setvideomode(_DEFAULTMODE);

} // конец функции main

Думаю, после запуска программы вы согласитесь с тем, что мы, наконец получили все необходимое для моделирования летающего «разумного существа». Несколько простых правил, шаблоны и случайные числа помогли нам создать довольно правдоподобную имитацию полета насекомого. Это просто чудесно! Теперь настало время поговорить о конечных автоматах.  


Содержание раздела