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

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

Ответ
 
SoTNik

offline
Опыт: 69
Активность:
Странный вопрос!
Всем привет, недавно изучил жасс и уже проблемы...

Функция zSushstvo_AllVariation_num() работает так, он проверает если в четырёх точках
'ncop' и если есть то ведем счет с помощью глобалки udg_Tint=integer, когда udg_Tint==4,
то функция сработала верно(у нас получился большой квадрат) потом вычеслям середину квадрата
у меня там 4 вариаций для получения с одной точки квадрата, если один квадрат найден дальше можно не искать,
а если кв. не найден тоесть udg_Tint <=4 то переходим к следующей вариации!

Так вот 1 вариация работает норм, а остальные неработают или работают, но не так как надо я вобще хз почему :(

помогите, я уже второй день немогу правильно вычислить квадраты...



» Нубский код


Объеснять словами долго лучше один раз увидеть, меня друг поросил зделать ему такую функцию, а я не как не могу...



Если вы видели схему то на каждый зеленый квадрат, надо всегда вызывать это функцию
Код:
function Filter_Func takes nothing returns boolean
    return ( GetUnitTypeId(GetFilterUnit()) == 'ncop' ) and ( GetUnitUserData(GetFilterUnit()) == 1 )
endfunction

function PickEvriUnitInRangeMYfunc takes nothing returns nothing
    set udg_Tint = udg_Tint + 1
endfunction

function Scan4FreeSlots takes location p1  returns nothing
     local group gr
     set gr = GetUnitsInRangeOfLocMatching(50.00, p1, Condition(function Filter_Func))
     call ForGroup( gr, function PickEvriUnitInRangeMYfunc )
     call DestroyGroup(gr)
     set gr = null
endfunction

function zSushstvo_AllVariation_num takes nothing returns nothing
    local location p1= GetUnitLoc(udg_Tunit)
    local location p2= null
    local real x = 0
    local real y = 0
    local real z = 0
    local real array xA
    local real array yA
    local integer i = 1
    local integer i2 = 1
    local integer end = 12
    set udg_Tint = 0
    set udg_TG2 = CreateGroup()
    call Scan4FreeSlots(p1)
    //variation one
    set xA[1] = ( GetLocationX(p1) - 120.00 )
    set yA[1] = GetLocationY(p1)
    set xA[2] = GetLocationX(p1)
    set yA[2] = ( GetLocationY(p1) - 120.00 )
    set p2 = Location(xA[2],yA[2])
    set xA[3] = ( GetLocationX(p2) - 120.00 )
    set yA[3] = GetLocationY(p2)
    call RemoveLocation(p2)
    //variation two
    set xA[4] = ( GetLocationX(p1) + 120.00 )
    set yA[4] = GetLocationY(p1)
    set xA[5] = GetLocationX(p1)
    set yA[5] = ( GetLocationY(p1) - 120.00 )
    set p2 = Location(xA[5],yA[5])
    set xA[6] = ( GetLocationX(p2) + 120.00 )
    set yA[6] = GetLocationY(p2)
    call RemoveLocation(p2)
    //variation three
    set xA[7] = ( GetLocationX(p1) + 120.00 )
    set yA[7] = GetLocationY(p1)
    set xA[8] = GetLocationX(p1)
    set yA[8] = ( GetLocationY(p1) + 120.00 )
    set p2 = Location(xA[8],yA[8])
    set xA[9] = ( GetLocationX(p2) + 120.00 )
    set yA[9] = GetLocationY(p2)
    call RemoveLocation(p2)
    //variation Foo
    set xA[10] = ( GetLocationX(p1) - 120.00 )
    set yA[10] = GetLocationY(p1)
    set xA[11] = GetLocationX(p1)
    set yA[11] = ( GetLocationY(p1) + 120.00 )
    set p2 = Location(xA[11],yA[11])
    set xA[12] = ( GetLocationX(p2) - 120.00 )
    set yA[12] = GetLocationY(p2)
    call RemoveLocation(p2)
    set x = 0
    set udg_Tint = 0
   // Цикл пробегаем по всем локальным переменным
        loop
            exitwhen i > 12
            set p2 = Location(xA[i],yA[i])
            call Scan4FreeSlots(p2)
            call RemoveLocation(p2)
                  if x==3 then
                    set x = 0 
                      if udg_Tint >= 3 then
                        set p2 = Location(xA[i],yA[i])
                        set i = 15
                        set udg_Tint = 4
                        exitwhen i > 12
                      else
                        set udg_Tint = 0
                      endif
                 endif
             set x = x+1
             set i = i+1
        endloop
    // Вычесление центра квадрата я не понел почему надо делить именно на 2.78 но это работает :)
    set z = DistanceBetweenPoints(p1,p2)
    set z = ( z / 2.78 )
    set x = ( GetLocationX(p1) - z )
    set y = ( GetLocationY(p1) - z )
    set udg_BattleGiantMovingPOint = Location(x,y)
    call RemoveLocation(p1)
    call RemoveLocation(p2)
    set p1 = null
    set p2 = null
endfunction

По возможности код можно оптимизировать я очень буду вам блогодарен.


Можете не спрашивать за чем мне это, вобщем длинная история...

Отредактировано SoTNik, 14.02.2009 в 08:54.
Старый 14.02.2009, 08:21
Slow_Everest
Project Diamond
offline
Опыт: 2,899
Активность:
Кстати мне кажется лучше локалки использовать вместо глобалок...
Старый 14.02.2009, 10:26
V1ctor1ous

offline
Опыт: 23,781
Активность:
Цитата:
Вычесление центра квадрата я не понел почему надо делить именно на 2.78 но это работает :)

Прошу прощения за оффтоп,это число - Число Непера,вобще на нем держится мир.
Старый 14.02.2009, 10:30
Ответ

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

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

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

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



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