|
|
|
|
[JASSфак] Лекция 1. Первое знакомство с JASS.
|
|
[DUОS] | Дата: Воскресенье, 15 Ноября 2009, 22:18:21 | Сообщение # 1 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Итак, приветствую всех учеников JASSфака! Сегодня мы познакомимся с базовыми принципами JASS, сделаем свои первые шаги в коде. Начнём мы с элеметарного - конвертация триггера в JASS и структура действия. Начнём! Создайте новый триггер и событием Map Initialization. Теперь сконвертируйте его в код (Правка - Конвертировать в текст). Теперь он будет выглядеть так: function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing endfunction //=========================================================================== function InitTrig_Untitled_Trigger_001 takes nothing returns nothing set gg_trg_Untitled_Trigger_001 = CreateTrigger( ) call TriggerAddAction( gg_trg_Untitled_Trigger_001, function Trig_Untitled_Trigger_001_Actions ) endfunction Многие части этого кода зависят от того, какое у триггера название. Я назвал свой "Untitled Trigger 001". Теперь мы добавим действие, которое отобразит игрокам текст. Действие - это функция, которая вызывает группу кода для выполнения какого-нибудь процесса. calll DisplayTimedTextToForce( GetPlayersAll(), 30, "hello" ) Это действие отобразит текст "hello" на 30 секунд всем игрокам. Запомните! Любую функцию надо вызвать, поэтому перед её названием надо написать "call". Разберёмся с действиями на примере этого же вызова текста. У вас возникнет вопрос: "Как определить, что же мне писать в скобках?" Самый хороший способ - изучить начинку функции. Используем для этого программу JassCraft. Справа есть список функций. Вводите в поиск нужную и кликайте на неё. Снизу покажется строка. Это и есть начинка функции. После строки takes указываются типы, которые нужно указать в скобках именно в таком порядке, в котором они объявлены. Например: function DisplayTimedTextToForce takes force f, real wait, string value returns nothing Мы должны через запятую перечислить эти типы в скобках, что мы и делаем. function DisplayTimedTextToForce (GetPlayersAll(), 30, "hello") Вот мы и научились вызывать функции. В следующей лекции - о локальных переменных. Задания: - Сконвертировать триггер в код и проделать внутри функции Actions пару действий.
|
|
|
|
nikikin | Дата: Воскресенье, 15 Ноября 2009, 23:00:08 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 5397
Награды: 3
Репутация: 1805
Блокировки:
| а мне тоже можно учится?
|
|
|
|
[DUОS] | Дата: Воскресенье, 15 Ноября 2009, 23:35:42 | Сообщение # 3 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| nikikin, Да
|
|
|
|
Emag | Дата: Понедельник, 16 Ноября 2009, 08:04:27 | Сообщение # 4 |
1 уровень
Группа: Заблокированные
Сообщений: 9
Награды: 0
Репутация: 7
Блокировки:
| Quote (|DUОS|) которая вызывает группу кода для выполнения какого-нибудь процесса. - рас Quote (|DUОS|) типы, которые нужно указать - два Quote (|DUОS|) function DisplayTimedTextToForce (GetPlayersAll(), 30, "hello") - мегаубил
|
|
|
|
nikikin | Дата: Понедельник, 16 Ноября 2009, 12:43:37 | Сообщение # 5 |
Группа: Проверенные
Сообщений: 5397
Награды: 3
Репутация: 1805
Блокировки:
| Emag, *facepalm*
|
|
|
|
Сорнемус | Дата: Понедельник, 16 Ноября 2009, 14:44:03 | Сообщение # 6 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| -_- Ну ошибся человек, ну и что? Как будто ты сам никогда не ошибаешся.
|
|
|
|
[DUОS] | Дата: Понедельник, 16 Ноября 2009, 14:50:06 | Сообщение # 7 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Сорнемус, Это же Алиса, как не понять...
|
|
|
|
Djimm | Дата: Понедельник, 16 Ноября 2009, 15:15:16 | Сообщение # 8 |
5 уровень
Группа: Проверенные
Сообщений: 117
Награды: 0
Репутация: 20
Блокировки:
| Quote (|DUОS|) Задания: - Сконвертировать триггер в код и проделать внутри функции Actions пару действий. Вот. Надеюсь использовать JNPG и конвертор не запрещено?? А то по памяти я не очень много функций помню
|
|
|
|
Сорнемус | Дата: Понедельник, 16 Ноября 2009, 15:17:50 | Сообщение # 9 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| Quote (|DUОS|) - Сконвертировать триггер в код и проделать внутри функции Actions пару действий. Выполнил: ЗЫ: Сильно не пинать. Если есть ошибки то указывать на них.Добавлено (16-11-2009, 15:17) --------------------------------------------- Делал это для себя, когда читал статью Serge'я "Осваиваем Jass".
|
|
|
|
[DUОS] | Дата: Понедельник, 16 Ноября 2009, 17:21:47 | Сообщение # 10 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (Djimm) Надеюсь использовать JNPG и конвертор не запрещено?? А то по памяти я не очень много функций помню :D Quote (|DUОS|) Используем для этого программу JassCraft. Добавлено (16-11-2009, 17:21) --------------------------------------------- Сорнемус, Я тебя пинать не буду, я просто попрошу тебя прочитать эту статью, там рассказано, как код лучше сделать. Писал я. И вышли код.
|
|
|
|
Сорнемус | Дата: Понедельник, 16 Ноября 2009, 17:25:58 | Сообщение # 11 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| Quote (|DUОS|) Сорнемус, Я тебя пинать не буду, я просто попрошу тебя прочитать эту статью, там рассказано, как код лучше сделать. Писал я. И вышли код. Спасибо, буду читать.
|
|
|
|
[DUОS] | Дата: Понедельник, 16 Ноября 2009, 17:31:43 | Сообщение # 12 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Djimm, То же самое. Отучись от бж. Хотя прикольная мапка.
|
|
|
|
0x4453 | Дата: Понедельник, 16 Ноября 2009, 18:18:08 | Сообщение # 13 |
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: 13
Блокировки:
| Сорнемус, и оптимизируй условие вместо тонны кода(всякие return true,return false),что валяеться в теле условия спелла запиши следующее: Code return GetSpellAbilityId() == 'A001'
|
|
|
|
Djimm | Дата: Понедельник, 16 Ноября 2009, 19:06:09 | Сообщение # 14 |
5 уровень
Группа: Проверенные
Сообщений: 117
Награды: 0
Репутация: 20
Блокировки:
| [DUОS], я прочел статью и даже почти все понял . Вот вроде бы оптимизировал как мог и избавился от BJ функций. Я понял, что в JNPG BJ функции красным цветом выделяются.
|
|
|
|
Сорнемус | Дата: Понедельник, 16 Ноября 2009, 20:24:19 | Сообщение # 15 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| Quote (Djimm) . Вот вроде бы оптимизировал как мог и избавился от BJ функций. Я не учитель, но скажу: Добавление золота можно сделать и циклом. Добавлено (16-11-2009, 20:23) --------------------------------------------- Вот моя карта. Добавлено (16-11-2009, 20:24) --------------------------------------------- ЗЫ: У меня 1.24.
Сообщение отредактировал Сорнемус - Понедельник, 16 Ноября 2009, 20:30:11 |
|
|
|
[DUОS] | Дата: Понедельник, 16 Ноября 2009, 21:47:33 | Сообщение # 16 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (Сорнемус) Я не учитель, но скажу: Добавление золота можно сделать и циклом. Сорнемус, Можно. Но и так неплохо. По карте: можно оставить BJ в TriggerRegisterAnyUnitEventBJ() PS: текст не высвечивается. Ты что-то упустил в действиях. Djimm, PLAYER_STATE_RESOURCE_GOLD можно упростить. Обратись с функцией к джасскрафту. Добавлено (16-11-2009, 21:47) --------------------------------------------- Хотел бы увидеть работы ShadowDragon, Deadly-man
|
|
|
|
Djimm | Дата: Понедельник, 16 Ноября 2009, 21:58:17 | Сообщение # 17 |
5 уровень
Группа: Проверенные
Сообщений: 117
Награды: 0
Репутация: 20
Блокировки:
| Quote (|DUОS|) PLAYER_STATE_RESOURCE_GOLD можно упростить. Обратись с функцией к джасскрафту. Действительно, можно упростить. А вот по поводу цикла. Как лучше делать в будущем - с циклом или без разницы впринципе???
|
|
|
|
Сорнемус | Дата: Понедельник, 16 Ноября 2009, 22:21:58 | Сообщение # 18 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| Quote (|DUОS|) PS: текст не высвечивается. Ты что-то упустил в действиях. Сейчас исправлю.
Сообщение отредактировал Сорнемус - Понедельник, 16 Ноября 2009, 22:46:22 |
|
|
|
[DUОS] | Дата: Вторник, 17 Ноября 2009, 01:23:17 | Сообщение # 19 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (Djimm) А вот по поводу цикла. Как лучше делать в будущем - с циклом или без разницы впринципе??? Смотря от случая. Где-то цикл, где-то таймер. Где задержка равна более 0.1 секунды, тогда цикл Где менее - тогда таймер.
|
|
|
|
Сорнемус | Дата: Вторник, 17 Ноября 2009, 01:24:10 | Сообщение # 20 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| Ничего не понимаю... Вот функция SetTextTagTextBJ только и делает что вызывает native SetTextTagText, а выходит так что код call SetTextTagTextBJ( t, "Hello", 10) call SetTextTagPosUnitBJ( t, u, 0) call SetTextTagColorBJ( t, 255, 255, 255, 0) call TriggerSleepAction( 2 ) call DestroyTextTag( t ) работает, в отличии от call SetTextTagText( t, "Hello", 10) call SetTextTagPosUnit( t, u, 0) call SetTextTagColor( t, 255, 255, 255, 0) call TriggerSleepAction( 2 ) call DestroyTextTag( t ) Хотя у них практически одинаковое действие. И BJ и native берут одно и тоже, а если использовать только native нифига не пашет. Вот карта. Чтобы вобще не было БЖ не выходит. =( Только так работает. Если всё же можно дальше оптимизировать, то, пожалуйста, покажите как =(
|
|
|
|
[DUОS] | Дата: Вторник, 17 Ноября 2009, 14:18:51 | Сообщение # 21 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Сорнемус, Оптимизировать до native возможно, однако надо следить за начинкой функции. Давай разберёмся с твоими BJ. call SetTextTagTextBJ( t, "Hello", 10) оптимизации до native поддаётся. Заглядываем в начинку. function SetTextTagTextBJ takes texttag tt, string s, real size returns nothing local real textHeight = TextTagSize2Height(size) call SetTextTagText(tt, s, textHeight) endfunction Мы видим, что по поводу этой функции ты не прав. Здесь проводятся дополнительные расчёты. Развернём TextTagSize2Height. function TextTagSize2Height takes real size returns real return size * 0.023 / 10 endfunction Производим расчёт с твоим значением размера и у нас получится такая вот native - call SetTextTagText(t,"Hello",.023). call SetTextTagPosUnitBJ( t, u, 0) - опять же, обратимся к начинке: function SetTextTagPosUnitBJ takes texttag tt, unit whichUnit, real zOffset returns nothing call SetTextTagPosUnit(tt, whichUnit, zOffset) endfunction Всего лишь вызов native. Перепишем функцию без окончания BJ - call SetTextTagPosUnit( t, u, 0) call SetTextTagColorBJ( t, 255, 255, 255, 0) - смотрим начинку. function SetTextTagColorBJ takes texttag tt, real red, real green, real blue, real transparency returns nothing call SetTextTagColor(tt, PercentTo255(red), PercentTo255(green), PercentTo255(blue), PercentTo255(100.0-transparency)) endfunction Здесь дело немного сложнее. Хотя в случае, какой поставил ты, легко преобразовать, но всё же объясню. Итак, изучим начинку PercentTo255. function PercentTo255 takes real percentage returns integer return PercentToInt(percentage, 255) endfunction Эта функция преобразовывает проценты в целочисленную. Но изучим начинку PercentToInt. function PercentToInt takes real percentage, integer max returns integer local integer result = R2I(percentage * I2R(max) * 0.01) if (result < 0) then set result = 0 elseif (result > max) then set result = max endif return result endfunction В этой функции содержится формула и две проверки. Начнём с формулы. У тебя для всех цветов одинаковое значение percentage для всех 3-х цветов. Оно равно 255. Вычислим по формуле, чему будет равен результат: 255 * 255 * 0.01 = 650 (округлено до целых). Теперь по поводу проверок. Если результат меньше нуля, тогда результат становится равным нулю. Результат у нас больше нуля, так что это не про наше число. Вторая проверка: Если число-результат больше, чем максимальное значение (255), тогда результат становится равен максимуму (или 255). Проводим то же самое с прозрачностью. У нас получится 255. Учитывая всё это, раскроем BJ - call SetTextTagColor(t, 255, 255, 255, 255) call TriggerSleepAction( 2 ) - В тексттагах лучше использовать SetTextTagLifespan. Реальная определит, сколько текст провисит. call DestroyTextTag( t ) - убить тег мало, надо его обнулить в самом конце функции (set t = null) Надеюсь, всё разъяснил понятно.
|
|
|
|
Сорнемус | Дата: Вторник, 17 Ноября 2009, 15:08:27 | Сообщение # 22 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| Quote (|DUОS|) Оптимизировать до native возможно, однако надо следить за начинкой функции. Давай разберёмся с твоими BJ. Спасибо, теперь всё понял =) Quote (|DUОS|) убить тег мало, надо его обнулить в самом конце функции (set t = null) Я это делал. У меня в конце переменные u и t обнуляються.
|
|
|
|
[DUОS] | Дата: Вторник, 17 Ноября 2009, 15:11:51 | Сообщение # 23 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Сорнемус, Quote (Сорнемус) Я это делал. У меня в конце переменные u и t обнуляються. А, ну да... Quote (Сорнемус) Спасибо, теперь всё понял =) Будут ещё вопросы - задавай.
|
|
|
|
Akvarium | Дата: Вторник, 17 Ноября 2009, 18:08:28 | Сообщение # 24 |
8 уровень
Группа: Проверенные
Сообщений: 581
Награды: 1
Репутация: 87
Блокировки:
| ВОТ Вобще без BJ хоть и простая функция) ЗЫ: Когда 2 урок? (Просто интересно)
Сообщение отредактировал Akvarium - Вторник, 17 Ноября 2009, 18:47:13 |
|
|
|
[DUОS] | Дата: Вторник, 17 Ноября 2009, 19:03:12 | Сообщение # 25 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (Akvarium) Когда 2 урок? (Просто интересно) Akvarium, Ждём работы ShadowDragon...
|
|
|
|
|
|
|
|
|
|
|