|
|
|
|
[JASS] Урок 2. Потоки, синхронность, структура триггера
|
|
Duosora | Дата: Среда, 27 Марта 2013, 22:09:36 | Сообщение # 1 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Есть два способа создания дизайна программы. Один из них, это сделать его настолько простым, что в нем, очевидно, не будет недостатков. Другой способ — сделать его настолько запутанным, что в нем не будет очевидных недостатков. — Чарльз Энтони Ричард Хоар
Рад вас видеть снова на втором уроке по языку JASS! На прошлом уроке мы разобрались, что такое JASS и где его писать. Сегодня я познакомлю вас с более интересными аспектами языка JASS.
Начну урок с объяснения вам того, что такое поток. В бытовом смысле поток - течение, например, воды из крана. Наблюдали, как течёт вода? Точно так же передаются данные по такому же "потоку", только не водному, а информационному. В одном потоке все действия, которые вы хотите совершить, выполняются не параллельно, а друг за другом. Стоит заметить, что в WarCraft 3 настоящий поток только один. На будущее прошу запомнить: таймеры и события используют псведопотоки (кажется, что это настоящие потоки, но это не так). С таймерами мы более подробно познакомимся позднее, а вот события сегодня вам ещё встретятся.
Сталкивались ли вы с понятием "синхронизация"? Думаю, многие знают, что это такое. Противоположное ему понятие "десинхронизация" мы с вами разберём позднее, оно требует кое-каких знаний кода. А вот что такое синхронный и асинхронный код, я расскажу сейчас и покажу на примере, как он реализуется. Потоки имеют нехорошее свойство перегружаться и заставлять игру зависать. Использование асинхронного кода позволяет движку отвечать на запросы во время выполнения длительных операций в вашей карте. Поэтому предпочтительнее использовать именно такой код. Дело в том, что если использовать синхронный код, тогда при перегрузке потока запущенный WarCraft 3 не будет отвечать ни на какие запросы и попросту зависнет. А в асинхронном коде всё будет так, как будто никакой перегрузки и не было! Красота, которой в GUI добиться крайне сложно без костылей.
Поговорив о потоках и синхронности кода, я спокойно начинаю описывать вам структуру триггера. Ранее я уже говорил, что JASS - язык событийно-ориентированный. Это значит, что действия выполняются в ответ на какое-нибудь событие, если оно удовлетворяет условиям (в случае наличия таковых). Отсюда выводим типовую структуру кода любого триггера: Событие -> Условие -> Действия. Всё, достаточно теории. Переходим к практике.
Создайте новый триггер. Сконвертируйте его в код. Как это делать, я писал в уроке 1. Что вы видите? Пока что непонятную, совершенно неструктурированную кашу букв. Будем разбираться. Для начала усвойте простое правило: русскоязычное название триггера для нас криминал, потому что, если, например, триггер называется "Безымянный триггер 001", то его название будет интерпретировано конвертером кода, как "______________________________________001". Зачем вам этот геморой? Поэтому считайте, что я лично вам запретил называть триггеры на русском языке. Ваш триггер всё ещё с русскоязычным названием? Тогда мы идем к Вам! Я назвал триггер HelloWorld. У меня получилось вот это: Код function Trig_HelloWorld_Actions takes nothing returns nothing endfunction
//=========================================================================== function InitTrig_HelloWorld takes nothing returns nothing set gg_trg_HelloWorld = CreateTrigger( ) call TriggerAddAction( gg_trg_HelloWorld, function Trig_HelloWorld_Actions ) endfunction
Сначала давайте подумаем, что мы видим знакомого. Да! Нам встречается имя нашего триггера, причём несколько раз. Trig_HelloWorld_Actions, InitTrig_HelloWorld, gg_trg_HelloWorld. Первые два элемента, куда входит знакомое нам название - функции, выполняющие наши действия. Последний - это глобальная переменная, в которой хранится наш триггер. Подчеркну, что функция, имя которой начинается с InitTrig_, обязательна для любого триггера - там как раз и задаётся, где будут события, где условия, а где - действия. Вкратце (пока что вкратце!) объясню: переменная - это ячейка памяти. Она как коробка: может в себе что-то содержать, а может просто быть пустой. В нашем конкретном случае переменная не пустая. Мы начнём наше знакомство с программированием на JASS классическим для всех программистов путём: выведем на экран слова "Hello, World!". Удалите созданный вами триггер, создайте новый с таким же именем и поставьте ему в события "Время - Прошло 0.00 секунд с начала игры". Теперь сконвертируем наш триггер. Появилась новая непонятная для нас пока строка: это событие. Поднимаемся до функции Trig_HelloWorld_Actions, ставим пустую строчку перед endfunction. В ней прописываем то, что выведет наше сообщение: call BJDebugMsg("Hello, World!"). Если всё сделано правильно, то при запуске карты появится надпись: Hello, World!
Всем спасибо, на третьем уроке мы изучим, что такое функции и как они работают.
Домашнее задание:- Создайте новую карту размером 32х32, изначально на мелководье.
- Откройте Редактор триггеров, удалите оттуда все триггеры.
- Создайте папку "Домашние задания" в Редакторе триггеров.
- Создайте триггер "Lesson2" в папке "Домашние задания".
- Выведите текст "Домашнее задание второго урока" спустя 3 секунды после начала игры.
- Сохраните карту и пришлите мне в ЛС.
Вопросы по теории:- Если проводить аналогию программирования с пахотным делом, что является "жнецом" кода?
- Как написать текст с двойными кавычками в строке в JASS?
- Проводя аналогию потока с текущей водой, как объяснить на языке программиста внезапную заморозку воды?
- Проводя аналогию потока с текущей водой, что означает открытие и закрытие крана?
- Если бы условия и действия поженились и переехали жить к условиям, код был бы асинхронный или синхронный?
- Как правильно: Jass, JASS, Jass2, J или JASS2, когда речь идёт о языке скриптинга на WarCraft?
- Можно ли называть триггеры по-корейски?
Ответы также присылайте мне в ЛС. Тот, кто ответит на все вопросы, получает 5+ по начальной теории Jass и от меня и Тузика получает жирный плюс в репутацию.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
Ramazan(off) | Дата: Среда, 27 Марта 2013, 22:59:36 | Сообщение # 2 |
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 775
Блокировки:
| Я понял и знал это, но могу понять ещё кое-что. Новички опустят руки после таких заумностей.
|
|
|
|
vladhellgate | Дата: Среда, 27 Марта 2013, 23:06:15 | Сообщение # 3 |
7 уровень
Группа: Проверенные
Сообщений: 255
Награды: 0
Репутация: 33
Блокировки:
| сказали же в лс... меня переполняют чувства...
|
|
|
|
anree | Дата: Среда, 27 Марта 2013, 23:13:46 | Сообщение # 4 |
3 уровень
Группа: Проверенные
Сообщений: 43
Награды: 0
Репутация: 26
Блокировки:
| Цитата (Duosora) Выведите текст "Домашнее задание второго урока" спустя 3 секунды после начала игры. на всякий случай спрошу:сделать триггерно Text Message или просто коментарий к триггеру?
|
|
|
|
Ty3uK | Дата: Четверг, 28 Марта 2013, 00:32:56 | Сообщение # 5 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| У Лавсона ошибка есть, не ссыте.
|
|
|
|
goldplay99 | Дата: Четверг, 28 Марта 2013, 00:33:29 | Сообщение # 6 |
1 уровень
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 0
Блокировки:
| Или переменная-триггер
Я знаю *ВСЕ*, но *ВСЕ* - ничегошеньки незнает обо мне.
|
|
|
|
lawson | Дата: Четверг, 28 Марта 2013, 00:38:55 | Сообщение # 7 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Ty3uK, пфф, пропали мои +10
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Ty3uK | Дата: Четверг, 28 Марта 2013, 00:56:02 | Сообщение # 8 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Да я тебе экстерном могу за знания дать И за то, что ты няшка
|
|
|
|
Kakolookia | Дата: Четверг, 28 Марта 2013, 07:21:24 | Сообщение # 9 |
6 уровень
Группа: Проверенные
Сообщений: 220
Награды: 0
Репутация: 93
Блокировки:
| А почему именно на мелководье? Это понадобится в следующих уроках?
|
|
|
|
lawson | Дата: Четверг, 28 Марта 2013, 11:36:49 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Ty3uK,
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
SirNikolas | Дата: Четверг, 28 Марта 2013, 12:01:14 | Сообщение # 11 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Асинхронный код на втором уроке?
|
|
|
|
lawson | Дата: Четверг, 28 Марта 2013, 12:02:15 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Цитата (SirNikolas) Асинхронный код на втором уроке? шмуос молодец, может хоть это отпугнет будущих картостроителей от этой затеи.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
Imba_pvL | Дата: Четверг, 28 Марта 2013, 12:12:32 | Сообщение # 13 |
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
| у меня все получилось, Дуосон принимай)
|
|
|
|
Ty3uK | Дата: Четверг, 28 Марта 2013, 12:55:01 | Сообщение # 14 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Да тут об ассинхронном коде крохи инфы.
|
|
|
|
Duosora | Дата: Четверг, 28 Марта 2013, 17:47:07 | Сообщение # 15 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Цитата (Kakolookia) А почему именно на мелководье? Это понадобится в следующих уроках? Абсолютно верно. Там будут примеры гораздо разнообразнее. Цитата (SirNikolas) Асинхронный код на втором уроке? С другой стороны, почему бы обзорно не ознакомить? Цитата (anree) на всякий случай спрошу:сделать триггерно Text Message или просто коментарий к триггеру? Всё в уроке ведь написано. Никаких действий в триггере, только руками и кодом.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
Imba_pvL | Дата: Четверг, 28 Марта 2013, 18:34:47 | Сообщение # 16 |
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
| Duosora, Тебе ответы на вопросы пришли??? Цитата (Fredbob) как часто будут выходить уроки? для вопросов есть другая тему
|
|
|
|
anree | Дата: Пятница, 29 Марта 2013, 02:40:40 | Сообщение # 17 |
3 уровень
Группа: Проверенные
Сообщений: 43
Награды: 0
Репутация: 26
Блокировки:
| Цитата (Duosora) Всё в уроке ведь написано. Никаких действий в триггере, только руками и кодом. А, понял. Мне даже стыдно.
|
|
|
|
Imba_pvL | Дата: Пятница, 29 Марта 2013, 13:00:26 | Сообщение # 18 |
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
| так пришли или нет?
|
|
|
|
Duosora | Дата: Пятница, 29 Марта 2013, 14:13:27 | Сообщение # 19 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Цитата (Imba_pvL) Тебе ответы на вопросы пришли??? Да, прочёл) Ждите в субботу-воскресенье урок о функциях.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
Imba_pvL | Дата: Пятница, 29 Марта 2013, 14:14:40 | Сообщение # 20 |
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
| А можно узнать результаты?) того и того
|
|
|
|
Fredbob | Дата: Суббота, 30 Марта 2013, 05:55:10 | Сообщение # 21 |
1 уровень
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Блокировки:
| Duosora, я конечно не вправе критиковать но если уж показываешь код то объясняй что к чему как что работает и для чего это(прости за прямой текст)
|
|
|
|
Duosora | Дата: Суббота, 30 Марта 2013, 13:26:00 | Сообщение # 22 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Цитата (Fredbob) я конечно не вправе критиковать но если уж показываешь код то объясняй что к чему как что работает и для чего это(прости за прямой текст Откровенность за откровенность: если я сейчас начну объяснять, как и что работает в этом коде, то всё объяснение не поместится в один пост.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
Fredbob | Дата: Суббота, 30 Марта 2013, 14:25:05 | Сообщение # 23 |
1 уровень
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Блокировки:
| Duosora, я же не говорю прям все подробно просто общее понятие доступным и простым языком
|
|
|
|
Zikkrat | Дата: Суббота, 30 Марта 2013, 15:01:47 | Сообщение # 24 |
1 уровень
Группа: Пользователи
Сообщений: 2
Награды: 0
Репутация: 0
Блокировки:
| Fredbob, Цитата (duos) Иди в гугл, не мозоль глаза. Добавлено (30 Марта 2013, 15:01:47) --------------------------------------------- Imba_pvL, Он их сам не знает.
|
|
|
|
Imba_pvL | Дата: Суббота, 30 Марта 2013, 15:12:42 | Сообщение # 25 |
10 уровень
Группа: Проверенные
Сообщений: 3151
Награды: 1
Репутация: 1260
Блокировки:
| Цитата (Zikkrat) Он их сам не знает. ??? Дуосон, давай к след.уроку))Добавлено (30 Марта 2013, 15:12:42) --------------------------------------------- но сначала скажи результаты
|
|
|
|
|
|
|
|
|
|
|