Рейтинг - 5.0 (1)

Начинаем наш очередной урок, и здесь вы научитесь основным командам по рисованию на экране.

Что значит рисование? - Спросите вы. Это может быть любой текст или текстура, которые могут размещаться в любой точке экрана.

Экран как бы имеет свою координатную сетку, размер которой составляет "640.0" точек по ширине и "448.0" точек по высоте. Начальные координаты "0.0 0.0" и они находятся в правом верхнем углу. Вообще если в поисковике SB ввести слово DRAW, то вам выведется список всех команд, которые позволяют рисовать на экране. Рисование можно разбить на две большие группы:

  1. рисование текста
  2. рисование текстур

В этом уроке мы коснёмся только текста. Первым делом, рассмотрим опкод, который включает режим рисования:

03F0: enable_text_draw 1
Здесь:
1 - включить режим рисования. Если поставить 0 - выключить режим рисования. При смене интерьера, этот параметр сбивается на ноль, по этому его нужно снова включать.

Рассмотрим команды для рисования текста. Самый первый опкод, это:

033E: set_draw_text_position 320.0 180.333 GXT 'BJ_PUSH'
Здесь:
320.0 180.333 - координаты на экране. 1-й параметр - координата X ( по ширине ), 2-й - координата Y ( по высоте )
'BJ_PUSH' - имя GXT-записи, то есть текст, который содержится в этой записи, будет выведен на экран по координатам

С текстом можно делать разные манипуляции: изменять его цвет и размер:

0340: set_text_draw_RGBA 0 90 180 255
033F: set_text_draw_letter_size 1.3 3.36
Здесь:
0 - количество красного цвета ( канал R, от 0 до 255 )
90 - количество зелёного цвета ( канал G, от 0 до 255 )
180 - количество синего цвета ( канал B, от 0 до 255 )
255 - указывает прозрачность текста, если поставить 0, то текст не будет видно. Максимум - 255
1.3 - размер буквы по ширине
3.36 - размер буквы по высоте

Так же можно задать шрифт и обводку тексту опкодами:

0349: set_text_draw_font 0
081C: draw_text_outline 2 RGBA 10 20 30 255
Здесь:
0 - номер шрифта ( см. Стили текста - шрифт )
2 - плотность обводки ( см. Стили текста - Обводка )
10 - количество красного цвета ( канал R, от 0 до 255 )
20 - количество зелёного цвета ( канал G, от 0 до 255 )
30 - количество синего цвета ( канал B, от 0 до 255 )
255 - указывает прозрачность текста, если поставить 0, то текст не будет видно. Максимум - 255

Кроме этого, можно указать тень текста и её цвет, установить максимальную ширину текста:

060D: draw_text_shadow 0 color_RGBA 0 0 0 255
0343: set_text_draw_linewidth 640.0
Здесь:
0 - расстояние тени от текста
0 0 0 255 - указываются цвета тени и её прозрачность ( См. Стили текста - Тени )
640.0 - указать новую длину строки. Пример-сравнение текста по-умолчанию и текста, которому задали длину 300 символов вы также можете найти в нашей базе данных, внизу, внизу.

Есть возможность выравнивания текста:

0342: enable_text_draw_centered 1 // по-центру
03E4: enable_text_draw_align_right 1 // справа
0341: set_text_draw_align_justify 1 // расстягивает строку на максимальную длину ( пробелы кажутся более длинными )

И, напоследок, можно вывести какие то числовые переменные на экран:

045A: draw_text_1number 320.0 155.333 GXT 'ALLRACE' number 0@ // ~1~
045B: draw_text_2numbers 320.0 155.333 GXT 'TIME' numbers 0@ 0@ // ~1~ ~1~
07FC: text_draw_box_position_XY 320.0 155.333 GXT_reference 'BOAT_7' value 241@ flag 2 // value 2.43

Первый опкод выводит 1 переменную на экран. Второй опкод выводит 2 переменных на экран. Третий опкод выводит дробное число на экран.

Здесь:
320.0 155.333 - место расположения текста на экране
'ALLRACE', 'TIME', 'BOAT_7' - GXT-записи с текстом
0@ - переменная, в ней должно быть целое число ( можно указать и число, не обязательно переменную )
241@ - переменная, в ней должно быть дробное число
2 - выводит количество символов после запятой в дробном числе

Вот пример рисования:

:TEXT
thread 'TEXT'
wait 0
03F0: enable_text_draw 1

0226: $TEMP_HEALTH = actor $PLAYER_ACTOR health
0343: set_text_draw_linewidth 300.0
03E4: enable_text_draw_align_right 1
060D: draw_text_shadow 1 color_RGBA 0 0 0 255
0340: set_text_draw_RGBA 255 0 0 255
045A: draw_text_1number 30.0 10.0 GXT 'MAG_4OB' number $TEMP_HEALTH //~1~

04DD: $TEMP_ARMOUR = actor $PLAYER_ACTOR armour
0343: set_text_draw_linewidth 300.0
03E4: enable_text_draw_align_right 1
060D: draw_text_shadow 1 color_RGBA 0 0 0 255
0340: set_text_draw_RGBA 0 255 0 255
045A: draw_text_1number 60.0 10.10 GXT 'MAG_4OB' number $TEMP_ARMOUR //~1~

06AC: $TEMP_SPEED = actor $PLAYER_ACTOR movement_speed
0343: set_text_draw_linewidth 300.0
03E4: enable_text_draw_align_right 1
060D: draw_text_shadow 1 color_RGBA 0 0 0 255
0340: set_text_draw_RGBA 0 0 255 255
07FC: text_draw_1float_position_XY 90.0 10.0 GXT_reference 'MAG_4OB' value $TEMP_SPEED decimal_count 2
jump @TEXT

Как видите, всегда перед текстом пишутся параметры а потом рисуются. Если этого не сделать,то текст выведется по-умолчанию. Вот так выглядит рисованный нами текст:




Теги: drawing, draw, Text, рисование, текст

Vital   (29.06.13 16:35)
Почему стандартные опкоды вывода текста с переменной выводят дробные числа черт-те как? Я не пойму логики... Я попытался даже сделать алгоритм отделения нужной части после запятой, но безуспешно...

wmysterio   (29.06.13 17:55)
Покажи фрагмент кода, где ты выводишь число. Может я смогу помочь.

как вариант, можно записать в файл дробное число а затем считать его как двух целых

Vital   (29.06.13 18:04)
Код
0AB1: call_scm_func @GetSinCos 2 0@ 100.0 1@ 2@
  0092: 0@ = float 0@ to_integer
  0303: show_text_4numbers_highpriority GXT 'ANSC' numbers 0@ 1@ 0@ 2@ time 7500 flag 1
  break  
  end //8
  end //7
  end //6
  end //5
  end //4
  0AB1: call_scm_func @Safe 2 0 1
  end //3
  end //2
end //1

:GetSinCos
02F6: 2@ = sine 0@ // (float)
02F7: 3@ = cosine 0@ // (float)  
006B: 2@ *= 1@  // (float)
006B: 3@ *= 1@  // (float)
0092: 2@ = float 2@ to_integer
0092: 3@ = float 3@ to_integer
0093: 2@ = integer 2@ to_float
0093: 3@ = integer 3@ to_float  
0073: 2@ /= 1@ // (float)
0073: 3@ /= 1@ // (float)
0AB2: ret 2 2@ 3@

В 0@ - угол (целое отображение), в 1@ и 2@ - синус и косинус этого угла соответственно. В GetSinCos - получение этих значений и округление до сотых, то, что я как раз хотел самостоятельно создать как новенький алгоритм.

wmysterio   (29.06.13 18:54)
На сколько я знаю, опкод 0303 принимает 4 целых числа в качестве параметров. Получается:
Код
0093: 2@ = integer 2@ to_float
0093: 3@ = integer 3@ to_float   
0073: 2@ /= 1@ // (float)
0073: 3@ /= 1@ // (float)
...
0AB2: ret 2 2@ 3@
функция вернёт два дробных, что значит не соответствие параметрам опкода.

На твой вопрос "почему дробные криво отображаются" ответить не могу. Я знаю только 1 "стандартный" опкод, который выводит дробное - 07FC.

Но если использовать библиотеку Cleo 4.1, то задачу легко решить:
Код
0AD1: show_formatted_text_highpriority "%f %f %f %f" time 7500 0@ 1@ 0@ 2@
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Какие моды Вы хотите видеть на сайте?
Всего ответов: 5
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 2
Гостей: 1
Пользователей: 1
wmysterio
Сегодня нас посетили:
wmysterio, Dyabda
Реклама