Сейчас 15:14:45 Пятница, 27 декабря, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[vJass]Структуры, методы и плюшки
DragoNДата: Воскресенье, 19 Декабря 2010, 18:08:28 | Сообщение # 1
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:


Вступление



Что же такое vJass? Собственно это нечто вроде реализации ООП в Jass.
Я не буду распинаться и расписывать подробнее, поэтому приступим прямо к делу.
Начнём с плюшек.

Объявление глобальных переменных прямо в коде

Что в этом хорошего? Позволяет использовать переменные без противной приставки udg_. Как же это сделать? Очень просто. Объявим директиву глобальных переменных:

Code

    globals
     integer i // объявим нашу переменную i типа integer
endglobals

Вы можете спросить, что же делать, если нам надо несколько таких переменных? Очень просто, мы сделаем такие переменными приватными, как это сделать будет немного позже, когда мы будем проходить библиотеки и области.

Debug mode

Code
function TestFunc takes nothig returns nothing
       call MyFunc()
       debug call BJDebugMsg(“работает!!”)
endfunction

Если включен DeBug мод в редакторе, то при проверки карты из редактора сработают обе функции(и MyFunc и покажется «работает»), а если выключен, то сработает только вызов MyFunc



Структуры и методы



Структура (struct) - связка некоторых переменных, которая используется тоже как переменная, с помощью которой можно получить доступ к включаемых в нее переменных.

Структура очень сильное средство при создании заклинаний.

Объявляется следующим способом:

Code
struct  <имя>(без <>)
//тело структуры
endstruct

Пример:

Code
struct mystr
integer i
endstruct

Объявление структуры в коде:

Code
local <имя> <локальное имя>=<имя>.create()

    set <локальное имя>.переменная=... // обращение к переменной

call <имя>.destroy(<локальное имя>) или <локальное имя>.destroy() //удаление структуры

Пример

Code
local mystr test=mystr.create()
set test.i=1 //присваиваем значение 1 для переменной i в структуре
call test.destroy() // уничтожаем структуру для очищения памяти

Так же структура может включать в себя другие структуры и быть уникальными/публичными

Важно заметить что структура является сама по себе integer

Методы

Методы (method) - внутриструктурные функции, имеющие простой доступ к переменным в структуре, предназначенные для их изменения.

Объявляются так:

общая конструкция

Code

method <имя метода> takes <что берёт в качестве аргумента> returns <что возвращает>
    /*тело метода*/
endmethod

Пример:

Code
method mymthd takes integer t returns nothing
    set this.i=this.i+t
endmethod

Как вы заметили, методы обращаются к переменным через this.

Обновим нашу структуру с использованием метода:

Code
struct mystr
integer i

    method mymthd takes integer t returns nothing
    set this.i=this.i+t
endmethod

endstruct

function TestFunc takes nothing returns nothing

    local mystr test=mystr.create()

    call test.mymthd(1)

    call mystr.destroy(test)

endfunction

Так же бывают статичные методы

Статический (static) метод не берет аргумент this следовательно в нем нельзя обращаться к переменной через this.

Но, статический метод может использовать приватные (уникальные) переменные структуры, в которой он объявлен.

Метод onDestroy

Метод, обьявленый внутри структуры и имеющий имя onDestroy будет автоматически вызван при уничтожение данной структуры.

Code
struct MyStr

    method onDestroy takes nothing returns nothing
    endmethod

endstruct

function OutSide takes nothing returns nothing
    local MyStr A=MyStr.create()
    call A.destroy()
endfunction

Но я не советую использовать его, т.к он создаёт отдельный триггер, что плохо сказывается на оптимизации. Нормальный программист сам всё предусмотрит :)



Задание: Сделать заклинание


El Psy Congroo
 

rixt7956Дата: Понедельник, 20 Декабря 2010, 16:47:36 | Сообщение # 2
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Quote (Dragon93)
Структуры, методы и плюшки
Структуры ты описал, методы тоже, а где плюшки? :)
 

DragoNДата: Понедельник, 20 Декабря 2010, 17:37:54 | Сообщение # 3
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Quote (Dragon93)
Объявление глобальных переменных прямо в коде

Quote (Dragon93)
Debug mode

это только малая часть


El Psy Congroo
 

SirNikolasДата: Понедельник, 20 Декабря 2010, 17:43:28 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Забыл намекнуть, что структуры относятся к классу integer.

 

rixt7956Дата: Понедельник, 20 Декабря 2010, 18:14:10 | Сообщение # 5
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Dragon93, Мог бы сделать пример MUI спела при помощи структур?
 

DragoNДата: Понедельник, 20 Декабря 2010, 18:39:46 | Сообщение # 6
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Quote (SirNikolas)
Забыл намекнуть, что структуры относятся к классу integer.

это было в статье до отката
Quote (rixt7956)
Dragon93, Мог бы сделать пример MUI спела при помощи структур?

поищи на хайве их там доифга


El Psy Congroo
 

SirNikolasДата: Среда, 22 Декабря 2010, 13:06:51 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Скажите, нужно ли обнулять внутриструктурные handle'ы перед удалением самой структуры?

 

DragoNДата: Среда, 22 Декабря 2010, 14:31:28 | Сообщение # 8
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
необязательно, но желательно
просто, по-моему мнению при удаление структуры удаляются и все её объекты
а элементы структуры - те же глобалки(после компиляции)
будет время - запущу тест на скорость с удалением и без


El Psy Congroo
 

rixt7956Дата: Пятница, 24 Декабря 2010, 17:40:08 | Сообщение # 9
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Dragon93, Сделай плз самый простой пример MUI спела с таймером при помощи структур

Сообщение отредактировал rixt7956 - Пятница, 24 Декабря 2010, 17:40:22
 

SirNikolasДата: Среда, 29 Декабря 2010, 18:26:23 | Сообщение # 10
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
А как можно сделать, чтобы при истечении таймера вызывался метод?

 

DragoNДата: Среда, 29 Декабря 2010, 19:23:10 | Сообщение # 11
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
SirNikolas, сделать структуру глобалкой и вызывать с неё
как вариант вешать саму структуру на хэндл таймера, в другой функции её вытаскивать и вызывать метод


El Psy Congroo
 

rixt7956Дата: Четверг, 30 Декабря 2010, 14:51:43 | Сообщение # 12
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Quote (rixt7956)
Dragon93, Сделай плз самый простой пример MUI спела с таймером при помощи структур
 

SirNikolasДата: Четверг, 30 Декабря 2010, 16:03:34 | Сообщение # 13
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
rixt7956,
Quote (DragoN)
как вариант, вешать саму структуру на хэндл таймера, в другой функции её вытаскивать
DragoN, второй способ я знаю и как раз думаю, как его можно оптимизировать. Насчет первого: мне нужно, чтобы метод использовал переменные структуры, которые я заранее задам, так что глобальная структура не подходит. Я думал, можно сделать что-то вроде
Code
call TimerStart(t,timeout,periodic, function str.mymthd)


 

rixt7956Дата: Понедельник, 17 Января 2011, 21:52:07 | Сообщение # 14
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Так как структуры - это глобалки, а обращение к локалкам намного быстрее чем к глобалкам, стоит ли с точки зрению оптимизизации выгружать структуры в локалки?
 

lawsonДата: Вторник, 01 Марта 2011, 19:37:59 | Сообщение # 15
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
DragoN,
Мог бы привести примеры практичного использования структур и методов?


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

DragoNДата: Вторник, 01 Марта 2011, 21:46:25 | Сообщение # 16
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Quote (lawson)

Мог бы привести примеры практичного использования структур и методов?

спеллов на хайве с vJass и структурами куча


El Psy Congroo
 

EdiTTORRДата: Четверг, 03 Марта 2011, 00:01:19 | Сообщение # 17
8 уровень
Группа: Проверенные
Сообщений: 585
Награды: 0
Репутация: 147
Блокировки:
Quote (DragoN)
будет время - запущу тест на скорость с удалением и без

а не проще ли посмотреть в мануале или скомпилированном коде?


Местами здесь.
 

  • Страница 1 из 1
  • 1
Поиск:

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