Сейчас 05:43:19 Суббота, 28 января, 2023 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » [JASSфак] Лекция 1. Первое знакомство с JASS.
[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
Блокировки:
Quote (Emag)
- мегаубил

-_-
Ну ошибся человек, ну и что? Как будто ты сам никогда не ошибаешся.
 

[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 и конвертор не запрещено?? А то по памяти я не очень много функций помню :D
 

СорнемусДата: Понедельник, 16 Ноября 2009, 15:17:50 | Сообщение # 9
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
Quote (|DUОS|)
- Сконвертировать триггер в код и проделать внутри функции Actions пару действий.

Выполнил:

ЗЫ: Сильно не пинать. Если есть ошибки то указывать на них.

Добавлено (16-11-2009, 15:17)
---------------------------------------------
Делал это для себя, когда читал статью Serge'я "Осваиваем Jass".

Прикрепления: 0929764.jpg(124.6 Kb)
 

[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], я прочел статью и даже почти все понял :D . Вот вроде бы оптимизировал как мог и избавился от BJ функций. Я понял, что в JNPG BJ функции красным цветом выделяются. :D
 

СорнемусДата: Понедельник, 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...


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » [JASSфак] Лекция 1. Первое знакомство с JASS.
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск:

Copyright © 2006 - 2023 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz