Рисование на экране
Материал из GTAModding.ru
Версия от 10:05, 26 декабря 2008; VcSaJen (обсуждение | вклад)
Чтобы рисовать на экране, нужно включить режим рисования опкодом
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
все параметры те же, что у текстур, только нет номера текстуры.
Пример рисования (прыгающий шарик):
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
Ограничения: всего в один момент времени на экран может выводиться до 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
где 320.0 407.0 - координаты. Координаты отсчитываются от левого верхнегно угла текста, как обычно. Последние два опкода с числами.
К тексту можно применить форматирование, для этого перед опкодом текста должны стоять опкоды: Опкод, включающий выравнивание текста по центру:
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
Параметры обводки текста (первый параметр - толщина обводки, четыре остальных параметра - цвет и прозрачность):
081C: draw_text_outline 1 RGBA 255 0 0 255
Опкод, включающий серый бокс (фон) (глючный):
0345: enable_text_draw_background 1
Опкод, теоритически при 1 пропорциональный, при 0 моноширинный, практически при 0 текст выглядит безобразно:
0348: enable_text_draw_proportional 0
Опкод, задающий длину одной строки:
0343: set_text_draw_linewidth 80.0
Опкод, задающий шрифт:
0349: set_text_draw_font 3
Параметр: 0 - готический (из San Andreas), 1 - обычный, 2 - шрифт из меню SA, 3 - pricedown (из GTA3).
Опкод изменения ширины и высоты одного символа:
033f: set_text_draw_letter_size 1.0 3.0
Пример (вывод названия района вместо стандартного):
{$CLEO}
var
$PLAYER_CHAR: Player
$PLAYER_ACTOR: Actor
1@: Float
2@: Float
3@: Float
// 20@s: String
// 22@s: String
end
0000:
09BA: show_entered_zone_name 0
while true
$PLAYER_ACTOR.StorePos(1@, 2@, 3@)
0843: get_zone_at 1@ 2@ 3@ nameA_to 22@s // 8-byte string
if not 20@s == 22@s
then
03F0: enable_text_draw 1
4@ = 447.0
while 4@ > 407.0
03F0: enable_text_draw 1
060D: draw_text_shadow 0 color_RGBA 0 0 0 0
0345: enable_text_draw_background 0
0342: enable_text_draw_centered 1
033F: set_text_draw_letter_size 1.0 3.0
033E: set_draw_text_position 320.0 4@ GXT 22@s
4@-=1.0
wait 0
end
32@ = 0
while 32@ < 2000
03F0: enable_text_draw 1
060D: draw_text_shadow 0 color_RGBA 0 0 0 0
0345: enable_text_draw_background 0
0342: enable_text_draw_centered 1
033F: set_text_draw_letter_size 1.0 3.0
033E: set_draw_text_position 320.0 407.0 GXT 22@s
wait 0
end
4@ = 407.0
while 4@ < 447.0
03F0: enable_text_draw 1
060D: draw_text_shadow 0 color_RGBA 0 0 0 0
0345: enable_text_draw_background 0
0342: enable_text_draw_centered 1
033F: set_text_draw_letter_size 1.0 3.0
033E: set_draw_text_position 320.0 4@ GXT 22@s
4@+=1.0
wait 0
end
end
0843: get_zone_at 1@ 2@ 3@ nameA_to 20@s // 8-byte string
wait 0
end