forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Посроение юнитов как в Warcraft 2/Warcraft 3 (http://forum.boolean.name/showthread.php?t=20230)

St_AnGer 17.03.2016 20:31

Посроение юнитов как в Warcraft 2/Warcraft 3
 
Доброго времени суток, Булчане!

Решился я на новый игровой проект спустя долгое время. Хочу запилить стратегию, а так как лучшей в мире стратегией старой школы я считаю только и только Warcraft (Старкрафт крут, но Варик больше мне по душе, другие же вообще не зацепили, разме что Age of Empires 2), то и решил пилить его.
В качестве движка выбрал Unity (хочу мультипратформу быструю, в т.ч. и мобилки, давно мечтал сделать хотя бы частично-полноценный Варик без всяких эмуляторов), открыл её для себя заново. За два вечера набросал создание и выделение персонажей, их передвижение в место "тыка". Но вот встала конкретная проблема - хочется реализовать красивые расстановки войск как в тех же Вариках, особенно хочется постигнуть как это делается в третьем Варике. Там персонажи выстраиваются определёнными фигурами (3 перса встают в линию, 4 перса квадратом, 5 - буквой П и т.д., причём всё это относительно угла под которым они шли). Может кто-нибудь подсказать теорию как это сделать? Хотя бы более простой вариант как в варкрафте 2 - там один юнит вставал ровно в тыкнутую току, а остальные выделенные вставали вокруг него.

upd Никогда не замечал что в третьем Варике юниты строятся ещё и по типам атак - ближний, дальний, очень дальний. Столько лет играл и никогда не придавал этому значения... Пока хочу реализовать хотя бы простейшее постороение прямоугольником, без выпендрежа и всяких поисков пути, тупо по прямой поверхности. У меня появился топорный "лобовой" вариант - берём первого попавшегося из выбранных юнитов, его назначаем главным, посылаем в тыкнутую точку, попутно узнаём вектор направление движения. И относительно этого ставим других выбранных юнитов по нужной форме, форму соответственно вычисляем исходя из количества выбранных юнитов.

moka 17.03.2016 23:43

Ответ: Посроение юнитов как в Warcraft 2/Warcraft 3
 
Тригонометрия.
Сперва вычисляешь ширину и высоту прямоугольника для построения, корень числа юнитов:
PHP код:

var units 5;
var 
Math.ceil(Math.sqrt(units));
var 
Maht.floor(Math.sqrt(units)); 

Далее у тебя есть текущее среднее положение юнитов, и цель куда нужно идти, по сути они есть - центры. Берешь вектор между ними - вот тебе и поворот твоего построения.
Далее немного 2д математики с векторами и будет готово.

Лучше всего такие вещи набрасывать на бумаге, или если оперируешь JS'ом, очень удобно на jsfiddle используя canvas2d делать такие тесты и эксперименты.

Перед построением можешь сортировать список юнитов по их "приоритету", чтобы сперва были ближний бой, а потом дальний.
Если такой подход реализуешь, там уже и придумаешь с разными другими формациями и вариациями.

impersonalis 18.03.2016 13:32

Ответ: Посроение юнитов как в Warcraft 2/Warcraft 3
 
Цитата:

Сообщение от moka (Сообщение 304863)
PHP код:

var units 5;
var 
Math.ceil(Math.sqrt(units));
var 
Maht.floor(Math.sqrt(units)); 


если результат вычисления корня не кешируется средой, то h лучше вычислить из соображений

h=ceil(units/w)

Аналогичную задачу решаю, когда нужно компактно (таблицей) вывести на экран заранее неизвестное количество объектов
Код:

A=floor(sqrt(N));
    B=ceil(N/A);


moka 18.03.2016 17:15

Ответ: Посроение юнитов как в Warcraft 2/Warcraft 3
 
Цитата:

Сообщение от impersonalis (Сообщение 304866)
если результат вычисления корня не кешируется средой, то h лучше вычислить из соображений

h=ceil(units/w)

Аналогичную задачу решаю, когда нужно компактно (таблицей) вывести на экран заранее неизвестное количество объектов
Код:

A=floor(sqrt(N));
    B=ceil(N/A);


Микро оптимизация, но выглядит чутка лучше, согласен.


Часовой пояс GMT +4, время: 10:32.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot