M.A.X.    Вы вошли как гость
Российский Клуб игроков M.A.X.
 
[Новости]   [Новичку]   [Энциклопедия]   [Документы]   [Файлы]   [Игроки]   [Архивы]   [Архив форума]  
[Новый сайт]   [M.A.X. Gold]   [Партии]  

 
 
 
Архив форума  МаксГолд
[Основной форум] [Голосования] [МаксГолд] [Off-Topic]
 


Мне кажется это не проблема.  -  Hruks,  05.08.2004  3:59:35

Только что проделал маленький тестик:
Написал прогрмку, которая на главной форме средствами дельфи (Canvas.Ellipse) рисует окружности заполненные с параметрами: радиус от 10 до 100. Прокрутил в цикле: 300 000 раз. На это ушло 10 секунд на моём компе. То есть 3 тысячи объектов, как описано в предыдущем посте будут обрабатываться в 100 раз быстрее и составит 0,1 секнду. Учитывая тот факт, что юнит движется по клеткам и от клетки к клетке продвигается медленно - за 5 - 10 кадров анимации, то и расчитывать зону видимости можно начиная от начала движения юнита с клетки н соседнюю и до конца равномерно при этом распределяя общее количество объектов, которые учавствуют в расчётах зоны видимости.

Текст функцейки тестовой:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
I,X1,X2,Y1,Y2:Integer;
t1,t2:Double;
begin
t1 := Time();
Form1.Canvas.Brush.Color := clBlack;
Form1.Canvas.Brush.Style := bsSolid;
for I := 1 to 300000 do
begin
X1 := Random(Width);
X2 := X1+Random(90)+10;
Y1 := Random(Height);
Y2 := Y1 + X2-X1;
Form1.Canvas.Ellipse(X1,Y1,X2,Y2);
end;
t2 := Time();
caption := TimeTostr(t2-t1);
end;

Теперь представьте, что рисовать мы будем не на картинке с использованием стандартных алгоритмов и жутких функций преобразования цветов согласно палитре и так далее а используя какой-нить алгоритм заполнения окружностей прямо в массивчике видимостей.
Так как критична скорость, то не стоит жадничать и работать с битиками, всё же битовые операции не такие уж и быстрые, проще выделить сразу байтик.
По идее можно оптимизировать используя радиусы юнитов и их расстояния от тех точек, которые могут стать невидимыми, но зачем? Скорости и так хватает! В МАХе кроме этих расчётов и графического вывода на экран больше ничего в процессе не считается!
Поиск пути, расчёт ресурсов, это разовые событийные операции - их не нужно выполнять на каждом кадре анимации.

У меня также вопрос связанный с зоной видимости и атаки: Планируется ли приоритетность при стрельбе по целям в том случае если юнит попадает в зону обстрела несколькими юнитами? И если планируется то как? Кто первый построился (в списке программы), кто дальше стреляет, кто сильнее стреляет и так далее...
Я вот задавался таким вопросом. В оригинальной игре видимо приоритеты бестолковые и кто в списке первый тот и стреляет. Возможно лучшее решение было бы выбрать тот ствол, который сможет убить единицу при этом если несколько то выбрать тот, кто слабее по удару и дальности. Если юнит не будет добит с одного удара, то выбирать самый толстый ствол и стрелять один раз, потом расчёты повторить, чтобы не тратить второй толстый выстрел (если такой есть) на добивание полудохлого.
Есть и другой вариант: приоритет сделать согласно покрытию базы. То есть если эта пушка сделает последний выстрел и эта часть будет непробиваемая для любых, то стоит пострелять с дельней части базы другими стволами в расчёте на то, что эта пушка нам ещё может пригодиться - противник специально подставляет юниты чтобы оголить фланг или часть базы.
Было бы отлично если бы эти приоритеты были настраиваемые прямо в процессе игры. В идеале: ракетомёт №3 - большой приоритет по юнитам с большой бронёй если в зоне обзора есть таковые но они не под огнём, малый приоритет по лёгким юнитам. Вот эта зенитка - приоритет по истребителям - других не бить ни под каким предлогом. Другая зенитка - бить бомберы и если в зоне видимости нет других то по всем другим. Третья - стрелять по приоритетам покрытия базы И так далее. Но это в идеале. Можно и проще.