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

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

Ответ
 
Jaker01
Ученик академии XGM
offline
Опыт: 4,149
Активность:
Триггерное восполнение здоровья
Создал нестандартный предмет (при использовании восполняет здоровье герою). Длительность действия предмета - 15 секунд.
Итак, 1 триггер - при использовании предмета герой заносится в группу (отряд)
2 триггер - каждые 3 секунды восполняет здоровье всем участникам этой группы.
Вот проблема, как сделать так, чтобы здоровье восполнялось именно каждые 3 секунды после использования предмета? У меня это выглядит несколько иначе, например, во 2 триггере пройдет 2 секунды и затем герой использует предмет, здоровье ему восполнится сразу через секунду (ибо в триггере уже прошло 2 секунды), а нужно чтобы отсчет времени начинался только после использования предмета.
Триггер для многопользовательской игры.
Старый 11.06.2011, 21:28
Doc

offline
Опыт: 63,163
Активность:
Jaker01, юзай таймеры и хеш.
Старый 11.06.2011, 21:33
Jaker01
Ученик академии XGM
offline
Опыт: 4,149
Активность:
С хешом не совсем умею работать ): А других нету вариантов?
Старый 11.06.2011, 21:37
naxim

offline
Опыт: 10,186
Активность:
Jaker01:
А других нету вариантов?
Есть же стандартный итем, который со временем восстанавливает.
Старый 11.06.2011, 21:41
Jaker01
Ученик академии XGM
offline
Опыт: 4,149
Активность:
naxim:
Jaker01:
А других нету вариантов?
Есть же стандартный итем, который со временем восстанавливает.
Мне нужно, чтобы здоровье каждые 3 секунды восполнялось, а в РО там 1 секунда вроде как.
Старый 11.06.2011, 21:48
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
Цитата:
С хешом не совсем умею работать ): А других нету вариантов?
Ну можно тупо в тригере 5 вейтов в 3 сек поставить, после каждого - востановить здоровье triggering unit.
Старый 11.06.2011, 21:59
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
triggering unit после первого же вэйта потеряется - лучше занести в локалку
Старый 11.06.2011, 22:04
FEARSTARTER
desert eagle
offline
Опыт: 19,364
Активность:
Он и после пятого и 105ого не потеряется
Старый 11.06.2011, 22:05
Jaker01
Ученик академии XGM
offline
Опыт: 4,149
Активность:
FEARSTARTER:
Он и после пятого и 105ого не потеряется
Что правда, то правда. Только что проверил, не теряется... Хотя сам раньше думал что такое нельзя сделать D; А если предмет используют несколько героев, работать будет? :o
Старый 11.06.2011, 22:13
Doc

offline
Опыт: 63,163
Активность:
Jaker01, будет. но вэйты дерьмо, лучше их не использовать.
Старый 11.06.2011, 22:20
Jaker01
Ученик академии XGM
offline
Опыт: 4,149
Активность:
Doc:
Jaker01, будет. но вэйты дерьмо, лучше их не использовать.
Ну кроме таймеров, хеша и вейтов есть какие-нибудь ещё варианты?
Старый 11.06.2011, 22:32
Doc

offline
Опыт: 63,163
Активность:
Jaker01, периодическим триггером в 1 секунду пикать всех кто в группе, прибавлять к Custom Value 1, если оно равно 2, ставить его равным 0, прибавлять хп.
Старый 11.06.2011, 22:40
Extremator

offline
Опыт: 39,522
Активность:
Jaker01:
Вот проблема, как сделать так, чтобы здоровье восполнялось именно каждые 3 секунды после использования предмета?
переодически юзать +N*0.05 каждые 0.05 сек... будет плавный реген Оо
Старый 11.06.2011, 23:12
DioD

offline
Опыт: 45,134
Активность:
как грамотно решать такие задачи:

1) Создаем виртуальный класс-свойство объектов HealingItemTypeAlpha01.
2) Определяем действия которые данное свойство может и будет выполнять, тупо пишем на это действие исчерпывающую функцию и связываем её с названием.
2.2) У нас все завязано на событие, событие в нашем случае - время, вы должны конкретно указать время, подробнее ниже


3) Каждый юнит должен иметь некоторое свойство, делающее этот юнит уникальным именно для нас, это тупо порядковый номер регистрации.

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

5) Наша система должна оперировать юнитами, тестзапуск происходит в момент инициализации системы и при добавлении-удалении любого юнита из системы, но не чаще чем 0.03125 секунды, это 32 фрейма в секунду, то есть максимум 32 запуска в секунду.

6) В момент проверки система проверяет юнитов состояние которых изменилось с прошлого запуска, для этого мы ведем дополнительные списки, если юнит создан, мы пишем его кроме прочего в batchlist ровно как удаленных юнитов.

7) Система запускается 32 раза в секунду все равно, но смотрит только батчлист, если он пуст то таймер пропускает итерацию.
7.2) Метод может иметь альтернативу, так называемый variabletimeframe когда система анализирует действия и запускает таймер на нужное число фреймов, но тут возникают сложности в управлении, так как если появились новые задания, их потребуется обработать отдельно, отложив одно задание и выполнив другое, а потом продолжить.
Это у нас стек с сортировкой действий по времени исполнения.
У нас есть 100500 заданий, которые пишутся в хронологическом порядке и исполнение идет от одного задания к другому.

8) В batchlist е после повешания этого самого бафа мы обнаружим ID юнита, проверив ID юнита мы обнаружим в списке эффектов HealingItemTypeAlpha01_INIT_TIMESTAMP что предписывает каждые 3 секунды производить предписанные в отношении юнита действия.

9) Следующая итерация которая предписывает действия произойдет через 96 вызовов и потом каждые 96 вызовов.
9.2) Соответственно мы добавляем к итерации таймера проверку на прохождение нужного промежутка времени или пишем в сортированный стек действия в том порядке, в котором они будут исполнены.


Такой подход, некоторые называют OOP - каждый эффект, каждое действие создается и обрабатывается как объект, объекты формируют классы и подклассы.
Все дополнительные классы являются свойством основного класса, будь то юнит или любой другой хендл в варе.

Что касается выбора, у нас самое быстрое это нативки, таймер который срабатывает 32 раза в секунду и ни о чем не думает как правило предпочтительнее таймера которые срабатывает 10 раз в секунду, но при этом думает за всех, сортирует батчлист и перезапускается после каждой итерации на новое время, в любой момент может быть прерван без ограничений.

тем более у вас запросто могут быть свойства плана PushBackGeneric которые вызываются каждый фрейм, или например обработка урона или еще чего либо, что опять таки сработает каждый фрейм все равно.
Старый 12.06.2011, 00:07
Anufis

offline
Опыт: 6,290
Активность:
DioD:
Что касается выбора, у нас самое быстрое это нативки, таймер который срабатывает 32 раза в секунду и ни о чем не думает как правило предпочтительнее таймера которые срабатывает 10 раз в секунду, но при этом думает за всех, сортирует батчлист и перезапускается после каждой итерации на новое время, в любой момент может быть прерван без ограничений.
На этом моменте чуток не понял. Куча таймеров на нативках предпочтительнее одного крупного?
Старый 12.06.2011, 10:03
silumin

offline
Опыт: 11,153
Активность:
Jaker01, из всех вышесказанных извращений самое подходящее для тебя решение - таймеры и хеш-таблица.
п.с. всегда вызывали улыбку посты местных "гениев" типа DioD'а... Топикстартер ещё не имеет понятия о ХТ и таймерах, а DioD уже рад выложить очередное бредорешение элементарной задачи. Лол...
Старый 12.06.2011, 10:49
Anufis

offline
Опыт: 6,290
Активность:
silumin:
бредорешение
Если оно стабильнее работает и с минимумом нагрузки, то оно лучше будет.
Старый 12.06.2011, 10:59
Doc

offline
Опыт: 63,163
Активность:
Anufis, вероятно он имеет в виду, что лучше отдельный таймер на скилл, чем вешать все на основной.
silumin, мне кажется он просто копипастит это из скрытых резервов !
Старый 12.06.2011, 11:00
Jaker01
Ученик академии XGM
offline
Опыт: 4,149
Активность:
silumin:
Jaker01, из всех вышесказанных извращений самое подходящее для тебя решение - таймеры и хеш-таблица.
п.с. всегда вызывали улыбку посты местных "гениев" типа DioD'а... Топикстартер ещё не имеет понятия о ХТ и таймерах, а DioD уже рад выложить очередное бредорешение элементарной задачи. Лол...
Как я и писал выше, не умею работать с хешом... И где- то ещё читал, что его лучше использовать для сингла (могу и ошибаться), а у меня мультиплеерная карта D; И как я понял, хеш подразумевает собой сохранение каких-либо данных в игре, не? Я не совсем понимаю, что именно я там сохранять буду ы ):
Были идеи сделать на каждого игрока отдельный триггер, который будет восполнять здоровье, но это не оптимально, ибо возможно сделать все 1-им триггером. Вообщем, пока все что я могу, это сделать восполнение через wait'ы, но может вы предложите ещё какие-нибудь способы решения?
Старый 12.06.2011, 16:58
silumin

offline
Опыт: 11,153
Активность:
Anufis, у тебя Пентиум 2 и 128 озу? Я думаю ты понял к чему этот вопрос...
Jaker01, ХТ для всего хорош: и для сингла и для мультиплеера, если использовать правильно. Для твоего случая - это идеальный вариант. Есть определённые тонкости в работе с ХТ, но удобство реализации некоторых задач это компенсирует сполна. Поэтому советую прочитать статьи по ХТ и таймерам, не пожалеешь точно.
Старый 12.06.2011, 17:37
Ответ

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

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

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

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



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