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

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

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

offline
Опыт: 2,633
Активность:
Enein, если честно не люблю работать с группами. Покажи свой пример
Старый 30.01.2010, 01:06
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
так напиши хороший
Покажи свой пример
и как тогда делать правильно??
выполнять ВСЕ нужные действия в фильтре, т.е:
globals
    boolexpr bx
endglobals
где-нить на старте задаем "set bx = Condition(function Callback)"
call GroupEnumUnits...(gr, ..., bx)
function Callback takes nothing returns boolean
    //...
    return false
endfunction
Enein добавил:
раз плохой то где найти хороший =\?
искать ничего не нужно, все до вас уже давно найдено
Старый 30.01.2010, 01:14
LostCoast

offline
Опыт: 2,633
Активность:
Цитата:
Сообщение от Enein
call GroupEnumUnits...(gr, ..., bx)


после этого также через цикл?
Старый 30.01.2010, 01:15
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
нубы такие нубы...
в "основной" функции больше ничего, кроме сохранения нужных переменных, ненадо делать, все выполняется в Callback'е
Старый 30.01.2010, 01:18
LostCoast

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


ну что поделать, учить никогда не поздно))
Старый 30.01.2010, 01:20
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Enein, друг ты не удивляйся что я нуб создавал бы я тему если был бы умнее?, в теме надпись обучение думал все обьяснила
boolexpr bx - что это за глобальная, обьясните пожалуйста
function Callback функция фильтр, мне надо поставить условие или здесь нанесение урона тоже будет?
Честно можеш пожалуйста поподробнее написать\описать если не тяжело :D
Старый 30.01.2010, 10:17
adic3x

offline
Опыт: 108,439
Активность:
где-нить на старте задаем "set bx = Condition(function Callback)"
можно каждый раз звать кондиши - они не создают утечек и всегда вернут один и тот же указатель
а вот группу создать при инициализации и каждый раз просто использовать ее
cJass лямбды тут рулят, например
    // cJass
    GroupEnumUnits*(gr_temp, ..., Condition(lambda boolean () {
        // actions
        return false
    }))

Отредактировано ADOLF, 30.01.2010 в 14:06.
Старый 30.01.2010, 13:19
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Обьсните пожалуйста
*boolexpr что за переменная
*Callback функция: назначение
*Почему циклом ~LostCoast, не стоит делать?
*Каким действием тогда стоит делать?
Старый 30.01.2010, 14:03
adic3x

offline
Опыт: 108,439
Активность:
boolexpr что за переменная
спец указатель на функцию, которая возращает буль
Callback функция: назначение
быть вызванной движком?
Почему циклом LostCoast, не стоит делать?
перебор обычным циклом? неудобно и нерационально
Каким действием тогда стоит делать?
Старый 30.01.2010, 14:06
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
AlexKARASb, если немного непонятно, то:
вместо "//..."
Твои действия. В данном случае юнитом в группе будет GetFilterUnit().
Старый 30.01.2010, 14:13
LostCoast

offline
Опыт: 2,633
Активность:
тоесть:

Код:
function Callback takes nothing returns boolean
    call UnitAddAbility(GetFilterUnit(),'A001')
    return false
endfunction
Старый 30.01.2010, 14:28
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
globals 
    boolexpr bx 
endglobals

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

function Callback takes nothing returns boolean 
loop
set tr = FirstOfGroup(gr)
exitwhen tr == null 
if IsUnitEnemy(tr,Player(0)) then 
call UnitDamageTarget(Dummy,tr,10,true,false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null) 
call GroupRemoveUnit (gr, tr)
else 
call GroupRemoveUnit (gr, tr) 
endif 
endloop 
call DestroyGroup(gr)
return false
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 unit tr
    local group gr = CreateGroup()
    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, XN+20*Cos(Angle))
    call SetUnitY(Dummy,YN+20*Sin(Angle))
    call SaveReal(udg_Hash,i,4,XN)
    call SaveReal(udg_Hash,i,5,YN)
    call GroupEnumUnitsInRange(gr,XN,YN,300,bx)
    
    if SquareRoot((XN-XC)*(XN-XC)+(YN-YC)*(YN-YC))>3000 then
    call KillUnit(Dummy)
    set gr = null
    call FlushChildHashtable(udg_Hash, i)
    call PauseTimer(t)
    call DestroyTimer(t)
    set t = null
    endif
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)

        set bx = Condition(function Callback)

    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
хм уверен на 99% что я написал бред да?
просто вместо цикла не пойму какие действия делать
я понял что энейн написал нужное просто понять эт не могу =\

Отредактировано ShadoW DaemoN, 30.01.2010 в 18:57.
Старый 30.01.2010, 14:29
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
никто немощному не поможет\обьяснит? =\
Старый 30.01.2010, 18:51
Nekit1234007

offline
Опыт: 11,916
Активность:
Код:
function Callback takes nothing returns boolean 
    local unit u=GetFilterUnit()
    if IsUnitEnemy(u,Player(0)) then 
        call UnitDamageTarget(Dummy,u,10,true,false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
    endif
    return false
endfunction
Старый 30.01.2010, 19:04
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
эта функция будет переодической?не удивляйтесь вопросу эт же аля Я
Старый 30.01.2010, 19:14
Nekit1234007

offline
Опыт: 11,916
Активность:
Эта фунцкия пройдётся по всем юнитам группы.
Старый 30.01.2010, 19:15
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
пытался, пытался, пытался и ничего толкового не вышло
1вопрос: вот создал я функцию эту кол бек, почем вы посоветовали в нанесении урона писать что дамми наносит урон хотя лок. дамми в функции нет
» code

globals
boolexpr bx
endglobals
function CallBack takes nothing returns boolean
local unit u=GetFilterUnit()
local unit C=GetTriggerUnit()
if IsUnitEnemy(u,GetTriggerPlayer()) then
call UnitDamageTarget(C,u,10,true,false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
endif
return false
endfunction

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 group gr = CreateGroup()
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)
local unit tr
call SetUnitX(Dummy, XN+20*Cos(Angle))
call SetUnitY(Dummy,YN+20*Sin(Angle))
call SaveReal(udg_Hash,i,4,XN)
call SaveReal(udg_Hash,i,5,YN)
call GroupEnumUnitsInRange(gr,XN,YN,300,bx)
if SquareRoot((XN-XC)*(XN-XC)+(YN-YC)*(YN-YC))>3000 then
call KillUnit(Dummy)
call DestroyGroup(gr)
set gr = null
call FlushChildHashtable(udg_Hash, i)
call PauseTimer(t)
call DestroyTimer(t)
set t = null
endif
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)
set bx = Condition(function CallBack)
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

что неправильного на этот раз?
Старый 30.01.2010, 22:20
adic3x

offline
Опыт: 108,439
Активность:
что неправильного на этот раз?
Триггер плеера, юнита и прочее из дейсвия тригера переноси через глобалки (что бы обращатсья к ним в каллбеке)
Старый 30.01.2010, 22:30
LostCoast

offline
Опыт: 2,633
Активность:
AlexKARASb, ты этот код с помощью JNGP писал?
Старый 31.01.2010, 00:21
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
этот код с помощью JNGP писал?
судя по блоку с глобалками в начале - да
можно каждый раз звать кондиши - они не создают утечек и всегда вернут один и тот же указатель
чисто для удобства...
но в некоторых случаях, когда пик выполняется очень часто, все-таки лучше обращение к переменной - быстрее же)
Старый 31.01.2010, 00:31
Закрытая тема

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

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

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

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



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