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

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

Ответ
 
Elf_Stratigo

offline
Опыт: 4,699
Активность:
в карте удобно смотреть, но времени мало
в крации - замени функцию Gravity_Boll_Filter:
function Gravity_Boll_Filter takes nothing returns boolean
local timer t=GetExpiredTimer()
local unit c=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
if c==null then
call DisplayTextToPlayer(GetLocalPlayer(),0.,0.,"excepted")
endif
return IsPlayerEnemy(GetOwningPlayer(c),GetOwningPlayer(GetFilterUnit()))and(GetWidgetLife(GetFilterUnit())​>0.405)and(not(IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)))
endfunction
если увидишь надпись "excepted", а её увидишь, это значит что по этому адрессу в хеше лежит НЕ юнит (вроде там таймер записывается), такчто вердикт мой сохранён :)
проверь функцию, которая запускает таймер
использую обычный джазз и локалки.. вы же почти все (может и все) используете глобалки и дополнительные формы джаза и возвращаться к не удобному не хочется.. мне так кажется..
пишешь ты, мы токо подсказываем, такчто можешь не беспокоиться, никчему не возвращаемся
не признаю хеш, не потомучто неудобно, а потомучто медленный, да и всётаки запутаться легко
вообще вроде фильтры для групп создают через Filter, а оно у тя работает оО
учись отлаживать свой код, это статистически самая большая работа программиста по времени
Старый 14.09.2010, 21:48
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
Elf_Stratigo:
учись отлаживать свой код, это статистически самая большая работа программиста по времени
Бред,имхо.Самое трудно создать код,а отладить дело времени и желания.
Старый 14.09.2010, 23:09
Revo1teR

offline
Опыт: 146
Активность:
Неа +) я сейчас кое что проверил) так вот, почему-то, когда останавливаем таймер.. все что было записано в хеш этого таймера обнуляется..(set "переменная"=null) в связи с этим, когда я удалил команду call PauseTimer(t), excepted больше не появляется.. т.е все я правильно записал, но если таймер t не останавливается, то что же выходит ? шар не летит это точно.. и по логике таймер несколько раз запустить нельзя один и тот же в одной и той же функции.. НО все равно call ForGroup ничего зараза не делают =).
И лично я этой "медленности хеша" не замечаю.. шар летит динамично? - динамично, ну вот и отлично меня вполне устраивает.
Windrunner а тут уже ты не прав =).Он разве говорил что-то про "трудность"? "самая большая работа программиста по времени" =) просто это занимает больше времени вот и все.
Хотя с этим тоже можно поспорить), но я не стал бы.
Старый 15.09.2010, 00:08
JassMan
свободен
offline
Опыт: 4,193
Активность:
Не надо трогать хеш, ибо не такой уж он и медленный как говорят, чуть медленней глобалок, но не на много.
По поводу удобства, а что тут неудобного? —Сохранил - выгрузил . . .
Старый 15.09.2010, 14:52
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
JassMan, он медленнее массивов.Как говорили примерно в 21 раз,в игре этого офк не заметно,но сам принцип должен тебе мешать пользоватся более медленным.Но по идее в больших мапах это имеет большое значение
Старый 15.09.2010, 16:06
Revo1teR

offline
Опыт: 146
Активность:
ем.. тогда как я понимаю это и удобно и вобще полезно =).Можно ссылку на ресурс где можно обучится =), или нет такой "училки".
Старый 15.09.2010, 19:05
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
Revo1teR, Нет это не столько удобно сколько полезно.Многие "Папки"(не в обиду им) считают,что мапмейкер делает все не эффектно.Слишком просто по просту говоря.По сути способ заключается в переборе массивов.Насчет статей не знаю,поищи на статьях.Я этому сам обучался=)
Расскажу основу
1)Создаешь массив и заносишь все что надо,при этом юзай паралельные массивы(ака структуры)
т.е у тебя есть 3 массива unit u,int i,item it
тогда ты заносишь юнита u[1] и число i[1] и предмет it[1] и создаешь одну переменную типа int(целочисленная) для того,чтобы указать системе сколько у тебя данных структур.
Занесение будет выглядеть примерно так:
count = count + 1
set u[count] = unit
set i[count] = int
set it[count] = item
2)Делаешь простенький цикл вроде
int i = 0
loop
exitwhen i > count
Все действия с каждым элементом.
endloop
По сути это тяжелее,но там а)Быстрее
б)Если верить им(папкам),то не приводит к относительной деградации=)
Надеюсь ты понял,что я пытался донести=)
Старый 15.09.2010, 19:17
Elf_Stratigo

offline
Опыт: 4,699
Активность:
вот прототип моих последних заклинаний:
» [cJass]
library MyAbility initializer init //если инициализатор закоментить, то его можно будет запустить во время игры (по изучению скила)

#include "cj_types_priv.j"

define private myperiod = 0.03
//переменные не инициализированы  - можно выделить память во время игры
private timer t
private int count
//ниже - область массивов
private unit array caster

private void process()
{
    int i = 0
    unit c
    loop
        exitwhen i>=count
        c=caster[i]//работаем с локалками - это быстрее
        if true {//условие продолжения заклинания
            //actions with 'c'
            i++
        }else{//иначе действие заклинания уже прошло или неосуществимо
            count--
            caster[i]=caster[count]
        }
    endloop
    c=null
    if count==0 {TimerStart(t,0.,false,null)} //если нет активных заклинаний этого класса - переходим в спящий режим
}

void MyAbilityCast(unit c) //эта функция вызывается из диспетчера заклинаний
{
    count++
    caster[count]=c
    if count==1 {TimerStart(t,myperiod,true,function process)}//необходимо пробудить систему
}

public void init()
{
    count=0
    t=CreateTimer() //если заклинание доступно с загрузки карты, лучше таймер сделать константой
}

endlibrary

Отредактировано Elf_Stratigo, 16.09.2010 в 14:08.
Старый 15.09.2010, 20:54
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
Elf_Stratigo, Покажу твои ошибки.
Во 1-ых Работать с локалками медленнее т.к там отделяется время на создание локалки и ее присвоение.ТОесть не юзай локалки в данном случае~Elf_Stratigo:
if count==0 {TimerStart(t,0.,false,null)}
Тут лучше паузить таймер~Elf_Stratigo:
переменные не инициализированы - можно выделить память во время игры
Совершенно не нужное действие
Elf_Stratigo:
loop
exitwhen i>=count
c=caster[i]//работаем с локалками - это быстрее
if true {//условие продолжения заклинания
actions with 'c'
i++
}else{//иначе действие заклинания уже прошло или неосуществимо
count--
caster[i]=caster[count]
}
Не юзаешь все возможности cJass
надо так
whilenot(i++ >= count)
{
	c = caster[i]
		if b { // Я не понял к чему там труе=)

		} else {

		}
}
Хотя это дело выбора=)
Старый 15.09.2010, 21:15
Elf_Stratigo

offline
Опыт: 4,699
Активность:
Windrunner,
локалки - имеется ввиду, что ниже будет набор действий с переменной "с" - а это быстрее, чем обращение к ячейке в массиве
паузить таймер может и лучше, но как показывает практика - не безопасней - допустим у Revo1teR это приводит к обнулению записей в хеше (скорее к потери), по крайне мере он так говорит
Совершенно не нужное действие
может получиться так, что это заклинание не будет использовано (изучено) ни разу за игру - зачем выделять ему память?! это здесь есть только новый таймер, в нужных случаях может быть гораздо больше разных объектов
if b { Я не понял к чему там труе=)
условие продолжения заклинания
Старый 15.09.2010, 21:50
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
Elf_Stratigo, нет,использование массива(созданного и инициализированного обьекта) быстрее чем использование локалки,ты спутал использование локалки vs некоторые ф-ции.
Если пауза приводит к потере,то это тоже приведет.
А зачем делать систему если ничего не будет юзать ее?=)
Старый 15.09.2010, 21:52
Elf_Stratigo

offline
Опыт: 4,699
Активность:
наш спор конечно уже не в тему...
что быстрее?
SetWidgetLife(c,GetWidgetLife(c)+GetUnitLevel(c))
или:
SetWidgetLife(caster[i],GetWidgetLife(caster[i])+GetUnitLevel(caster[i]))
Если пауза приводит к потере,то это тоже приведет.
тут честно отвечу - не знаю. если паузить, то поидее должен быть резюм гдето, а такого нет
ИМХО, не такие уж и большие затраты произойдут
может конечно пауза и будет верной
А зачем делать систему если ничего не будет юзать ее?
она может быть не задействована в текущей игре, если не выбрали героя, к которой она относится.
загляни dota opensource
забыл обнулить локалку ><
Старый 16.09.2010, 14:07
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
Elf_Stratigo:
SetWidgetLife(caster[i],GetWidgetLife(caster[i])+GetUnitLevel(caster[i]))
это быстрее
Elf_Stratigo:
тут честно отвечу - не знаю. если паузить, то поидее должен быть резюм гдето, а такого нет
есть
Elf_Stratigo:
она может быть не задействована в текущей игре, если не выбрали героя, к которой она относится.
загляни dota opensource
ты останавливаешь таймер,если кол-во мелкое,но хуже от этого не будет
Старый 16.09.2010, 15:43
Elf_Stratigo

offline
Опыт: 4,699
Активность:
это быстрее
пруфлинк в студию
ты останавливаешь таймер,если кол-во мелкое,но хуже от этого не будет
в реале могут быть группы, триггеры и тд, просто в примере один таймер
Старый 16.09.2010, 17:37
Ответ

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

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

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

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



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