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

Материал из 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 текстур.

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

В скором времени будет