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

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

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

offline
Опыт: 2,633
Активность:
Цитата:
Сообщение от AlexKARASb
LostCoastпод столом быть не надо, дельнее обьяснить человеку чем насмешки писать
для этого и создавал эту тему



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

LostCoast добавил:
Вот тебе пример на хеше:


» раскрыть
Код:
function testTimer takes nothing returns nothing
local timer lMove=GetExpiredTimer()
local integer i = GetHandleId(lMove)
local real XX = LoadReal(udg_Table,i,0)
local real YY = LoadReal(udg_Table,i,1)
local unit Dummy = LoadUnitHandle(udg_Table,i,2)
local real Angle = LoadReal(udg_Table,i,3)
call SetUnitX(Dummy,XX+30*Cos(Angle))
call SetUnitY(Dummy,YY+30*Sin(Angle))
call SaveReal(udg_Table,i,0,XX)
call SaveReal(udg_Table,i,1,YY)
endfunction

function testAction takes nothing returns nothing
local unit Caster=GetTriggerUnit()
local real XX=SafeX(GetUnitX(Caster))
local real YY=SafeY(GetUnitY(Caster))
local location CastLoc=GetSpellTargetLoc()
local real XL=GetLocationX(CastLoc)
local real YL=GetLocationY(CastLoc)
local real Angle=Atan2(YL-YY,XL-XX)
local timer Move=CreateTimer()
local integer i = GetHandleId(Move)
local unit Dummy=CreateUnit(GetOwningPlayer(Caster),'h005',XX,YY,lAngle*bj_RADTODEG)
call RemoveLocation(lCastLoc)
call SetUnitFacing(Bolt,Angle*bj_RADTODEG)
call SetUnitPathing(Bolt,false)
call SaveReal(udg_Table,i,0,XX)
call SaveReal(udg_Table,i,1,YY)
call SaveUnitHandle(udg_Table,i,2,Dummy)
call SaveReal(udg_Table,i,3,Angle)
call TimerStart(Move,.025,true,function testTimer)
endfunction


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

LostCoast добавил:
Чуть не забыл, если нужно обьяснение udg_Table - это глобалка хеш-таблица,которую ты должен иниц. при старте игры
Старый 15.01.2010, 14:51
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
за пример большое спасибо, так разобраться гораздо легче
local real XX = загружаем значение из действия
только 1 вопрос: называть одинаковыми локалками можно(XX и XX)?
Старый 15.01.2010, 15:01
FaB0SS

offline
Опыт: 2,504
Активность:
  1. не из действия, а из хеш таблицы
  2. Если в пределах одной ф-ции, то нет. А если в разных функциях, то неважно как ты их назовешь, так как функция видит только свои локалки
Старый 15.01.2010, 15:08
LostCoast

offline
Опыт: 2,633
Активность:
AlexKARASb, дам совет, скилы из опен доты очень сильно сбалансированы и там много лишних строк, можно делать гораздо проще, да кстате не забывай удалять записи из хеш-таблицы, точно не помню как назыв ф-ия вроде FlushChildHashtable(udg_Table,GetHandleId(timer)
Советую почитать : http://xgm.guru/forum/showthread.php?t=30742
Старый 15.01.2010, 15:18
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
LostCoast, знаю но для моей динамической карты, основанной исключительно на способностях героев баланс и многократное использование их за малый промежуток времени ой как нужны

вот парочка вопросов: 1)почему в коде фрога не было обнуления переменных; или это потому что они обнуляются, когда очистишь таблицу?
2)SetUnitPathing - обьясните что такое пасинг?
статью сейчас прочту повнимательнее, химикс уже кидал, но читал я не внимательно =\
Старый 15.01.2010, 15:29
XOR

offline
Опыт: 38,159
Активность:
1."внешние"(не из хэша) надо чистить отдельно
структуры рулят
  1. Т.е. Юнит сможет проходить через юниты, декор и т.п.
Старый 15.01.2010, 15:34
LostCoast

offline
Опыт: 2,633
Активность:
Цитата:
Сообщение от XiMiKs
структуры рулят

для тех кто vjass знает)))
Старый 15.01.2010, 15:45
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
с условным оператором пару вопросов
мне надо if растояние от точки каста до дамми больше 3000 then call kill unit, flushhash else ??

if DistanceBetweenPoints (CastLoc, GetUnitLoc(Dummy)) > 3000
then
call KillUnit(Dummy)
call FlushChildHashtable(udg_Hash, GetHandleId(Move))
else endif

правильно ли? кажется что нет =\
Старый 15.01.2010, 16:25
FaB0SS

offline
Опыт: 2,504
Активность:
можно без else
Старый 15.01.2010, 16:28
LostCoast

offline
Опыт: 2,633
Активность:
AlexKARASb, так начнём с того что тебе придётся сохранить изначальное положение дамми,а так в принципе правильно, да надо будет ещё таймер уничтожать
call PauseTimer(timer)
call DestroyTimer(timer)
set t = null(для оптимизации)
Старый 15.01.2010, 16:32
XOR

offline
Опыт: 38,159
Активность:
И локацию.(RemoveLocation) И вообще не надо их использовать, все функции кроме GetLocationZ есть и на координатах. А переделать DistanceBetweenPoints и т.д. 2 секунды и выгода в скорости
Старый 15.01.2010, 16:48
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
function Trig_JTKaton_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A001'
endfunction

function JTKTimerMove takes nothing returns nothing
    local timer Move=GetExpiredTimer()
    local integer i = GetHandleId(Move)
    local real XX = LoadReal(udg_Hash,i,0)
    local real YY = LoadReal(udg_Hash,i,1)
    local unit Dummy = LoadUnitHandle(udg_Hash,i,2)
    local real Angle = LoadReal(udg_Hash,i,3)
    local location CastLoc=LoadReal(udg_Hash,i,4)
    call SetUnitX(Dummy,XX+30*Cos(Angle))
    call SetUnitY(Dummy,YY+30*Sin(Angle))
    call SaveReal(udg_Hash,i,0,XX)
    call SaveReal(udg_Hash,i,1,YY)
    if DistanceBetweenPoints (CastLoc, GetUnitLoc(Dummy)) > 3000
    then
    call KillUnit(Dummy)
    call FlushChildHashtable(udg_Hash, GetHandleId(Move))
    call PauseTimer(Move)
    call DestroyTimer(Move)
    set Move = null
//Удаляем записи таймера
    
    
endfunction
function Trig_JTKaton_Actions takes nothing returns nothing
    local unit Caster=GetTriggerUnit()
    local real XX=SafeX(GetUnitX(Caster))
    local real YY=SafeY(GetUnitY(Caster))
    local location CastLoc=GetSpellTargetLoc()
    local real XL=GetLocationX(CastLoc)
    local real YL=GetLocationY(CastLoc)
    local real Angle=Atan2(YL-YY,XL-XX)
    local timer Move=CreateTimer()
    local integer i = GetHandleId(Move)
    local unit Dummy=CreateUnit(GetOwningPlayer(Caster),'h001',XX,YY,Angle*bj_RADTODEG)
    call RemoveLocation(CastLoc)
    call SetUnitFacing(Dummy,Angle*bj_RADTODEG)
    call SetUnitPathing(Dummy,false)
    call SaveReal(udg_Hash,i,0,XX)
    call SaveReal(udg_Hash,i,1,YY)
    call SaveUnitHandle(udg_Hash,i,2,Dummy)
    call SaveReal(udg_Hash,i,3,Angle)
    call SaveReal(udg_Hash, i, 4, CastLoc)
    call TimerStart(Move,.03,true,function JTKTimerMove)
endfunction

//===========================================================================
function InitTrig_JTKaton takes nothing returns nothing
    set gg_trg_JTKaton = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_JTKaton, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_JTKaton, Condition( function Trig_JTKaton_Conditions ) )
    call TriggerAddAction( gg_trg_JTKaton, function Trig_JTKaton_Actions )
endfunction
вроде постарался все учесть что вы мне обьяснили, но в чем то ошибка обьясните

Отредактировано alexkill, 15.01.2010 в 22:40.
Старый 15.01.2010, 22:22
9thNerZul
forum/warcraft3
offline
Опыт: 4,869
Активность:
AlexKARASb:
FaB0SS, LostCoast, пример сделал с утра(оч рано + спешил) для получения ответа,
который я получил, FaB0SS, спасибо прояснил кое что
LostCoastпод столом быть не надо, дельнее обьяснить человеку чем насмешки писать
для этого и создавал эту тему
FaB0SSзначит мне надо создавать хеш таблицу
создавать новые лок. переменные координаты, сохранять их туда, приравнивать к тем что я создал в действии? если че не так обьясни по подробнее
Вместо XX,YY юзай GetUnitX(dummy),GetUnitY(dummy) просто те переменные берутся из кэша)
Старый 15.01.2010, 22:29
LostCoast

offline
Опыт: 2,633
Активность:
ну чтож начну:
1)call RemoveLocation(CastLoc) - ты обнулил точку и потом пытаешься её сохранить как реальную в хеше???? --call SaveReal(udg_Hash, i, 4, CastLoc)
2)нету endif во второй ф-ии
думаю этого хватит пока.

Эх не люблю дотерские скилы и их написание, вот тебе рабочий код(вставишь потестишь),начни с простого, потом будешь балансировать и усложнять коды.
» раскрыть
Код:
function Trig_JTKaton_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A001'
endfunction

function JTKTimerMove takes nothing returns nothing
    local timer Move=GetExpiredTimer()
    local integer i = GetHandleId(Move)
    local unit d = LoadUnitHandle(udg_Hash,i,0)
    local real ang = LoadReal(udg_Hash,i,2)
    local location ul=LoadLocationHandle(udg_Hash,i,1)
    call SetUnitPositionLoc( d, PolarProjectionBJ(GetUnitLoc(d), 30, ang) )
    if DistanceBetweenPoints (ul, GetUnitLoc(d)) > 3000 then
    call KillUnit(d)
    call FlushChildHashtable(udg_Hash,i)
    call PauseTimer(Move)
    call DestroyTimer(Move)
    set Move = null
    call RemoveLocation(ul)
    set d = null
    endif
endfunction

function Trig_JTKaton_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer i = GetHandleId(t)
local unit u = GetTriggerUnit()
local location tl = GetSpellTargetLoc()
local location ul = GetUnitLoc(u)
local unit d 
local real ang = AngleBetweenPoints(ul,tl)
set d = CreateUnitAtLoc(GetOwningPlayer(u),'h000',ul,ang)
call SetUnitPathing(d,false)
call SaveUnitHandle(udg_Hash,i,0,d)
call SaveLocationHandle(udg_Hash,i,1,ul)
call SaveReal(udg_Hash,i,2,ang)
call TimerStart(t,.025,true,function JTKTimerMove)
set u = null
call RemoveLocation(tl)
endfunction

//===========================================================================
function InitTrig_JTKaton takes nothing returns nothing
    set gg_trg_JTKaton = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_JTKaton, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_JTKaton, Condition( function Trig_JTKaton_Conditions ) )
    call TriggerAddAction( gg_trg_JTKaton, function Trig_JTKaton_Actions )
endfunction
Старый 15.01.2010, 23:52
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
понял спасибо тему можно закрыть
Старый 16.01.2010, 00:30
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
эх тему так быстро закрыли с корнем
черд =\ только вопрос возник
if SquareRoot((XN-XC)*(XN-XC)+(YN-YC)*(YN-YC))>3000
в чем ошибся компилятор только на нем ошибку держит

если все таки не if
то может что-то не так сделал?
вот код который уже третий день рожаю
» раскрыть

function Trig_JTKaton_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A001'
endfunction

function JTKTimerMove takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer i = GetHandleId(t)
local unit Dummy = LoadUnitHandle(udg_Hash,i,2)
local real XC = LoadReal(udg_Hash,i,0)
local real YC = LoadReal(udg_Hash,i,1)
local real Angle = LoadReal(udg_Hash,i,3)
local real XN = GetUnitX(Dummy)
local real YN = GetUnitY(Dummy)
call SetUnitX(Dummy,(GetUnitX(Dummy)+30*Cos(Angle)))
call SetUnitY(Dummy,(GetUnitY(Dummy)+30*Sin(Angle)))
call SaveReal(udg_Hash,i,4,XN)
call SaveReal(udg_Hash,i,5,YN)
if SquareRoot((XN-XC)*(XN-XC)+(YN-YC)*(YN-YC))>3000
then
call KillUnit(Dummy)
call FlushChildHashtable(udg_Hash, GetHandleId(t))
call PauseTimer(t)
call DestroyTimer(t)
set t = null
//Удаляем записи таймера


endfunction
function Trig_JTKaton_Actions takes nothing returns nothing
local timer t=CreateTimer()
local unit Caster=GetTriggerUnit()
local real XC=GetUnitX(Caster)
local real YC=GetUnitY(Caster)
local location CastLoc=GetSpellTargetLoc()
local real XL=GetLocationX(CastLoc)
local real YL=GetLocationY(CastLoc)
local real Angle = Atan2(YL-YC,XL-XC)
local integer i = GetHandleId(t)
local unit Dummy=CreateUnit(GetOwningPlayer(Caster),'h001',XC,YC,Angle*bj_RADTODEG)
call RemoveLocation(CastLoc)
call SetUnitFacing(Dummy,Angle*bj_RADTODEG)
call SetUnitPathing(Dummy,false)
call SaveReal(udg_Hash,i,0,XC)
call SaveReal(udg_Hash,i,1,YC)
call SaveUnitHandle(udg_Hash,i,2,Dummy)
call SaveReal(udg_Hash,i,3,Angle)
call TimerStart(t,.03,true,function JTKTimerMove)
endfunction

//===========================================================================
function InitTrig_JTKaton takes nothing returns nothing
set gg_trg_JTKaton = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_JTKaton, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_JTKaton, Condition( function Trig_JTKaton_Conditions ) )
call TriggerAddAction( gg_trg_JTKaton, function Trig_JTKaton_Actions )
endfunction

Старый 16.01.2010, 22:25
Закрытая тема

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

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

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

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



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