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

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

Закрытая тема
 
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Алгоритм для цепной молнии
Я целый час сидел и парился с созданием цепной молнии на jass...чуть клаву ап стол не разбил Помогите мне, кто-нибудь!
Что дано:
Код:
function EnemyFilter takes nothing returns boolean
    if GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE) <= 0 then
        return false
    endif
    if GetOwningPlayer(GetFilterUnit()) == Player(8) then
        return true
    endif
    if GetOwningPlayer(GetFilterUnit()) == Player(9) then
        return true
    endif
    if GetOwningPlayer(GetFilterUnit()) == Player(10) then
        return true
    endif
    if GetOwningPlayer(GetFilterUnit()) == Player(11) then
        return true
    endif
    return false
endfunction

function ChainLightning takes unit u returns nothing
    local unit array d //сюда нужно по-очереди запихнуть все цели для цепной молнии, начиная с 1 и заканчивая 6-ю (бьет по 6 врагам)
    local filterfunc ff = Filter(function EnemyFilter) //фильтр для юнитов, которые должны попасть в массив
    local real range = 600 //дистанция, на которой действует цепная молния (считается от позиции прошлой цели)
    set d[1] = u//первая цель известна
    endfunction

Условия:
  • Нужно занести в массив d до 6-и юнитов (это максимум)
  • Юниты в массиве не должны повторяться
  • Юнит заносится в массив, если он на расстоянии 600 от прошлой цели (если это d[3], значит он должен быть на расстоянии не больше 600 от юнита d[2]) + удовлетворяет условию фильтра
  • Если в массиве меньше 6-и юнитов, а поблизости нету никого, удовлетворяющего условиям, значит нужно остановить проверку, т.е. чтобы молния потом била только врагов на расстоянии 600 друг от друга...а не больше
В принципе это все, мне нужен только алгоритм, который занесет юнитов в массив, саму молнию я сделаю сам!
Старый 24.08.2007, 17:54
J
expert
offline
Опыт: 48,447
Активность:
обычно выкладывая задачи у меня всегда есть ответ который находится в админ теге в первом посте... у тебя есть ответ?:):
ладно.. ща сделаю...
Старый 24.08.2007, 17:56
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Jon, если бы я знал ответ, я бы не стал выкладывать здесь эту задачу, я бы это давно уже реализовал, но как видишь, а не знаю, поэтому прошу кого-нибудь мне помочь...Сначала сидел и парился над созданием forkedlightning, но ее я сделан без особых усилий, а вот эта оказалась сложнее

А я пока пошел делать триггерные волну силы, ледяную звезду, ледяное дыхание, громовую поступь и напоследок огненный дождь...всего-то...разплюнуть

Отредактировано Alex_Hell, 24.08.2007 в 18:06.
Старый 24.08.2007, 17:59
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Alex_Hell
Если есть возможность делать спелл в РО, зачем писать его на джаззе? Только если для тренировки...
Старый 24.08.2007, 20:21
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
он хочет сделать например цепную молнию, которая станит о_О или че-нить с эффектами и не хочет юзать механизм детекта целей цепной молнии
Старый 25.08.2007, 00:57
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Цитата:
Сообщение от DFlyer
Alex_Hell
Если есть возможность делать спелл в РО, зачем писать его на джаззе? Только если для тренировки...

А ты попробуй сделать спелл в РО так, чтобы у него был тип атаки не "заклинание", а "обычный" или "дальный бой"...
+ если применяется спелл, его цель повреждается по-полной, зависит только от сопротивляемости магии данной цели...а если у цели 90% уменьшение урона (несколько сотен брони)...спелл его так и будет повреждать на 100%, а не на 10%, как обычные воины!

Отредактировано Alex_Hell, 26.08.2007 в 12:33.
Старый 25.08.2007, 12:20
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Что, никто так и не смог алгоритм написать?
Старый 25.08.2007, 17:43
J
expert
offline
Опыт: 48,447
Активность:
Alex_Hell чет я так и не начинал... вообщем тебе нужн аналог цепной молии? или тебе нужен алгоритм который выбирает по очереди ближайших юнитов без повторения?
Старый 25.08.2007, 18:07
Void

offline
Опыт: 1,632
Активность:
Я тоже пытался сделать цепь молнии триггерно. Alex Hell по моему ты усложняеш себе задачу.
Старый 25.08.2007, 18:14
J
expert
offline
Опыт: 48,447
Активность:
Void тригерно ее не зделать, на джазе можно, достаточно посидеть 10 минут... Alex_Hell ты только уточни что тееб надо...
Старый 25.08.2007, 18:35
dk

offline
Опыт: 60,293
Активность:
Имхо:
Цитата:
алгоритм который выбирает по очереди ближайших юнитов без повторения

А из него уже сам че хочет то и склепает...
Старый 26.08.2007, 05:56
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Jon, мне нужен именно алгоритм, а цепную молнию я из него сделаю сам!

Alex_Hell добавил:
Void, читай:
Цитата:
Сообщение от Alex_Hell
А ты попробуй сделать спелл в РО так, чтобы у него был тип атаки не "заклинание", а "обычный" или "дальный бой"...
+ если применяется спелл, его цель повреждается по-полной, зависит только от сопротивляемости магии данной цели...а если у цели 90% уменьшение урона (несколько сотен брони)...спелл его так и будет повреждать на 100%, а не на 10%, как обычные воины!
Старый 26.08.2007, 12:32
J
expert
offline
Опыт: 48,447
Активность:
Alex_Hell цепную молнию сделать сложенее чем алгоритм, ну ладно.. сделаю алгоритм, ща пока не за своим компом... чуть поже...
Старый 26.08.2007, 14:34
J
expert
offline
Опыт: 48,447
Активность:
.

вообщем как я нихотел и не заставлял сделать себя только алгоритм, я всеже сделал всю молнию... т.к. почемуто думал что ты не сможеш из алгоритма зделать ее
вообщем вот код:



Код:
function EnemyFilter takes nothing returns boolean
    return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0
endfunction

function DistanceBetweenCord takes real AX, real AY, real BX, real BY returns real
    local real dx = BX - AX
    local real dy = BY - AY
    return SquareRoot(dx * dx + dy * dy)
endfunction

function ChainLightning_CreateLightning_Timer takes nothing returns nothing       
    local timer Timer = GetExpiredTimer()
    local unit Unit1 = I2U(GetStoredInteger (udg_cache, I2S(H2I(Timer)), "Unit1"))
    local unit Unit2 = I2U(GetStoredInteger (udg_cache, I2S(H2I(Timer)), "Unit2")) 
    local integer Time = GetStoredInteger (udg_cache, I2S(H2I(Timer)), "Time")   
    local real StartTime = I2R(GetStoredInteger (udg_cache, I2S(H2I(Timer)), "StartTime"))
    local lightning L = I2Li(GetStoredInteger (udg_cache, I2S(H2I(Timer)), "Lightning"))
    if Time > 0 then
        call MoveLightningEx  (L, true, GetUnitX(Unit1), GetUnitY(Unit1), GetUnitFlyHeight(Unit1)+30, GetUnitX(Unit2), GetUnitY(Unit2), GetUnitFlyHeight(Unit2)+30)
        call SetLightningColor(L, 1, 1, 1, I2R(Time)/StartTime)
        call StoreInteger (udg_cache, I2S(H2I(Timer)), "Time", Time-1)
    else        
        call DestroyLightning(L)
        call FlushStoredMission(udg_cache, I2S(H2I(Timer)))
        call DestroyTimer(Timer)
    endif
endfunction

function ChainLightning_CreateLightning takes unit Caster, unit Unit1, unit Unit2, string CodeName, real time returns nothing
    local timer Timer = CreateTimer()
    local lightning L = AddLightningEx(CodeName, true, GetUnitX(Unit1), GetUnitY(Unit1), GetUnitFlyHeight(Unit1)+30, GetUnitX(Unit2), GetUnitY(Unit2), GetUnitFlyHeight(Unit2)+30)
    call TimerStart(Timer, 0.02, true, function ChainLightning_CreateLightning_Timer)
    call StoreInteger (udg_cache, I2S(H2I(Timer)), "Unit1"    , H2I(Unit1  ))
    call StoreInteger (udg_cache, I2S(H2I(Timer)), "Unit2"    , H2I(Unit2  )) 
    call StoreInteger (udg_cache, I2S(H2I(Timer)), "Lightning", H2I(L      )) 
    call StoreInteger (udg_cache, I2S(H2I(Timer)), "Time"     , R2I(time*50)) 
    call StoreInteger (udg_cache, I2S(H2I(Timer)), "StartTime", R2I(time*50))
    call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\Bolt\\BoltImpact.mdl", Unit2, "origin"))  
    call UnitDamageTargetBJ(Caster, Unit2, 300, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_LIGHTNING)
endfunction

function ChainLightning_Timer takes nothing returns nothing
    local timer Timer = GetExpiredTimer()
    local integer Index =   GetStoredInteger (udg_cache, I2S(H2I(Timer)), "Index")
    local real Len    =     GetStoredReal    (udg_cache, I2S(H2I(Timer)), "Len"  )
    local real Len2
    local unit NextUnit = null
    local unit LastUnit = I2U(GetStoredInteger (udg_cache, I2S(H2I(Timer)), "LastUnit"))
    local real X = GetUnitX(LastUnit) 
    local real Y = GetUnitY(LastUnit)
    local group gr = CreateGroup()
    local unit u
    local string CodeName = GetStoredString (udg_cache, I2S(H2I(Timer)), "CodeName")
    local filterfunc ff = Filter(function EnemyFilter)
    call GroupEnumUnitsInRange (gr, X, Y, Len, ff)
    call DestroyBoolExpr(ff)
    loop
        set u = FirstOfGroup(gr)
        exitwhen u == null
        if not GetStoredBoolean (udg_cache, "ChainLightning-"+I2S(H2I(u)), I2S(Index)) then
            set Len2 = DistanceBetweenCord(X, Y, GetUnitX(u), GetUnitY(u))
            if Len2<Len then
                set Len = Len2
                set NextUnit = u
            endif
        endif
        call GroupRemoveUnit(gr, u)
    endloop
    call DestroyGroup(gr)
    if NextUnit != null then
        call StoreBoolean(udg_cache, "ChainLightning-"+I2S(H2I(NextUnit)), I2S(Index), true)  
        call StoreInteger (udg_cache, I2S(H2I(Timer)), "LastUnit", H2I(NextUnit))                 
        call ChainLightning_CreateLightning(I2U(GetStoredInteger (udg_cache, I2S(H2I(Timer)), "Caster")), LastUnit, NextUnit, CodeName, GetStoredReal(udg_cache, I2S(H2I(Timer)), "TimeRemove"))
    else
        call FlushStoredMission(udg_cache, I2S(H2I(Timer)))
        call DestroyTimer(Timer)
    endif
endfunction

function ChainLightning takes unit Caster, unit Target, real Period, real TimeRemove, string CodeName, real Len returns nothing
    local timer Timer = CreateTimer()
    local integer Index = GetStoredInteger(udg_cache, "ChainLightning", "Index")+1
    call StoreBoolean(udg_cache, "ChainLightning-"+I2S(H2I(Caster)), I2S(Index), true)
    call StoreBoolean(udg_cache, "ChainLightning-"+I2S(H2I(Target)), I2S(Index), true)
    call ChainLightning_CreateLightning(Caster, Caster, Target, CodeName, TimeRemove)
    call TimerStart(Timer, Period, true, function ChainLightning_Timer)
    call StoreInteger (udg_cache, I2S(H2I(Timer)), "Caster"  , H2I(Caster))
    call StoreInteger (udg_cache, I2S(H2I(Timer)), "LastUnit", H2I(Target))
    call StoreReal    (udg_cache, I2S(H2I(Timer)), "Len"     , Len        ) 
    call StoreReal    (udg_cache, I2S(H2I(Timer)), "TimeRemove", TimeRemove)
    call StoreString  (udg_cache, I2S(H2I(Timer)), "CodeName", CodeName   )
    call StoreInteger (udg_cache, I2S(H2I(Timer)), "Index"   , Index      )   
    call StoreInteger(udg_cache, "ChainLightning", "Index"   , Index      )   
    set Timer = null
endfunction

и карта пример:



Jon добавил:

call ChainLightning (unit Caster, unit Target, real Period, real TimeRemove, string CodeName, real Len)


Caster, Target - понятно...
Period - через сколько времени молния перейдет на следующую жертву
TimeRemove - через сколько времени удаляется молния (удаляется она плавно с исчезовением)
CodeName - модель молнии
Len - растояние в котором молния ищит слудующую цель, цель выбирается с кротчайшим растоянием от последней жертвы




Jon добавил:
ой.. ппц.. я забыл сделать лимит молний для тригерной молнии... ну это ладно.. недеюсь сам сможеш...
Прикрепленные файлы
Тип файла: w3x ChainLightning.w3x (18.6 Кбайт, 68 просмотров )
Старый 27.08.2007, 21:28
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Ухты,Jon, сразу весь код написал...пасиб конечно, но теперь с этим нужно разбираться...ладно, щас начнем врубаться в эти стрO_oКи...правда, чета много получилось у тебя...можно было и по-короче...
Старый 28.08.2007, 11:59
J
expert
offline
Опыт: 48,447
Активность:
Alex_Hell по короче никак нельзя было...

Jon добавил:
я и так все скумповал как мог...
Старый 28.08.2007, 12:05
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Jon, ты мне конечно усложнил задачу, создав сам алгоритм...теперь нужно все это подгонять под созданную уже в моей карте структуру спеллов + разобраться в этом...также я не понимаю, зачем двигать молнию на цель, ну в принцыпе если цель быстро перемещается, чтоб молния все время была на ней...а так, это чистой воды "усложнил себе жизнь"...но все равно, Спасибо!

Alex_Hell добавил:
Так, вроде разобрался...щас добавим ограничение на кол-во целей...
Старый 28.08.2007, 12:15
J
expert
offline
Опыт: 48,447
Активность:
Alex_Hell тебе нужен дыл аналогцепной молнии - вотон...
оригенальная цепная молния привязана не к точкам а к юнитам...
оригенальная молни постепено исчезает а не сразу, потому периодический тригер всеравно бы понадобился...
вообщем молнии обсалютно индетичны.. кроме разве что периодов времени которые надо чуть чуть подправить... и кроме лимита на цели...
Старый 28.08.2007, 12:19
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Jon, лимит на цели я поставил, но вначале он как-то некорректно работал, пришлось поисследовать...вообщем все работает как надо, тока период уменьшу...тему можно клоуз!
Старый 28.08.2007, 12:46
Закрытая тема

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

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

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

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



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