Сейчас 13:51:50 Вторник, 7 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Система] Format
[Система] Format
SirNikolasДата: Вторник, 19 Июня 2012, 10:03:13 | Сообщение # 1
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Начну я, пожалуй, с того, что есть в языке cJASS прекрасная библиотека под названием printf. Подробно я ее описывать не буду, если интересно - почитаете официальный мануал. Хороша она тем, что все вызовы ее функций (кроме B2S) подставляются прямо в код, и на выходе получается самая обыкновенная строка. По производительности абсолютно не уступает стандартному методу работы со строками, однако для ее корректной работы форматирующая строка должна быть константной, т. е. известной на стадии компиляции. И здесь мы плавно подходим к моей системе.

Функция (вернее, набор функций) Format выполняет ту же работу - подставляет переданные значения в форматирующую строку. Важным отличием является то, что она работает в момент исполнения кода, а не в момент компиляции, что позволяет передавать любую строку в качестве форматной. Например, это может использоваться для поддержки мультиязычности. Язык переключает каждый игрок только для себя.

У printf синтаксис (как и название) взят из языка C, Format же частично использует обозначения C#:
Код
call BJDebugMsg(Format("Это форматная строка, в которую будут подставлены: логическая {0}, целочисленная {1} и ID handle'а {2}.", FmtB(true) + FmtI(100500) + FmtH(GetTriggerUnit())))

Сначала в Format передается строка, а затем - аргументы, пропущенные через соответствующие преобразующие функции и разделенные знаком '+'. Вот список этих функций:
Код
FmtB(bool)
FmtBI(bool)
FmtI(int)
FmtHex(int)
FmtR(real)
FmtRound(real)
FmtRW(real, int width, int precision)
FmtS(string)
FmtH(handle)
FmtG(int gold)
FmtP(player)
FmtIP(int id)
FmtPC(player)
FmtIPC(int id)
FmtC(int id)
FmtEndl()
Заметьте, что строки необходимо передавать через FmtS.

Теперь о частных случаях.
Вам совсем не обязательно использовать аргументы в том порядке, в котором Вы их передаете:
Код
call BJDebugMsg(Format("{1}{0}", FmtI(1) + FmtI(0)))
Это выведет на экран телефон службы спасения.

Вы также можете использовать параметры несколько раз или не использовать вовсе.
Если в фигурных скобках указано неверное число, они будут выведены как есть:
Код
call BJDebugMsg(Format("{2}{-1}{test}{0}", FmtI(123)))
Второго аргумента здесь нет, минус первого быть просто не может, "test" вообще не является номером, так что вывод будет составлять "{2}{-1}{test}123".

Если же Вам нужно принудительно вывести фигурные скобки с числом (ну, вдруг кому понадобится), поставьте перед ними значок акцента ("`{1}"). Для выведения самого акцента его нужно удвоить (``).

После каждого изменения имен игроков необходимо вызывать функцию Format_UpdatePlayerNames(). Если же они изменяются в самом начале игры, установите константу AUTO_INITIALIZE_NAMES в значение false.

Напоследок расскажу о "подарочном наборе" функций.
В библиотеку входит открытая функция IsZero(string), позволяющая узнать, является ли данная строка корректным представлением числа ноль (строки "00", "-0", "-----0", "---000" являются).
Функции FmtDisplay(string format, ...) и FmtDisplayTimed(real time, string format, ...) выводят форматированную строку на экран локальному игроку. Также есть FmtDebug - аналог BJDebugMsg.

Комментируем, господа.


 

Ty3uKДата: Вторник, 19 Июня 2012, 10:10:35 | Сообщение # 2
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
SirNikolas, Я ХОЧУ ОТ ТЕБЯ ДЕТЕЙ
Ты не мог бы как-нибудь выложить ман по этой библиотеке? (я про стандартную printf)
Хоть немного и знаю Си и плюсы, но в cJass'овской путаюсь ):


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Вторник, 19 Июня 2012, 11:17:39 | Сообщение # 3
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Я думал, здесь относительно понятно написано.

Вызываем printf, передаем форматную строку, в которой на месте подставляемых значений ставим эти символы:
Quote
%p - имя игрока, принимает player
%pc - цветное имя игрока, принимает player
%i - десятичное число, принимает int
%igold - десятичное число, золото, принимает int
%ilumb - десятичное число, древесина, принимает int
%ip - имя игрока, принимает int (номер игрока)
%ipc - цветное имя игрока, принимает int (номер игрока)
%b - bool, выводит "true" или "false"
%r - вещественное число, без форматирования, принимает real
%s - строка, в случае передачи immed значение "склеится" с источником
%v - var, прямая подстановка аргумента в строку
%h - десятичное число, ид дескриптора, принимает соответсвенно дескриптор (handle)
Последующими аргументами перечисляем значения в том порядке, в котором они идут в строке. Если значение используется несколько раз - пишем его несколько раз.

printf("%ipc has just pwned %ipc's head! for %igold gold!", killer, victim, GetHeroLevel(victim) * 50);


 

Ty3uKДата: Вторник, 19 Июня 2012, 11:20:13 | Сообщение # 4
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
все, спасибо. я тебя обожаю :3

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

DragoNДата: Суббота, 12 Января 2013, 18:15:36 | Сообщение # 5
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
it's fucking amazing
соглашусь с Максимкой, тоже хочу от тебя детей
ты сделал то, до чего у меня руки из-за кривости их и лени не дошли нормально(я про {x}), давно эту фишку из шарпа привинтить хотел)
всем рекомендую)


El Psy Congroo
 

SirNikolasДата: Воскресенье, 13 Января 2013, 14:42:13 | Сообщение # 6
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Да зря ты так, ничего особо сложного. У меня на эту функцию ушло где-то около суток.

 

DragoNДата: Воскресенье, 13 Января 2013, 22:49:14 | Сообщение # 7
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
сделай на дефайнах, был бы неплохо

El Psy Congroo
 

Ty3uKДата: Воскресенье, 13 Января 2013, 23:01:31 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
DragoN, там идея динамической работы, а дефайны и статик ифы - препроцессорная обработка.

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

DragoNДата: Понедельник, 14 Января 2013, 15:47:01 | Сообщение # 9
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Ty3uK, а что мешает сделать и препроцессорный вариант
не для всего же динамика нужна, а так и скорость работы повысить можно


El Psy Congroo
 

Ty3uKДата: Понедельник, 14 Января 2013, 16:01:23 | Сообщение # 10
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
DragoN, а препроцессорный - это и есть чистая cj_print

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Понедельник, 14 Января 2013, 18:12:23 | Сообщение # 11
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
DragoN, Ty3uK все правильно сказал.
К тому же, я сомневаюсь, что на cJass возможно парсить строку на стадии компиляции.


 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Система] Format
  • Страница 1 из 1
  • 1
Поиск:

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