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

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

Рисование на экране. Вывод 2D текстур и текста

Чтобы рисовать на экране, нужно включить режим рисования опкодом [code]03f0: enable_text_draw 1[/code]

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

Пример:

[code]03f0: enable_text_draw 1 while 80E1: not pressed_key 0 19

 {Рисование...}
 wait 0

end 03f0: enable_text_draw 0[/code]

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


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

Что-бы рисовать текстуры, надо в начале загрузить TXD файл из папки \Models\TXD опкодом [code]0390: load_txd_dictionary 'MY_TXD'[/code] а после рисования выгрузить опкодом [code]0391: release_txd_dictionary[/code]

После загрузки нужно загрузить сами текстуры опкодом [code]038F: load_texture "MyTexture" as 1[/code] где "MyTexture" - имя текстуры внути TXD файла, 1 - слот, в который мы загружаем текстуру.

Например: [code]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[/code]

Перейдём теперь непосредственно к рисованию. Текстуры рисуются опкодами: [code]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[/code]

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

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

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

Что-бы не было пикселизации текстуры и текстура была сглаженной нужно перед рисованием текстуры поставть опкод [code]03E3: set_texture_to_be_drawn_antialiased 1[/code] , например: [code]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[/code]

Аналогично текстурам можно рисовать прямоугольники опкодом: [code]038E: draw_box_position 320.0 224.0 size 640.0 448.0 RGBA 255 0 0 128 [/code] все параметры те же, что у текстур, только нет номера текстуры.

Пример рисования (прыгающий шарик): [code]thread 'ball'

{$CLEO}

var

 $PLAYER_CHAR: Player
 $PLAYER_ACTOR: Actor
 1@: Float
 2@: Float
 3@: Float
 4@: Float
 5@: Float

end

const

 BALL_SPEED = 5.0

end

while true

 if and
   $PLAYER_CHAR.Defined
   $PLAYER_CHAR.Controllable
   $ONMISSION == false
   not $PLAYER_ACTOR.Driving
   00E1: pad 0 pressed_key 4 // клавиша Действие
 then
   0390: load_txd_dictionary 'LD_DUAL'
   038F: load_texture "light" as 1
   03f0: enable_text_draw 1
   $PLAYER_CHAR.CanMove = false
   $ONMISSION = true
   1@ = 320.0 // Установка начальных координат
   2@ = 224.0 //
   3@ = Random(0.0, 360.0) // Устанавливается случайных угол
   02F6: 4@ = cosine 3@    // Разложение скорости по оси X
   4@ *= BALL_SPEED        //
   02F7: 5@ = sine 3@      // Разложение скорости по оси Y
   5@ *= BALL_SPEED        //
   while 80E1: not pad 0 pressed_key 15 // клавиша Вход/Выход
     if or       
       1@ <= 0.0
       1@ >= 640.0
     then          // Если Vx выходит за границы, то
       4@ *= -1.0  // обратим скорость по X 
       jump @A
     end     
     if or
       2@ <= 0.0
       2@ >= 447.0
     then          // Если Vy выходит за границы, то
       5@ *= -1.0  // обратим скорость по Y 
       jump @A
     end    
     :A
     1@+=4@
     2@+=5@
     03f0: enable_text_draw 1
     03E3: set_texture_to_be_drawn_antialiased 1 
     038D: draw_texture 1 position 1@ 2@ scale 25.0 25.0 RGBA 255 255 255 255 
     wait 0
   end
   $ONMISSION = false
   $PLAYER_CHAR.CanMove = true
   03f0: enable_text_draw 0
   0391: release_txd_dictionary
 end
 wait 0

end 0A93: end_custom_thread[/code]

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

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

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