Рисование на экране — различия между версиями
Материал из GTAModding.ru
VcSaJen (обсуждение | вклад) |
Seemann (обсуждение | вклад) м |
||
(не показаны 19 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
− | |||
− | |||
Чтобы рисовать на экране, нужно включить режим рисования опкодом | Чтобы рисовать на экране, нужно включить режим рисования опкодом | ||
− | + | <source lang="scm">03F0: enable_text_draw 1</source> | |
При первом запуске игры значение рисования не определено и текстуры будут "висеть" на экране вечно. | При первом запуске игры значение рисования не определено и текстуры будут "висеть" на экране вечно. | ||
− | При значении параметра 1 - текстуры будут рисоваться на несколько миллисекунд, надо их рисовать в цикле с wait 0. | + | При значении параметра 1 - текстуры будут рисоваться на несколько миллисекунд, надо их рисовать в цикле с [[0001|wait]] 0. |
− | При значении | + | При значении параметра 0 - текстуры не рисуются. |
Пример: | Пример: | ||
− | + | <source lang="scm">03F0: enable_text_draw 1 | |
while 80E1: not pressed_key 0 19 | while 80E1: not pressed_key 0 19 | ||
{Рисование...} | {Рисование...} | ||
wait 0 | wait 0 | ||
end | end | ||
− | + | 03F0: enable_text_draw 0</source> | |
− | + | ||
− | + | ||
− | + | ||
+ | ВНИМАНИЕ! В некоторых случаях (например, при входе в раздевалку) значение enable_text_draw сбрасывается в неопределённое и тогда текстуры не будут стираться, итог - вылет через две секунды. Так что во время рисования заморозьте игрока ([[01B4]]: set_player $PLAYER_CHAR can_move 0) и установите [[0180|$ONMISSION]] в true. | ||
+ | Либо всё время устанавливайте [[03F0]]: enable_text_draw 1. | ||
− | == | + | ==Вывод текстур== |
− | + | Чтобы рисовать текстуры, надо в начале загрузить [[TXD]] файл из папки \Models\TXD опкодом | |
− | + | <source lang="scm">0390: load_txd_dictionary 'MY_TXD'</source> | |
а после рисования выгрузить опкодом | а после рисования выгрузить опкодом | ||
− | + | <source lang="scm">0391: release_txd_dictionary</source> | |
После загрузки нужно загрузить сами текстуры опкодом | После загрузки нужно загрузить сами текстуры опкодом | ||
− | + | <source lang="scm">038F: load_texture "MyTexture" as 1</source> | |
где "MyTexture" - имя текстуры внути TXD файла, 1 - слот, в который мы загружаем текстуру. | где "MyTexture" - имя текстуры внути TXD файла, 1 - слот, в который мы загружаем текстуру. | ||
Например: | Например: | ||
− | + | <source lang="scm" >0390: load_txd_dictionary 'MY_TXD' | |
038F: load_texture "MyTextureOne" as 1 | 038F: load_texture "MyTextureOne" as 1 | ||
038F: load_texture "MyTextureTwo" as 2 | 038F: load_texture "MyTextureTwo" as 2 | ||
− | + | 03F0: enable_text_draw 1 | |
while 80E1: not pressed_key 0 19 | while 80E1: not pressed_key 0 19 | ||
{Рисование...} | {Рисование...} | ||
wait 0 | wait 0 | ||
end | end | ||
− | + | 03F0: enable_text_draw 0 | |
− | 0391: release_txd_dictionary | + | 0391: release_txd_dictionary</source> |
Перейдём теперь непосредственно к рисованию. | Перейдём теперь непосредственно к рисованию. | ||
− | Текстуры | + | |
− | + | Текстуры выводятся на экран опкодами: | |
− | 074B: draw_texture 2 position 160.0 112.0 scale 320.0 224.0 angle 90.0 RGBA 150 150 150 255 | + | <source lang="scm">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</source> | ||
Второй отличается от первого тем, что можно задать угол поворота текстуры. | Второй отличается от первого тем, что можно задать угол поворота текстуры. | ||
Строка 53: | Строка 51: | ||
Пара параметров после position - это координаты текстуры (см. ниже). | Пара параметров после position - это координаты текстуры (см. ниже). | ||
Пара параметров после scale - это размеры текстуры на экране (см. ниже). | Пара параметров после scale - это размеры текстуры на экране (см. ниже). | ||
− | + | Параметры после RGBA - цвет в формате RGB и прозрачность текстуры (255 - не прозрачно). | |
− | Как определить координаты текстуры? | + | Как определить координаты текстуры? Левый верхний квадрат имеет координату 0.0 0.0, а правый нижний - координату 640.0 448.0. Координаты рассчитываются от середины текстуры. |
− | С помощью калькулятора и Paint'а высчитывать координаты текстур - неприятное дело, так что проще воспользоваться | + | С помощью калькулятора и Paint'а высчитывать координаты текстур - неприятное дело, так что проще воспользоваться программой [[San Andreas Texture Placer]]. С её помощью можно расставить текстуры как следует. |
− | Что-бы не было пикселизации текстуры и текстура была сглаженной нужно перед рисованием текстуры | + | Что-бы не было пикселизации текстуры и текстура была сглаженной нужно перед рисованием текстуры поставить опкод |
− | + | <source lang="scm">03E3: set_texture_to_be_drawn_antialiased 1</source> | |
− | + | например: | |
− | + | <source lang="scm">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 | 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 | 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 | + | 038D: draw_texture 2 position 480.0 112.0 size -320.0 224.0 RGBA 150 150 150 255</source> |
Аналогично текстурам можно рисовать прямоугольники опкодом: | Аналогично текстурам можно рисовать прямоугольники опкодом: | ||
− | + | <source lang="scm">038E: draw_box_position 320.0 224.0 size 640.0 448.0 RGBA 255 0 0 128</source> | |
все параметры те же, что у текстур, только нет номера текстуры. | все параметры те же, что у текстур, только нет номера текстуры. | ||
Пример рисования (прыгающий шарик): | Пример рисования (прыгающий шарик): | ||
− | + | <source lang="scm" line>thread 'ball' | |
{$CLEO} | {$CLEO} | ||
Строка 139: | Строка 137: | ||
wait 0 | wait 0 | ||
end | end | ||
− | 0A93: end_custom_thread | + | 0A93: end_custom_thread</source> |
− | Ограничения: | + | Ограничения: всего в один момент времени на экран может выводиться до 128 текстур. |
− | + | ||
==Рисование текста== | ==Рисование текста== | ||
− | + | Основной опкод для рисования текста: | |
− | [[Категория:GTA_SA]][[Категория:Туториалы]][[Категория: | + | <source lang="scm">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 | ||
+ | </source> | ||
+ | где 320.0 407.0 - координаты. Координаты отсчитываются от левого верхнегно угла текста, как обычно. Следующие два опкода выводит целые числа, последний выводит Float число, параметр decimal_count - количество десятичных знаков после запятой (в GXT должно быть ~1~.~1~). | ||
+ | |||
+ | К тексту можно применить форматирование, для этого перед опкодом текста должны стоять опкоды: | ||
+ | Опкод, включающий выравнивание текста по центру: | ||
+ | <source lang="scm">0342: enable_text_draw_centered 1</source> | ||
+ | Опкод, включающий выравнивание текста по правому краю: | ||
+ | <source lang="scm">03E4: enable_text_draw_align_right 1</source> | ||
+ | Цвет текста и его прозрачность: | ||
+ | <source lang="scm">0340: set_text_draw_RGBA 255 0 0 200</source> | ||
+ | Параметры тени (первый параметр - расстояние тени, четыре остальных параметра - цвет и прозрачность): | ||
+ | <source lang="scm">060D: draw_text_shadow 1 color_RGBA 127 127 127 245</source> | ||
+ | |||
+ | [[Изображение:td_shadow1.png|none|frame|Тень=1]][[Изображение:td_shadow2.png|none|frame|Тень=2]][[Изображение:td_shadow5.png|none|frame|Тень=5]] | ||
+ | |||
+ | Параметры обводки текста (первый параметр - толщина обводки, четыре остальных параметра - цвет и прозрачность): | ||
+ | <source lang="scm">081C: draw_text_outline 1 RGBA 255 0 0 255</source> | ||
+ | |||
+ | [[Изображение:td_outline1.png|none|frame|Обводка=1]][[Изображение:td_outline2.png|none|frame|Обводка=2]][[Изображение:td_outline20.png|none|frame|Обводка=20]] | ||
+ | |||
+ | Опкод, включающий серый бокс (фон) (глючный): | ||
+ | <source lang="scm">0345: enable_text_draw_background 1</source> | ||
+ | Опкод, теоретически при 1 пропорциональный, при 0 моноширинный, практически при 0 текст выглядит безобразно: | ||
+ | <source lang="scm">0348: enable_text_draw_proportional 0</source> | ||
+ | Опкод, задающий длину одной строки: | ||
+ | <source lang="scm">0343: set_text_draw_linewidth 80.0 </source> | ||
+ | |||
+ | [[Изображение:td_linewidthdef.png|none|frame|Длина строки по умолчанию]][[Изображение:td_linewidth300.png|none|frame|Длина строки = 300]] | ||
+ | |||
+ | Опкод, задающий шрифт: | ||
+ | <source lang="scm">0349: set_text_draw_font 3</source> | ||
+ | Параметр: 0 - готический (из San Andreas), 1 - обычный, 2 - шрифт из меню SA, 3 - pricedown (из GTA3). | ||
+ | |||
+ | [[Изображение:td_font0.png|none|frame|Шрифт=0]][[Изображение:td_font1.png|none|frame|Шрифт=1]][[Изображение:td_font2.png|none|frame|Шрифт=2]][[Изображение:td_font3.png|none|frame|Шрифт=3]] | ||
+ | |||
+ | Опкод изменения ширины и высоты одного символа: | ||
+ | <source lang="scm">033F: set_text_draw_letter_size 1.0 3.0</source> | ||
+ | |||
+ | Опкод, выводящий на экран прямоугольник, как и в меню: | ||
+ | <source lang="scm">0937: text_draw_box_cornerA 29.0 50.0 cornerB 210.6556 156.4957 GXT_reference 'POLICAR' style 4</source> | ||
+ | [[Изображение:Td_box1.PNG|none|frame|Результат опкода 0937]] | ||
+ | |||
+ | |||
+ | Пример (вывод названия района вместо стандартного): | ||
+ | <source lang="scm" line>{$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 | ||
+ | </source> | ||
+ | … | ||
+ | |||
+ | [[Категория:GTA_SA]][[Категория:Туториалы]][[Категория:Скриптинг]] |
Текущая версия на 19:26, 13 января 2009
Чтобы рисовать на экране, нужно включить режим рисования опкодом
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 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
Параметры обводки текста (первый параметр - толщина обводки, четыре остальных параметра - цвет и прозрачность):
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
Опкод, выводящий на экран прямоугольник, как и в меню:
0937: text_draw_box_cornerA 29.0 50.0 cornerB 210.6556 156.4957 GXT_reference 'POLICAR' style 4
Пример (вывод названия района вместо стандартного):
{$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
…