|
|
|
|
пехотинец поднимает и опускает щит по команде
|
|
igor-razor | Дата: Пятница, 12 Октября 2012, 15:24:16 | Сообщение # 1 |
6 уровень
Группа: Проверенные
Сообщений: 224
Награды: 0
Репутация: 5
Блокировки:
| событие - юнит атакован
действия 1. команда атакованному юниту - поднять щит (способность пехотинца) 2. подождать 5 сек 3. выбрать всех юнитов (pick every unit) вокруг атакованного юнитав радиусе R условие (внутри pick every unit) если пикнутый юнит является врагом атакованному юниту, то ничего не делать (щит оставить поднятым) иначе (еслипикнутыйявляется союзником), то опустить щит (способность пехотинца)
ТРЕБУЕТСЯ УЛУЧШИТЬ ТРИГГЕР (без применения переменных) т.к.юнит является сам себе союзником и опускает щит, даже если вокруг враги. (потом снова поднимает, потом снова опускает, короче бардак!) _____________________________________________________________________ нужно каким-то образом запоминать (без переменных ), что рядом есть хоть один враг и ни в какую щит не опускать
Сообщение отредактировал igor-razor - Пятница, 12 Октября 2012, 15:24:56 |
|
|
|
Naturekid | Дата: Пятница, 12 Октября 2012, 15:50:02 | Сообщение # 2 |
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
| Вариант 1 - дать способность пустышку при касте. Убирать при отзыве. Вариант 2 - ставить custom value юнита на 1,при отзыве - возвращать на 0.
|
|
|
|
igor-razor | Дата: Пятница, 12 Октября 2012, 16:21:01 | Сообщение # 3 |
6 уровень
Группа: Проверенные
Сообщений: 224
Награды: 0
Репутация: 5
Блокировки:
| Quote (Naturekid) Вариант 2 - ставить custom value юнита на 1,при отзыве - возвращать на 0. поподробнее можно?
|
|
|
|
kapa6acvlk | Дата: Пятница, 12 Октября 2012, 16:26:43 | Сообщение # 4 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Quote (Naturekid) Вариант 2 - ставить custom value юнита на 1,при отзыве - возвращать на 0. В нужный момент проверять, стоит 1 или 0
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
Сообщение отредактировал kapa6acvlk - Пятница, 12 Октября 2012, 16:26:54 |
|
|
|
SirNikolas | Дата: Пятница, 12 Октября 2012, 16:28:46 | Сообщение # 5 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (igor-razor) т.к.юнит является сам себе союзником и опускает щит, даже если вокруг враги. Boolean = true Выбрать всех вокруг атакованного. _Если пикнутый - враг атакованного __Boolean = false Если Boolean _Опустить щит.
Сообщение отредактировал SirNikolas - Пятница, 12 Октября 2012, 16:29:40 |
|
|
|
igor-razor | Дата: Пятница, 12 Октября 2012, 16:33:54 | Сообщение # 6 |
6 уровень
Группа: Проверенные
Сообщений: 224
Награды: 0
Репутация: 5
Блокировки:
| Quote (kapa6acvlk) custom value а где это значение в триггерах искать?Добавлено (12 Октября 2012, 16:33:54) ---------------------------------------------
Quote (SirNikolas) Boolean = true Выбрать всех вокруг атакованного. _Если пикнутый - враг атакованного __Boolean = false Если Boolean _Опустить щит.
в программировании это называется использование "флагов", но так как таких юнитов дофига, я не могу создавать под каждого переменную, а если будет одна переменная на всех, то они все к ней и будут обращаться. нужно как-то обойтись без переменных.
|
|
|
|
SirNikolas | Дата: Пятница, 12 Октября 2012, 16:38:30 | Сообщение # 7 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (igor-razor) а если будет одна переменная на всех, то они все к ней и будут обращаться. Пик юнитов - действие мгновенное (без прерывания потока) => хватит одной переменной. Ее всегда будет использовать только один юнит.
Сообщение отредактировал SirNikolas - Пятница, 12 Октября 2012, 16:40:30 |
|
|
|
igor-razor | Дата: Пятница, 12 Октября 2012, 16:43:46 | Сообщение # 8 |
6 уровень
Группа: Проверенные
Сообщений: 224
Награды: 0
Репутация: 5
Блокировки:
| я имел ввиду, не то, что пик юнитов будет использовать переменную, а то, что юнитов-пехотинцев на карте произвольное количество и все они поднимают и опускаю щиты
|
|
|
|
SirNikolas | Дата: Пятница, 12 Октября 2012, 16:47:12 | Сообщение # 9 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (igor-razor) и все они поднимают и опускаю щиты Нет же.
|
|
|
|
igor-razor | Дата: Пятница, 12 Октября 2012, 17:01:14 | Сообщение # 10 |
6 уровень
Группа: Проверенные
Сообщений: 224
Награды: 0
Репутация: 5
Блокировки:
| а что же всё-таки за custom value? переменная, привязанная к каждому юниту?
|
|
|
|
SirNikolas | Дата: Пятница, 12 Октября 2012, 17:03:34 | Сообщение # 11 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Можно сказать и так.
|
|
|
|
igor-razor | Дата: Пятница, 12 Октября 2012, 17:20:02 | Сообщение # 12 |
6 уровень
Группа: Проверенные
Сообщений: 224
Награды: 0
Репутация: 5
Блокировки:
| ну тогда это очень хорошо, только я не могу её никак найти.
|
|
|
|
Naturekid | Дата: Пятница, 12 Октября 2012, 17:31:54 | Сообщение # 13 |
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
| это целочисленная. Условия ищем в Integer Действия в Б. е. Но кстати вариант с флагами, полностью приемлем в плане работоспособности. Обращение к переменной считается моментальным, НО - ПИК ЮНИТС - цикл, и действия выполняются поочерёдно, так что не волнуйся, глюка не будет.
|
|
|
|
igor-razor | Дата: Пятница, 12 Октября 2012, 17:44:39 | Сообщение # 14 |
6 уровень
Группа: Проверенные
Сообщений: 224
Награды: 0
Репутация: 5
Блокировки:
| да блин, как вы не понимаете, каждый юнит-пехотинец обращается последовательно к одной и той же глобальной переменной столько раз, сколько у каждого будет пиков. например, на карте N пехотинцев, а вокруг каждого по M юнита. пик использует последовательное обращение к ячейке памяти переменной, но пехотинцев-то на карте всё равно N штук, то есть, если на них одновременно напали, то они будут одновременно обращаться к одной переменной, читать из неё значениЕ, изменять значениЕ и прочее. Поэтому остаётся только вариант, чтобы у каждого пехотинца была своя переменная, я так подозреваю, что это custom value, но не могу её найти.
|
|
|
|
SirNikolas | Дата: Пятница, 12 Октября 2012, 17:48:08 | Сообщение # 15 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (igor_razor) Custom Value Не советую ей пользоваться. Переменную с виджетом можно ассоциировать только одну. Т. е. если использовать ее для щита пехотинца, то нельзя будет с ее помощью сделать что-нибудь еще. Идеальный вариант - система UnitIndexer by Nestharus (если не ошибаюсь).
Добавлено (12 Октября 2012, 17:48:08) --------------------------------------------- Quote (igor-razor) если на них одновременно напали, то они будут одновременно обращаться к одной переменной, читать из неё значениЕ, изменять значениЕ и прочее. JASS по своей сути не обладает многопоточностью, он лишь имитирует ее. Так что одновременно происходить ничего не может.
|
|
|
|
igor-razor | Дата: Пятница, 12 Октября 2012, 18:07:41 | Сообщение # 16 |
6 уровень
Группа: Проверенные
Сообщений: 224
Награды: 0
Репутация: 5
Блокировки:
| да дело не однопоточности. дело в обращении разных юнитов и триггеров к одной глобальной переменной, дело в том , что одного стукнули - он закрылся и пошел проверять, нет ли вокруг врагов или союзников, вокруг оказались только враги - он оставил значение 1, а в это время (или через пару секунд) другой пехотинец обнаружил вокруг есть только союзники, и щит можно опускать - он поменял значение на 0, третьму понадобилось считать переменную, он взял 0 от второго, а тут первый решил взять своё значение 1 - опа, а там 0 от второго! и первый опустил щит) и получил в бубен
Сообщение отредактировал igor-razor - Пятница, 12 Октября 2012, 18:09:02 |
|
|
|
Q1wAse | Дата: Пятница, 12 Октября 2012, 18:13:23 | Сообщение # 17 |
Группа: Проверенные
Сообщений: 1235
Награды: 0
Репутация: 286
Блокировки:
| igor-razor, МОЖНО проще... всё тоже самое что у тебя только добавь условие 1 если пикнутые юниты и враги и союзники то ничего не делать иначе твои действия.....
|
|
|
|
AU | Дата: Пятница, 12 Октября 2012, 18:19:30 | Сообщение # 18 |
7 уровень
Группа: Проверенные
Сообщений: 471
Награды: 0
Репутация: 70
Блокировки:
| Quote (igor-razor) да блин, как вы не понимаете, каждый юнит-пехотинец обращается последовательно к одной и той же глобальной переменной столько раз, сколько у каждого будет пиков. например, на карте N пехотинцев, а вокруг каждого по M юнита. пик использует последовательное обращение к ячейке памяти переменной, но пехотинцев-то на карте всё равно N штук, то есть, если на них одновременно напали, то они будут одновременно обращаться к одной переменной, читать из неё значениЕ, изменять значениЕ и прочее. Поэтому остаётся только вариант, чтобы у каждого пехотинца была своя переменная, я так подозреваю, что это custom value, но не могу её найти. УУУУУУУУУУУУУУ МОЖНО С ГЛОБАЛКОЙ! запросто.
Триггер: (венегрет из псевдокода)
Событие: Боевая еденица атакована Условие: Тип атакованной боевой еденицы - пехотинец или Тип udg_ЖдущийПехотинец - пехотинец Действия: local unit атакованный = attacked unit Если udg_ЖдущийПехотинец == нет боевой еденицы _Ничего Иначе _атакованный = udg_ЖдущийПехотинец _udg_ЖдущийПехотинец == нет боевой еденицы Конец условия wait 5 секунд Цикл для группы юнитов в радиусе от атакованного _Если пикнутый юнит враг атакованному, то __Set udg_ЕстьВраг = true _Ниаче __Ничего _Конец условия Конец цикла Если udg_ЕстьВраг == false, то _Приказать опустить щит атакованному Иначе _Set udg_ЕстьВраг = false _udg_ЖдущийПехотинец = атакованный _Запустить текущий триггер Конец условия
Сообщение отредактировал AU - Пятница, 12 Октября 2012, 18:22:25 |
|
|
|
Ty3uK | Дата: Пятница, 12 Октября 2012, 18:20:32 | Сообщение # 19 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| каждый вызов вроде стартует новый поток а экзекут стартует функцию в текущем
|
|
|
|
Naturekid | Дата: Пятница, 12 Октября 2012, 18:21:57 | Сообщение # 20 |
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
| igor-razor, ты бы проверил, потом бы возникал, всё быстрее чем тексты городить. Quote (igor-razor) не могу её найти Quote (Naturekid) Условия ищем в Integer Действия в Б. е. но - Quote (SirNikolas) Переменную с виджетом можно ассоциировать только одну. Т. е. если использовать ее для щита пехотинца, то нельзя будет с ее помощью сделать что-нибудь еще то есть кустом валью лепим только в ту реализацию, где никак без неё не обойтись.
|
|
|
|
igor-razor | Дата: Пятница, 12 Октября 2012, 18:22:10 | Сообщение # 21 |
6 уровень
Группа: Проверенные
Сообщений: 224
Награды: 0
Репутация: 5
Блокировки:
| как обработать пикнутых юнитов так, чтобы запоминать, что уже встречался союзник или враг, ведь всё происходит последовательно. например, пошел пик юнитов: 1.враг - норм, щит не опускаем 2.враг - щит не опускаем 3.союзник - опускаем щит 4.враг - щит уже опущен
Сообщение отредактировал igor-razor - Пятница, 12 Октября 2012, 18:22:23 |
|
|
|
Naturekid | Дата: Пятница, 12 Октября 2012, 18:22:37 | Сообщение # 22 |
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
| Quote (kapa6acvlk) Сообщение # 4 Там скрин же... как ты ищешь, не пойму...
|
|
|
|
AU | Дата: Пятница, 12 Октября 2012, 18:23:21 | Сообщение # 23 |
7 уровень
Группа: Проверенные
Сообщений: 471
Награды: 0
Репутация: 70
Блокировки:
| Quote (igor-razor) как обработать пикнутых юнитов так, чтобы запоминать, что уже встречался союзник или враг, ведь всё происходит последовательно. например, пошел пик юнитов: 1.враг - норм, щит не опускаем 2.враг - щит не опускаем 3.союзник - опускаем щит 4.враг - щит уже опущен читай мой пост
|
|
|
|
SirNikolas | Дата: Пятница, 12 Октября 2012, 18:25:40 | Сообщение # 24 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (igor-razor) дело в том , что одного стукнули - он закрылся и пошел проверять, нет ли вокруг врагов или союзников, вокруг оказались только враги - он оставил значение 1, а в это время (или через пару секунд) другой пехотинец обнаружил вокруг есть только союзники, и щит можно опускать - он поменял значение на 0, третьму понадобилось считать переменную, он взял 0 от второго, а тут первый решил взять своё значение 1 - опа, а там 0 от второго! и первый опустил щит) и получил в бубен Так переменная и пик делается после ожидания, разве нет?Добавлено (12 Октября 2012, 18:25:40) ---------------------------------------------
Quote (Ty3uK) а экзекут стартует функцию в текущем Нет. Проверить очень просто:Code function test takes nothing returns nothing call ExecuteFunc("test") endfunction Только проверять надо в полноэкранном режиме.
|
|
|
|
AU | Дата: Пятница, 12 Октября 2012, 18:29:46 | Сообщение # 25 |
7 уровень
Группа: Проверенные
Сообщений: 471
Награды: 0
Репутация: 70
Блокировки:
| Quote (AU) Событие: Боевая еденица атакована Условие: Тип атакованной боевой еденицы - пехотинец или Тип udg_ЖдущийПехотинец - пехотинец Действия: local unit атакованный = attacked unit Если udg_ЖдущийПехотинец == нет боевой еденицы _Ничего Иначе _атакованный = udg_ЖдущийПехотинец _udg_ЖдущийПехотинец == нет боевой еденицы Конец условия wait 5 секунд Цикл для группы юнитов в радиусе от атакованного _Если пукнутый юнит враг атакованному, то __Set udg_ЕстьВраг = true _Ниаче __Ничего _Конец условия Конец цикла Если udg_ЕстьВраг == false, то _Приказать опустить щит атакованному Иначе _Set udg_ЕстьВраг = false _udg_ЖдущийПехотинец = атакованный _Запустить текущий триггер Конец условия Кстати, мне пришлось учесть неучтённый факт - если ненужно опускать щит, триггер закончится, и юнит так и останется держать щит вечно (нам ведь нужно, чтобы пех его опустил)
Сообщение отредактировал AU - Пятница, 12 Октября 2012, 18:32:09 |
|
|
|
|
|
|
|
|
|
|