[CLEO] Создание 3D текста
Супер
Дата: Четверг, 09.08.2012, 16:23 | Сообщение # 1
Admin
Сообщений: 663
Статус: Offline
{$CLEO .cs} //-------------MAIN--------------- thread "3D TEXT" 03F0: enable_text_draw 1 gosub @POSIT1_1411 //прыжок на метку перезаписи GXT текста (GXT записи находятся в american.gxt > открывается через GXT editor) :POSIT1_21 wait 0 if Player.Defined(0) jf @POSIT1_21 Model.Load(19308) 038B: load_requested_models if Model.Available(19308) jf @POSIT1_21 actor.StorePos($PLAYER_ACTOR, 13@, 14@, 15@) //записываем место нахождение нашего актёра в переменные 13@,14@,15@ 31@ = Object.Create(19308, 13@, 14@, 15@) //создаём объект на сохраненных позициях 0750: set_object 31@ visibility 0 //делаем объект невидимым :POSIT1_255 wait 0 if 02CC: object 31@ bounding_sphere_visible //если объект находится в видимости экрана, и вы от позиции 13@ 14@ не дальше, чем на 30 метров, то текст выводится jf @POSIT1_255 0AB1: call_scm_func @POSIT1_775 3 13@ 14@ 15@ 1@ 2@ if 00EC: actor $PLAYER_ACTOR 0 near_point 13@ 14@ radius 30.0 30.0 //условие для того, чтобы текст исчезал, если вы находитесь от текста на расстоянии больше 30.0 jf @POSIT1_255 if and not 1@ > 640.0 not 2@ > 480.0 1@ >= 4.0 2@ >= 4.0 jf @POSIT1_255 0349: set_text_draw_font 3 //стиль текста, всего их 4, начинает от 0 до 3 0340: set_text_draw_RGBA 255 204 0 255//цвет текста 060D: draw_text_shadow 1 color_RGBA 0 0 0 255 //тени текста 033F: set_text_draw_letter_size 0.3 0.86 //размеры текста (ширина и высота) 0342: enable_text_draw_centered 1 //текст будет в центре 033E: set_draw_text_position 1@ 2@ GXT 'CRED122' // GXT запись, которая будет выведена на экран jump @POSIT1_255 0000: NOP 03F0: enable_text_draw 1 :POSIT1_587 wait 0 04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 1.0 0AB1: call_scm_func @POSIT1_775 3 1@ 2@ 3@ 4@ 5@ 0AB1: call_scm_func @POSIT1_896 3 4@ 5@ 1.0 1@ 2@ 3@ 0AB1: call_scm_func @POSIT1_775 3 1@ 2@ 3@ 4@ 5@ 054C: use_GXT_table 'SWEET6' 0341: unknown_text_draw_flag 0 0342: enable_text_draw_centered 1 0349: set_text_draw_font 2 0340: set_text_draw_RGBA 255 100 100 255 033E: set_draw_text_position 4@ 5@ GXT 'SWE6B34' // ~z~KapЎ ѓ›o¤co¤ - Cќ-ѓ›eћ. 0349: set_text_draw_font 2 0340: set_text_draw_RGBA 255 100 100 255 jump @POSIT1_587 :POSIT1_775 0AB1: call_scm_func @POSIT1_1330 1 0 12@ 0AB1: call_scm_func @POSIT1_1330 1 3 13@ 0AB1: call_scm_func @POSIT1_1330 1 6 14@ 0AB1: call_scm_func @POSIT1_1330 1 9 15@ 0AA5: call 7392816 6 pop 6 0 0 15@ 14@ 13@ 12@ 0AB1: call_scm_func @POSIT1_1223 2 3@ 4@ 3@ 4@ 0AB2: ret 2 3@ 4@ :POSIT1_896 0A8D: 3@ = read_memory 9261112 size 4 virtual_protect 0 3@ *= 0.5 02F6: 4@ = sine 3@ // (float) 02F7: 5@ = cosine 3@ // (float) 0073: 4@ /= 5@ // (float) 6@ = 1.0 0@ /= 320.0 0063: 6@ -= 0@ // (float) 006B: 6@ *= 4@ // (float) 7@ = 1.0 1@ /= 224.0 0063: 7@ -= 1@ // (float) 006B: 7@ *= 4@ // (float) 0A8D: 8@ = read_memory 12840868 size 4 virtual_protect 0 0073: 7@ /= 8@ // (float) 006B: 6@ *= 2@ // (float) 006B: 7@ *= 2@ // (float) 0087: 9@ = 6@ // (float) 0087: 10@ = 2@ // (float) 0087: 11@ = 7@ // (float) 0A8D: 12@ = read_memory 11989052 size 4 virtual_protect 0 0AB1: call_scm_func @POSIT1_1330 1 9 13@ 0AA5: call 5883792 3 pop 3 13@ 12@ 13@ 12@ += 48 0A8D: 14@ = read_memory 12@ size 4 virtual_protect 0 12@ += 4 0A8D: 15@ = read_memory 12@ size 4 virtual_protect 0 12@ += 4 0A8D: 16@ = read_memory 12@ size 4 virtual_protect 0 005B: 14@ += 9@ // (float) 005B: 15@ += 10@ // (float) 005B: 16@ += 11@ // (float) 0AB2: ret 3 14@ 15@ 16@ :POSIT1_1223 2@ = 640.0 0A8D: 4@ = read_memory 12677188 size 4 virtual_protect 0 0093: 4@ = integer 4@ to_float 0073: 2@ /= 4@ // (float) 006B: 0@ *= 2@ // (float) 3@ = 448.0 0A8D: 5@ = read_memory 12677192 size 4 virtual_protect 0 0093: 5@ = integer 5@ to_float 0073: 3@ /= 5@ // (float) 006B: 1@ *= 3@ // (float) 0AB2: ret 2 0@ 1@ :POSIT1_1330 0A9F: 1@ = current_thread_pointer 0@ *= 4 0A8E: 2@ = 1@ + 220 // int if 2@ == 1 jf @POSIT1_1388 0@ += 10783072 jump @POSIT1_1403 :POSIT1_1388 005A: 0@ += 1@ // (int) 0@ += 60 :POSIT1_1403 0AB2: ret 1 0@ :POSIT1_1411 0A9F: 1@ = current_thread_pointer 1@ += 16 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 1@ -= @1 1@ += 3 0AA8: call_function_method 6946896 12694336 num_params 1 pop 0 1@ 0@ 1@ += 12 0AA5: call 7439872 2 pop 2 0@ 1@ return :1 0900: unknown_set_object 'CRED122'//вводим название GXT записи 0900: unknown_set_object "TEST" //записываем текст который хотим видеть 0000: NOP
MelomanCool
Дата: Вторник, 05.03.2013, 16:48 | Сообщение # 2
Советник
Сообщений: 757
Статус: Offline
Я, конечно, археолог, но мне интересно, кто писал код, ибо метки POSIT1_587 и POSIT1_896 можно смело выкинуть вместе с содержимым - они вообще не используются. Добавлено (05.03.2013, 16:48) --------------------------------------------- Нашел исходник функции для получения координат:
Код
:getScreenXYFrom3DCoords { Parameters: Passed: 0@ - position X 1@ - position Y 2@ - position Z Result: 3@ - screen X 4@ - screen Y Example: 0AB1: call_scm_func @getScreenXYFrom3DCoords 3 coords_XYZ 2488.562 -1666.865 12.8757 store_to 1@ 2@ } 18@ = 1 0A9F: 19@ = current_thread_pointer 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 0 store_to 14@ // in => 0@-2@ 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 3 store_to 15@ // out => 3@-5@ 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 6 store_to 16@ // coords => 6@-8@ 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 9 store_to 17@ 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 12 store_to 18@ 0AA5: call 0x70CE30 num_params 6 pop 6 18@ 18@ 17@ 16@ 15@ 14@ 0AB1: call_scm_func @getFullScreenXY 2 coords_XY 3@ 4@ store_to 3@ 4@ 0AB2: ret 2 3@ 4@ :getLocalVarOffset { Parameters: Passed: 0@ - thread pointer 1@ - var number Result: 1@ - var value Example: 0AB1: call_scm_func @getLocalVarOffset 2 thread 0@ var 0 store_to 1@ } if 0@ <> 0 then 1@ *= 0x4 0A8E: 2@ = 0@ + 0xDC // mission flag if 2@ == 1 then 1@ += 0xA48960 else 005A: 1@ += 0@ 1@ += 0x3C end else 1@ = 0 end 0AB2: ret 1 1@ :getFullScreenXY { Parameters: Passed: 0@ - full screen X 1@ - full screen Y Result: 0@ - screen X 1@ - screen Y Example: 0AB1: call_scm_func @getFullScreenXY 2 coords_XY 320.0 224.0 store_to 1@ 2@ } 2@ = 640.0 // screen X 0A8D: 4@ = read_memory 0xC17044 size 4 virtual_protect 0 // full screen X 0093: 4@ = integer 4@ to_float 0073: 2@ /= 4@ 006B: 0@ *= 2@ 3@ = 448.0 // screen Y 0A8D: 5@ = read_memory 0xC17048 size 4 virtual_protect 0 // full screen Y 0093: 5@ = integer 5@ to_float 0073: 3@ /= 5@ 006B: 1@ *= 3@ 0AB2: ret 2 0@ 1@ 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 0 store_to 14@ // in => 0@-2@ 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 3 store_to 15@ // out => 3@-5@ 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 6 store_to 16@ // coords => 6@-8@ 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 9 store_to 17@ 0AB1: call_scm_func @getLocalVarOffset 2 thread 19@ var 12 store_to 18@ 0AA5: call 0x70CE30 num_params 6 pop 6 18@ 18@ 17@ 16@ 15@ 14@ 0AB1: call_scm_func @getFullScreenXY 2 coords_XY 3@ 4@ store_to 3@ 4@ 0AB2: ret 2 3@ 4@ :getLocalVarOffset { Parameters: Passed: 0@ - thread pointer 1@ - var number Result: 1@ - var value Example: 0AB1: call_scm_func @getLocalVarOffset 2 thread 0@ var 0 store_to 1@ } if 0@ <> 0 then 1@ *= 0x4 0A8E: 2@ = 0@ + 0xDC // mission flag if 2@ == 1 then 1@ += 0xA48960 else 005A: 1@ += 0@ 1@ += 0x3C end else 1@ = 0 end 0AB2: ret 1 1@ :getFullScreenXY { Parameters: Passed: 0@ - full screen X 1@ - full screen Y Result: 0@ - screen X 1@ - screen Y Example: 0AB1: call_scm_func @getFullScreenXY 2 coords_XY 320.0 224.0 store_to 1@ 2@ } 2@ = 640.0 // screen X 0A8D: 4@ = read_memory 0xC17044 size 4 virtual_protect 0 // full screen X 0093: 4@ = integer 4@ to_float 0073: 2@ /= 4@ 006B: 0@ *= 2@ 3@ = 448.0 // screen Y 0A8D: 5@ = read_memory 0xC17048 size 4 virtual_protect 0 // full screen Y 0093: 5@ = integer 5@ to_float 0073: 3@ /= 5@ 006B: 1@ *= 3@ 0AB2: ret 2 0@ 1@
Этот код очень длинный, да и непонятный, однако я совершенно случайно недавно наткнулся на более короткий и простой вариант, который я немного изменил и превратил в функцию:
Код
:getScreenXYFrom3DCoords 0AA7: call_function 0x70CE30 num_params 6 pop 6 clipNear 1 clipFar 1 yMult 7@s xMult 6@s outVector 2@s inVector 0@s result 29@ 0073: 2@ /= 6@ 0073: 2@ /= 4@ 0073: 3@ /= 7@ 0073: 3@ /= 4@ 2@ *= 640.0 3@ *= 448.0 0AB2: ret 2 2@ 3@
Ну, и чтобы вы не расслаблялись, вот вам пример использования - 3D-кубик из чисел, который прикрепляется к актеру
Код
{$CLEO} 0000: while true wait 0 04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0 1.0 0 03F0: enable_text_draw 1 for 9@ = 0 to 3 for 8@ = 0 to 3 for 7@ = 0 to 3 0AB1: call_scm_func @getScreenXYFrom3DCoords 3 3D_coords_X 0@ Y 1@ Z 2@ store_screen_X_to 3@ Y_to 4@ 0342: set_text_draw_centered 1 081C: draw_text_outline 1 RGBA 0 0 0 255 033F: set_text_draw_letter_size 0.3 1.1 045A: draw_text_1number 3@ 4@ GXT 'NUMBER' number 7@ 0@ += 0.1 end 0@ -= 0.4 1@ += 0.1 end 1@ -= 0.4 2@ += 0.1 end end :getScreenXYFrom3DCoords 0AA7: call_function 0x70CE30 num_params 6 pop 6 clipNear 1 clipFar 1 yMult 7@s xMult 6@s outVector 2@s inVector 0@s result 29@ 0073: 2@ /= 6@ 0073: 2@ /= 4@ 0073: 3@ /= 7@ 0073: 3@ /= 4@ 2@ *= 640.0 3@ *= 448.0 0AB2: ret 2 2@ 3@
Ушел
Сообщение отредактировал MelomanCool - Вторник, 05.03.2013, 18:07
mgmoldova
Дата: Вторник, 05.03.2013, 18:22 | Сообщение # 3
Боец
Сообщений: 95
Статус: Offline
Вот так будет еще красивее. Добавил рандомные цифры, рандомного цвета. Код
{$CLEO} 0000: while true wait 0 04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0 1.0 0 03F0: enable_text_draw 1 for 9@ = 0 to 3 for 8@ = 0 to 3 for 7@ = 0 to 3 0209: 17@ = random_int_in_ranges 0 255 0209: 18@ = random_int_in_ranges 0 255 0209: 19@ = random_int_in_ranges 0 255 0209: 20@ = random_int_in_ranges 0 9 0AB1: call_scm_func @getScreenXYFrom3DCoords 3 3D_coords_X 0@ Y 1@ Z 2@ store_screen_X_to 3@ Y_to 4@ 0342: set_text_draw_centered 1 081C: draw_text_outline 1 RGBA 0 17@ 18@ 19@ 033F: set_text_draw_letter_size 0.3 1.1 045A: draw_text_1number 3@ 4@ GXT 'NUMBER' number 20@ 0@ += 0.1 end 0@ -= 0.4 1@ += 0.1 end 1@ -= 0.4 2@ += 0.1 end end :getScreenXYFrom3DCoords 0AA7: call_function 0x70CE30 num_params 6 pop 6 clipNear 1 clipFar 1 yMult 7@s xMult 6@s outVector 2@s inVector 0@s result 29@ 0073: 2@ /= 6@ 0073: 2@ /= 4@ 0073: 3@ /= 7@ 0073: 3@ /= 4@ 2@ *= 640.0 3@ *= 448.0 0AB2: ret 2 2@ 3@
Мой скайп взломан
_Rock_
Дата: Вторник, 05.03.2013, 19:08 | Сообщение # 4
Советник
Сообщений: 606
Статус: Offline
MelomanCool , с меня +
Lichinka
Дата: Воскресенье, 24.03.2013, 18:03 | Сообщение # 5
Новичок
Сообщений: 27
Статус: Offline
mgmoldova , Прикольно получается, спасибки.
AlexRAzor
Дата: Среда, 04.12.2013, 13:45 | Сообщение # 6
Боец
Сообщений: 89
Статус: Offline
Вы меня простите,но я еще только учусь.И мне не сильно это понятно.Как поставить 3д текст например у мерии с надписью мэрия.Плюсика не пожелею.Зачем мне это нужно?У меня есть одна хорошая идея.(Зарание извеняюсь за граматику писал с планшета)
darkes
Дата: Среда, 04.12.2013, 22:38 | Сообщение # 7
Боец
Сообщений: 188
Статус: Offline
Цитата AlexRAzor (
)
Вы меня простите,но я еще только учусь.И мне не сильно это понятно.Как поставить 3д текст например у мерии с надписью мэрия.Плюсика не пожелею.Зачем мне это нужно?У меня есть одна хорошая идея.(Зарание извеняюсь за граматику писал с планшета)
В СФ 2.6 есть специальный опкод. Не поднимай темы, которым практически год.