XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Goodie

offline
Опыт: 2,825
Активность:
Распределение юнитов по радиусу
Нужно составить такую формулу. Наверняка она новичкам и мне понадобится)
Вобщем, у нас есть радиус,тип юнита, и 2 точки. Это x и y
Задав значение мы получаем круг юнитов
Функция сама найдет оптимальное значение юнитов и выдаст кружок
Не могу таки найти формулу. Никак =/ ибо в геометрии не шарю =)
Кто помогет с такой функцией, буду очень рад
Старый 31.03.2013, 02:34
ScorpioT1000
Работаем
offline
Опыт: отключен
Может быть, это не то, что надо, но попробуй ScSortedSelector - перебор юнитов по удаленности
Старый 31.03.2013, 04:25
Goodie

offline
Опыт: 2,825
Активность:
ScorpioT1000, Ноу, мне не выбор нужен =/
А нужно создать ровное кол-во объектов по радиусу
Старый 31.03.2013, 04:56
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
((код jass
function CreateUnitCircle takes player pl, integer unitid, real x, real y, real radius, integer count returns group
local integer nIndex = 0
local group grp = CreateGroup( )
local real A = 360.00 / count
loop
exitwhen nIndex > count
set bj_lastCreatedUnit = CreateUnit( pl, unitid, x + radius * Cos( ( A * nIndex ) * bj_DEGTORAD ), y + radius * Sin( ( A * nIndex ) * bj_DEGTORAD ), A * nIndex )
call GroupAddUnit( grp, bj_lastCreatedUnit )
set nIndex = nIndex + 1
endloop
set bj_groupRemoveGroupDest = grp
set grp = null
return bj_groupRemoveGroupDest
endfunction
))
Вот функция, формула круга проста 360 поделить на количество юнитов и умножить на шаг цикла, так ты находишь смещение точки, ну а координаты вычисляются так же просто
X + расстояние * Cos( угол смещения * bj_DEGTORAD ) то же самое для Y тока там Sin
вот версия с защитой от дурака
» код
((код jass
function CreateUnitCircle takes player pl, integer unitid, real x, real y, real radius, integer count returns group
local integer nIndex = 0
local real A = 360.00 / count

if unitid == 0 then проверка на отсутствие id юнита
return null
endif

set bj_groupRemoveGroupDest = CreateGroup( )

loop
exitwhen nIndex > count
set bj_lastCreatedUnit = CreateUnit( pl, unitid, x + radius * Cos( ( A * nIndex ) * bj_DEGTORAD ), y + radius * Sin( ( A * nIndex ) * bj_DEGTORAD ), A * nIndex )
if GetHandleId( bj_lastCreatedUnit ) == 0 then проверка на то что юнита с таким id не существует
call DestroyGroup( bj_groupRemoveGroupDest )
return null
endif
call GroupAddUnit( bj_groupRemoveGroupDest, bj_lastCreatedUnit )

set nIndex = nIndex + 1
endloop
return bj_groupRemoveGroupDest
endfunction
))

Отредактировано quq_CCCP, 31.03.2013 в 05:38.
Старый 31.03.2013, 05:19
Goodie

offline
Опыт: 2,825
Активность:
quq_CCCP, Дак я здесь не вижу как формулой нашлось число, так как в принимаемых аргументах есть count
Нужно функцией найти count не записывая в него ничего
Кстати:
((код jass
loop
exitwhen nIndex >= count
set bj_lastCreatedUnit = CreateUnit( pl, unitid, x + radius * Cos( ( A * nIndex ) * bj_DEGTORAD ), y + radius * Sin( ( A * nIndex ) * bj_DEGTORAD ), A * nIndex )
call GroupAddUnit( grp, bj_lastCreatedUnit )
set nIndex = nIndex + 1
endloop
))
Я же написал. У нас есть:
((код jass
void CircleUnits(int id,float radius,real x,real y){
...
}
))
Примерно такой должна быть функция
Спасибо конечно gug_CCCP за твою функцию, много чего узнал) Но еще вот осталось добавить к ней - авто нахождение count не записывая в него ничего
Goodie добавил:
Вот. Эта функция мне подходит:
((код jass
#include "cj_types.j"
group CircleUnits(player forplayer,int unitid,float radius,float x,float y){
float count = 0.0 , A =0.0
int nIndex = 0
group grp = CreateGroup( )
count = (radius/20.0) ; count = I2R(R2I(count)) ; A = 360.00 / count
do{
GroupAddUnit( grp, CreateUnit( forplayer, unitid, x + radius * Cos( ( A * nIndex ) * bj_DEGTORAD ), y + radius * Sin( ( A * nIndex ) * bj_DEGTORAD ), A * nIndex ) )
nIndex++
}whilenot(nIndex > count)
bj_groupRemoveGroupDest = grp
grp=null
return bj_groupRemoveGroupDest
}
................
private group Circled = null
void SomeFunc(){
Circled = CircleUnits(Player(6),'H000',150.00,GetUnitX(gg_unit_earc_0018),GetUnitY(gg_unit_earc_0018))
ForGroup(Circled,\
lambda void(){
DestroyEffect(AddSpecialEffect("war3mapImported\\Punishment_Missle.mdx",GetUnitX(GetEnumUn​it()),GetUnitY(GetEnumUnit())))
})
))
Вот это мне было нужно =) Формула расчета боевых едениц вроде работает правильно) Создает кружок из едениц
Goodie добавил:
Закрывайте
Старый 31.03.2013, 12:35
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 21:28.