ФЭНДОМ


Рендер текста Первое, с чего мы начнем, это создание шрифта и рендер текста с помощью него.

Для создания шрифта используем опкод opcodes:0b6d, но перед тем, как делать инициализацию шрифта, приведу таблицу флагов(все эти флаги имеются в инклуд файле SF, который распространяется вместе с архивом):   Данные флаги можно объединять путем сложения. К примеру, если необходим полужирный текст с обводкой, то:

  • Первый флаг(flag1) = FCR_BOLD = 1
  • Второй флаг(flag2) = FCR_BORDER = 4
  • Конечный результат FCR_BOLD + FCR_BORDER = 1 + 4 = 5

Т.е. флаг 5 является сочетанием FCR_BOLD и FCR_BORDER

Создаем шрифт:

{$CLEO}

0000:

0B6D: render 0@ = create_font "Arial" height 11 flags 5

while true
    wait 0
end

Выделить кодCLEOВ переменную 0@ запишется указатель на этот самый шрифт, чтобы в дальнейшем рендерить текст и узнавать некоторые его свойства. Мы создали шрифт для рендера, теперь используем его: Делаем рендер шрифта по указанным координатам, для этого применяется опкод opcodes:0b6f

{$CLEO}

0000:

0B6D: render 0@ = create_font "Arial" height 11 flags 5

while true
    wait 0
    0B6F: render font 0@ draw_text "My first text" pos 100 100 color 0xFFff0000
end

Выделить кодCLEO"Базовый" рендер готов. Свойства У рендера текста есть всего 2 свойства: получение ширины указанного текста, получение высоты шрифта. Все значения в пикселях. opcodes:0b6b - получение ширины текста opcodes:0b6c - получение высоты шрифта Эти два свойства я использую в одном коде, вместе с комментариями к коду: Также можно сделать рендер, к примеру, по середине окна игры(640x448) с помощью конвертера(опкод opcodes:0b60):

// ... < Используем предыдущий код
0B6B: render 1@ = font 0@ draw_text "My first text" length // Получаем ширину текста в пикселях
0B6C: render 2@ = font 0@ draw_height // Получаем высоту шрифта, чтобы сделать "многострочный" рендер/рендер несколько строк подряд
0B60: convert_game_screen_coords 320.0 224.0 to_window_screen_coords 3@ 4@ // Делаем конверт оконных координат в экранные
0062: 3@ -= 1@ // Делаем "точный" центр, вычитая из координаты X ширину текста

0B6F: render font 0@ draw_text "My first text" pos 3@ 4@ color 0xFFff0000
005A: 4@ += 2@ // Вычисляем координаты для следующего рендера текста
0B6F: render font 0@ draw_text "My second text" pos 3@ 4@ color 0xFFffff00
005A: 4@ += 2@ //
0B6F: render font 0@ draw_text "My third text" pos 3@ 4@ color 0xFFffffff

Выделить кодCLEOПервый текст будет отображаться ровно по середине экрана(вместе с учетом некоторых нюансов), а остальные - будут ниже его. И ещё 1 пример: мы хотим вывести над головой игрока текст "Любитель", то конверт будет другой, из игровых координат(3D, опкод opcodes:0b55):

// ... < Используем предыдущий код(инициализация шрифта)
04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 1.0 // Получаем позицию игрока с оффсетом 1.0 по оси Z
0B55: convert_3D_coords 1@ 2@ 3@ to_screen 4@ 5@
0B6F: render font 0@ draw_text "Любитель" pos 4@ 5@ color -1

Выделить кодCLEOРендер текстур Также, с помощью данного рендера есть возможность отображать изображения(текстуры), которые были инициализированы перед этой операцией. Для инициализации структуры, используем опкод opcodes:0b71(файл текстуры должен существовать!):

{$CLEO}

0000:

0B71: render 0@ = load_texture_from_file "CLEO\textures\first.png"

while true
    wait 0
end

Выделить кодCLEOВ принципе всё: текстура загружена. Для её "выгрузки", используем опкод opcodes:0b72. Для рендера текстуры, необходимо применить опкод opcodes:0b73:

// ... < Используется предыдущий код(инициализация текстуры)
while true
    wait 0
    0B73: render draw_texture 0@ pos 250 250 size 80 80 rotation 0.0 color 0xffff0000
    // Рисуем текстуру в позициях 250 250 с размером 80x80 пикселей. Угол поворота: 0.0 , цвет: непрозрачный красный
end

Выделить кодCLEOПример на скриншотах: Я инициализировал текстуру, а точнее - изображение, используя код выше:

Изначальное изображение  Рендер изображения​Конечно, можно было вывести изображение без изменения цветоканалов. Для этого укажите цвет белый(0xffffffff или просто -1). Рендер примитивов Примитивы включают себя различные линии, квадраты, эллипсы и т.п. В этом пункте рассмотрим только базовый рендер примитивов. Рендер линий Для рендера линий используется опкод opcodes:0b68. Думаю, не составит труда разобрать его параметры. Пример кода:
{$CLEO}

0000:

0B5A: get_screen_resolution 0@ 1@ // Получаем разрешение экрана
// Получаем середину разрешения экрана
0@ /= 2
1@ /= 2

while true
    wait 0
    0B68: render draw_line_point1 0 0 point2 0@ 1@ width 1 color 0x99ff0000
end

Выделить кодCLEOРезультат: линия рисуется из левого верхнего угла экрана в середину экрана с толщиной 1 пиксель и красным полупрозрачным цветом. Рендер квадратов Рендер квадратов можно осуществить в двух видах: с обводкой и без обводки. Для этого используются опкоды opcodes:0b69 и opcodes:0b6a. Для компактности, я занесу их в один код:

{$CLEO}

0000:

0B5A: get_screen_resolution 0@ 1@ // Получаем разрешение экрана
// Получаем середину разрешения экрана
0@ /= 2
1@ /= 2

while true
    wait 0
    0B69: render draw_box_pos 0@ 1@ size 100 100 color 0x9000ff00

    0A8E: 2@ = 0@ + 100 // Получаем позицию для следующего рендера квадрата(с обводкой)
    0B6A: render draw_box_with_border_pos 2@ 1@ size 100 100 color 0x7Fff0000 border_size 1 border_color 0x80aeaeae
end

Выделить кодCLEOПервый квадрат будет отображен по середине экрана, а второй(с обводкой) будет расположен правее. Рендер многоугольников Для рендера многоугольников используется опкод opcodes:0b70. Для отображения треугольника применяется такой код:

{$CLEO}

0000:

0B5A: get_screen_resolution 0@ 1@ // Получаем разрешение экрана
// Получаем середину разрешения экрана
0@ /= 2
1@ /= 2

while true
    wait 0
    0B70: render draw_polygon_pos 0@ 1@ size 100 75 corners 3 rotation 0.0 color -1
end

Выделить кодCLEOБлиже к середине экрана будет отображен треугольник белого цвета, с размерами 100x75 пикселей. Встречаемые ошибки при написании кода

  • Создавать шрифт во время/перед рендером не нужно! Создайте шрифт в начале(при загрузке) скрипта и далее используйте его, иначе может произойти утечка памяти.
  • Опкод рендера текста не поддерживает форматирование. Для форматирования строки используйте опкод opcodes:0ad3

ИсточникиПравить

https://blast.hk/threads/17441/

Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA , если не указано иное.