Рисование на экране

Материал из GTAModding.ru
Перейти к: навигация, поиск

Чтобы рисовать на экране, нужно включить режим рисования опкодом

03F0: enable_text_draw 1

При первом запуске игры значение рисования не определено и текстуры будут "висеть" на экране вечно. При значении параметра 1 - текстуры будут рисоваться на несколько миллисекунд, надо их рисовать в цикле с wait 0. При значении параметра 0 - текстуры не рисуются.

Пример:

03F0: enable_text_draw 1
while 80E1: not pressed_key 0 19 
  {Рисоание...}
  wait 0
end
03F0: enable_text_draw 0

ВНИМАНИЕ! В некоторых случаях (например, при входе в раздевалку) значение enable_text_draw сбрасывается в неопределённое и тогда текстуры не будут стираться, итог - вылет через две секунды. Так что во время рисования заморозьте игрока (01B4: set_player $PLAYER_CHAR can_move 0) и установите $ONMISSION в true. Либо всё время устанавливайте 03F0: enable_text_draw 1.

Вывод текстур

Чтобы рисовать текстуры, надо в начале загрузить TXD файл из папки \Models\TXD опкодом

0390: load_txd_dictionary 'MY_TXD'

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

0391: release_txd_dictionary

После загрузки нужно загрузить сами текстуры опкодом

038F: load_texture "MyTexture" as 1

где "MyTexture" - имя текстуры внути TXD файла, 1 - слот, в который мы загружаем текстуру.

Например:

0390: load_txd_dictionary 'MY_TXD'
038F: load_texture "MyTextureOne" as 1
038F: load_texture "MyTextureTwo" as 2
03F0: enable_text_draw 1
while 80E1: not pressed_key 0 19 
  {Рисоание...}
  wait 0
end
03F0: enable_text_draw 0
0391: release_txd_dictionary

Перейдём теперь непосредственно к рисованию.

Текстуры выводятся на экран опкодами:

038D: draw_texture 2 position 160.0 112.0 scale 320.0 224.0 RGBA 150 150 150 255
074B: draw_texture 2 position 160.0 112.0 scale 320.0 224.0 angle 90.0 RGBA 150 150 150 255

Второй отличается от первого тем, что можно задать угол поворота текстуры.

Итак, первый параметр - это слот текстуры, который мы задали в опкоде 038F. Пара параметров после position - это координаты текстуры (см. ниже). Пара параметров после scale - это размеры текстуры на экране (см. ниже). Параметры после RGBA - цвет в формате RGB и прозрачность текстуры (255 - не прозрачно).

Как определить координаты текстуры? Левый верхний квадрат имеет координату 0.0 0.0, а правый нижний - координату 640.0 448.0. Координаты рассчитываются от середины текстуры. С помощью калькулятора и Paint'а высчитывать координаты текстур - неприятное дело, так что проще воспользоваться программой San Andreas Texture Placer. С её помощью можно расставить текстуры как следует.

Что-бы не было пикселизации текстуры и текстура была сглаженной нужно перед рисованием текстуры поставить опкод

03E3: set_texture_to_be_drawn_antialiased 1

например:

03E3: set_texture_to_be_drawn_antialiased 1
038D: draw_texture 2 position 160.0 112.0 size 320.0 224.0 RGBA 150 150 150 255
03E3: set_texture_to_be_drawn_antialiased 1
038D: draw_texture 2 position 480.0 112.0 size -320.0 224.0 RGBA 150 150 150 255

Аналогично текстурам можно рисовать прямоугольники опкодом:

038E: draw_box_position 320.0 224.0 size 640.0 448.0 RGBA 255 0 0 128

все параметры те же, что у текстур, только нет номера текстуры.

Пример рисования (прыгающий шарик):

  1. thread 'ball'
  2.  
  3. {$CLEO}
  4.  
  5. var
  6.   $PLAYER_CHAR: Player
  7.   $PLAYER_ACTOR: Actor
  8.   1@: Float
  9.   2@: Float
  10.   3@: Float
  11.   4@: Float
  12.   5@: Float
  13. end
  14.  
  15. const
  16.   BALL_SPEED = 5.0
  17. end
  18.  
  19. while true
  20.   if and
  21.     $PLAYER_CHAR.Defined
  22.     $PLAYER_CHAR.Controllable
  23.     $ONMISSION == false
  24.     not $PLAYER_ACTOR.Driving
  25.     00E1: pad 0 pressed_key 4 // клавиша Действие
  26.   then
  27.     0390: load_txd_dictionary 'LD_DUAL'
  28.     038F: load_texture "light" as 1
  29.     03f0: enable_text_draw 1
  30.     $PLAYER_CHAR.CanMove = false
  31.     $ONMISSION = true
  32.     1@ = 320.0 // Установка начальных координат
  33.     2@ = 224.0 //
  34.     3@ = Random(0.0, 360.0) // Устанавливается случайных угол
  35.     02F6: 4@ = cosine 3@    // Разложение скорости по оси X
  36.     4@ *= BALL_SPEED        //
  37.     02F7: 5@ = sine 3@      // Разложение скорости по оси Y
  38.     5@ *= BALL_SPEED        //
  39.     while 80E1: not pad 0 pressed_key 15 // клавиша Вход/Выход
  40.       if or       
  41.         1@ <= 0.0
  42.         1@ >= 640.0
  43.       then          // Если Vx выходит за границы, то
  44.         4@ *= -1.0  // обратим скорость по X 
  45.         jump @A
  46.       end     
  47.       if or
  48.         2@ <= 0.0
  49.         2@ >= 447.0
  50.       then          // Если Vy выходит за границы, то
  51.         5@ *= -1.0  // обратим скорость по Y 
  52.         jump @A
  53.       end    
  54.       :A
  55.       1@+=4@
  56.       2@+=5@
  57.       03f0: enable_text_draw 1
  58.       03E3: set_texture_to_be_drawn_antialiased 1 
  59.       038D: draw_texture 1 position 1@ 2@ scale 25.0 25.0 RGBA 255 255 255 255 
  60.       wait 0
  61.     end
  62.     $ONMISSION = false
  63.     $PLAYER_CHAR.CanMove = true
  64.     03f0: enable_text_draw 0
  65.     0391: release_txd_dictionary
  66.   end
  67.   wait 0
  68. end
  69. 0A93: end_custom_thread

Ограничения: всего в один момент времени на экран может выводиться до 128 текстур.

Рисование текста

Основной опкод для рисования текста:

033E: set_draw_text_position 320.0 407.0 GXT 'FEM_YES'
045A: draw_text_1number 320.0 407.0 GXT 'DOLLAR' number 72
045B: draw_text_2numbers 320.0 407.0 GXT 'TIME' numbers 5 45 
07FC: text_draw_1float_position_XY 10.0 10.0 GXT_reference 'BB_05' value 1@ decimal_count 3

где 320.0 407.0 - координаты. Координаты отсчитываются от левого верхнегно угла текста, как обычно. Следующие два опкода выводит целые числа, последний выводит Float число, параметр decimal_count - количество десятичных знаков после запятой (в GXT должно быть ~1~.~1~).

К тексту можно применить форматирование, для этого перед опкодом текста должны стоять опкоды: Опкод, включающий выравнивание текста по центру:

0342: enable_text_draw_centered 1

Опкод, включающий выравнивание текста по правому краю:

03E4: enable_text_draw_align_right 1

Цвет текста и его прозрачность:

0340: set_text_draw_RGBA 255 0 0 200

Параметры тени (первый параметр - расстояние тени, четыре остальных параметра - цвет и прозрачность):

060D: draw_text_shadow 1 color_RGBA 127 127 127 245
Тень=1
Тень=2
Тень=5

Параметры обводки текста (первый параметр - толщина обводки, четыре остальных параметра - цвет и прозрачность):

081C: draw_text_outline 1 RGBA 255 0 0 255
Обводка=1
Обводка=2
Обводка=20

Опкод, включающий серый бокс (фон) (глючный):

0345: enable_text_draw_background 1

Опкод, теоретически при 1 пропорциональный, при 0 моноширинный, практически при 0 текст выглядит безобразно:

0348: enable_text_draw_proportional 0

Опкод, задающий длину одной строки:

0343: set_text_draw_linewidth 80.0
Длина строки по умолчанию
Длина строки = 300

Опкод, задающий шрифт:

0349: set_text_draw_font 3

Параметр: 0 - готический (из San Andreas), 1 - обычный, 2 - шрифт из меню SA, 3 - pricedown (из GTA3).

Шрифт=0
Шрифт=1
Шрифт=2
Шрифт=3

Опкод изменения ширины и высоты одного символа:

033F: set_text_draw_letter_size 1.0 3.0

Опкод, выводящий на экран прямоугольник, как и в меню:

0937: text_draw_box_cornerA 29.0 50.0 cornerB 210.6556 156.4957 GXT_reference 'POLICAR' style 4
Результат опкода 0937


Пример (вывод названия района вместо стандартного):

  1. {$CLEO}
  2.  
  3. var
  4.   $PLAYER_CHAR: Player
  5.   $PLAYER_ACTOR: Actor
  6.   1@: Float
  7.   2@: Float
  8.   3@: Float
  9.  
  10. //  20@s: String
  11. //  22@s: String
  12. end
  13. 0000:
  14. 09BA: show_entered_zone_name 0
  15. while true  
  16.   $PLAYER_ACTOR.StorePos(1@, 2@, 3@)
  17.   0843: get_zone_at 1@ 2@ 3@ nameA_to 22@s // 8-byte string 
  18.   if not 20@s == 22@s
  19.   then
  20.     03F0: enable_text_draw 1    
  21.     4@ = 447.0
  22.     while 4@ > 407.0
  23.       03F0: enable_text_draw 1
  24.       060D: draw_text_shadow 0 color_RGBA 0 0 0 0
  25.       0345: enable_text_draw_background 0
  26.       0342: enable_text_draw_centered 1
  27.       033F: set_text_draw_letter_size 1.0 3.0   
  28.       033E: set_draw_text_position 320.0 4@ GXT 22@s
  29.       4@-=1.0
  30.       wait 0
  31.     end    
  32.     32@ = 0
  33.     while 32@ < 2000
  34.       03F0: enable_text_draw 1
  35.       060D: draw_text_shadow 0 color_RGBA 0 0 0 0
  36.       0345: enable_text_draw_background 0
  37.       0342: enable_text_draw_centered 1
  38.       033F: set_text_draw_letter_size 1.0 3.0   
  39.       033E: set_draw_text_position 320.0 407.0 GXT 22@s
  40.       wait 0
  41.     end
  42.     4@ = 407.0
  43.     while 4@ < 447.0
  44.       03F0: enable_text_draw 1
  45.       060D: draw_text_shadow 0 color_RGBA 0 0 0 0
  46.       0345: enable_text_draw_background 0
  47.       0342: enable_text_draw_centered 1
  48.       033F: set_text_draw_letter_size 1.0 3.0   
  49.       033E: set_draw_text_position 320.0 4@ GXT 22@s
  50.       4@+=1.0
  51.       wait 0
  52.     end      
  53.   end
  54.   0843: get_zone_at 1@ 2@ 3@ nameA_to 20@s // 8-byte string
  55.   wait 0 
  56. end