Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 17.03.2016, 20:31   #1
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Посроение юнитов как в Warcraft 2/Warcraft 3

Доброго времени суток, Булчане!

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

upd Никогда не замечал что в третьем Варике юниты строятся ещё и по типам атак - ближний, дальний, очень дальний. Столько лет играл и никогда не придавал этому значения... Пока хочу реализовать хотя бы простейшее постороение прямоугольником, без выпендрежа и всяких поисков пути, тупо по прямой поверхности. У меня появился топорный "лобовой" вариант - берём первого попавшегося из выбранных юнитов, его назначаем главным, посылаем в тыкнутую точку, попутно узнаём вектор направление движения. И относительно этого ставим других выбранных юнитов по нужной форме, форму соответственно вычисляем исходя из количества выбранных юнитов.
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a

Последний раз редактировалось St_AnGer, 17.03.2016 в 22:58.
(Offline)
 
Ответить с цитированием
Старый 17.03.2016, 23:43   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Посроение юнитов как в Warcraft 2/Warcraft 3

Тригонометрия.
Сперва вычисляешь ширину и высоту прямоугольника для построения, корень числа юнитов:
var units 5;
var 
Math.ceil(Math.sqrt(units));
var 
Maht.floor(Math.sqrt(units)); 
Далее у тебя есть текущее среднее положение юнитов, и цель куда нужно идти, по сути они есть - центры. Берешь вектор между ними - вот тебе и поворот твоего построения.
Далее немного 2д математики с векторами и будет готово.

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

Перед построением можешь сортировать список юнитов по их "приоритету", чтобы сперва были ближний бой, а потом дальний.
Если такой подход реализуешь, там уже и придумаешь с разными другими формациями и вариациями.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
impersonalis (18.03.2016), St_AnGer (18.03.2016)
Старый 18.03.2016, 13:32   #3
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Посроение юнитов как в Warcraft 2/Warcraft 3

Сообщение от moka Посмотреть сообщение
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);
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
moka (18.03.2016), St_AnGer (18.03.2016)
Старый 18.03.2016, 17:15   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Посроение юнитов как в Warcraft 2/Warcraft 3

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

h=ceil(units/w)

Аналогичную задачу решаю, когда нужно компактно (таблицей) вывести на экран заранее неизвестное количество объектов
A=floor(sqrt(N));
    B=ceil(N/A);
Микро оптимизация, но выглядит чутка лучше, согласен.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com