You are not logged in.
Pages: 1
Прошу помочь в написании скрипта. Смысл в том, что нужно отображать угол поворота на экране. График олжен поддерживать токо половину круга. Как вывести угол я разобрался, но как сделать так, чтобы Показывало только угол в зоне от (90;270)?? Стрелка показывающая угол, направлена вверх (в игре 180 градусов), при повороте направо отклоняется направо, налево-налево, потом возвращается в начальную позицию.
Вот, настрочил, но не хочет отображаться(знаю, что оч коряво, я новичок):
{$CLEO} 0000: :DRIFT1 wait 0 if and Actor.Driving($PLAYER_ACTOR) $ACTIVE_INTERIOR == 0 0038: $ONMISSION == 0 84C8: not actor $PLAYER_ACTOR driving_flying_vehicle 84A7: not actor $PLAYER_ACTOR driving_boat jf @DRIFT1 0811: 1@ = actor $PLAYER_ACTOR car 0390: load_txd_dictionary 'DRIFT' 038F: load_texture "grad" as 44 038F: load_texture "ukaz" as 45 wait 1000 jump @DRIFT4 :DRIFT4 wait 0 if and Actor.Driving($PLAYER_ACTOR) $ACTIVE_INTERIOR == 0 jf @DRIFT3 0174: 18@ = car 1@ Z_angle 0092: 27@ = float 18@ to_integer while true wait 0 if 27@ > 180 then if 27@ < 270 then 0092: 16@ = float 27@ to_integer Break else if 27@ < 360 then 0A8F: 16@ = 27@ - 90.00 Break else 16@ = 180.00 Break end else 0A8F: 16@ = 27@ + 90.00 Break end end end wait 0 03F0: enable_text_draw 1 03E3: set_texture_to_be_drawn_antialiased 1 038D: draw_texture 44 position 320.00 407.40 size 180.0 176.13 RGBA 255 255 255 255 03E3: set_texture_to_be_drawn_antialiased 1 074B: draw_texture 45 position 320.00 407.40 size 180.0 177.13 angle 16@ RGBA 255 255 255 255 03E3: set_texture_to_be_drawn_antialiased 1 0340: set_text_draw_RGBA 180 180 180 255 033F: set_text_draw_letter_size 0.7 2.6 045A: draw_text_1number 320.00 407.40 GXT 'NUMBER' number 27@ jump @DRIFT4 :DRIFT3 wait 0 03F0: enable_text_draw 0 0391: release_txd_dictionary jump @DRIFT1 end_thread
Last edited by art-race74@yandex.ru (04-01-2011 12:51)
Offline
Проблема в том, что мне надо заставить стрелку двигаться с одним углом, как и машина, а так она стоит в одной позиции, которую мы задали. Как можно сделать, чтобы данные обновлял каждую секунду, ну или после нажатия на кнопки поворота??
Offline
Просмотрел все опкоды со словом car, вектора скорости вроде как нет. Нашел вот эти опкоды:
06BE: 274@ = car 95@ y_angle car.StorePos($Car,$X,$Y,$Z) - записать координаты машины в переменные $X, $Y и $Z 077D: $7513 = car 35@ x_angle 083F: get_car 35@ vertical_deviation_to $7522
Как можно вычислиь
[q]угол отклонения продольной оси машины от вектора её скорости[/q] ?
Прошу прощенья за возможно глупый вопрос, заранее спасибо.
Offline
Текущие проекции вектора скорости транспортного средства на оси глобальной системы координат записаны в его структуре по следующим смещениям:
+68 = [float] X (East-West) speed +72 = [float] Y (North-South) speed +76 = [float] Z (Up-Down) speed
Для вычисления угла между двумя прямыми можно использовать опкод
0604: get_Z_angle_for_point $TEMPVAR_FLOAT_1 $TEMPVAR_FLOAT_2 store_to $TEMPVAR_ANGLE
Offline
Спасибо
Offline
car.StorePos(1@,$X,$Y,$Z) 0A8E: 4@ = $Y + 72.00 0604: get_Z_angle_for_point 4@ $Y store_to 5@
Селал вот так, но вычисления дают постоянное число. $Y и 4@ изменяются, проверял, а вот число после вычислений опкодом всегда одно...
Offline
Используй локальные переменные. За глобальные уже пора банить... Seemann, ты что-то говорил про то, что в будущем SB не будет компилировать CLEO скрипты с глобальными переменными... Ты нам нужен :-)
Offline
Заменил на локальные, заметил что число меняется, но на очень маленькие числа, гдето около миллионных или даже бальше.
Offline
Вот код, выводящий на экран значение угла между продольной осью машины и её вектором скорости:
{$CLEO} wait 0 while true wait 0 if not player.Defined($player_char) then continue end if actor.Driving($player_actor) then 03C0: 0@ = actor $player_actor car 0A97: 1@ = car 0@ struct 0A8E: 2@ = 1@ + 68 // int 0A8E: 3@ = 1@ + 72 // int 0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0 0A8D: 3@ = read_memory 3@ size 4 virtual_protect 0 0604: get_Z_angle_for_point 2@ 3@ store_to 4@ // возвращает угол между вектором {x;y} и глобальной осью Y 0174: 5@ = car 0@ Z_angle 0063: 4@ -= 5@ // (float) 0092: 4@ = float 4@ to_integer 03F0: enable_text_draw 1 045A: draw_text_1number 300.0 200.0 GXT 'NUMBER' number 4@ // ~1~ end end
При заносе вправо угол положительный, при заносе влево - отрицательный.
Offline
Дэн, прогрессируешь на глазах
Offline
Den_spb Опкод
0604: get_Z_angle_for_point 2@ 3@ store_to 4@
возвращает постоянное число 270, которое всю игру одно и тоже, и от этого числа отнимаешь угол машины. Я ещё новичок и жестко туплю, но если вычислять угол между вектором скорости и направлением машины, угол должен быть не больше ±90 градусов.
Зачем нужно отнимать угол машины? Проблема в опкоде 0604, или я такой дурак, что он мне всегда выдает 270?
Offline
0604: get_Z_angle_for_point 2@ 3@ store_to 4@
возвращает постоянное число 270, которое всю игру одно и тоже
При изменении направления движения машины число должно меняться. Когда я тестировал скрипт было именно так.
но если вычислять угол между вектором скорости и направлением машины, угол должен быть не больше ±90 градусов.
Машину может занести и более, чем на ±90 градусов, а именно до ±180 градусов.
Зачем нужно отнимать угол машины?
Нарисовал картинку, на которой видно, что угол между вектором скорости и глобальной осью Y (этот угол вычисляется с помощью 0604) является суммой двух углов - угла поворота машины вокруг вертикальной оси (Z) и угла заноса. Поэтому чтобы получить угол заноса, надо вычесть угол поворота машины вокруг вертикальной оси (Z).
Last edited by Den_spb (06-01-2011 14:24)
Offline
Вот смотри, даже скриншот прилепил)
0A97: 2@ = car 1@ struct 0A8E: 3@ = 2@ + 68 // int 0A8E: 4@ = 3@ + 72 // int 0A8D: 3@ = read_memory 3@ size 4 virtual_protect 0 0A8D: 3@ = read_memory 4@ size 4 virtual_protect 0 0604: get_Z_angle_for_point 3@ 4@ store_to 5@ // возвращает угол между вектором {x;y} и глобальной осью Y 0092: 7@ = float 5@ to_integer 03F0: enable_text_draw 1 03E3: set_texture_to_be_drawn_antialiased 1 038D: draw_texture 44 position 320.00 407.40 size 180.0 176.13 RGBA 255 255 255 255 03E3: set_texture_to_be_drawn_antialiased 1 074B: draw_texture 45 position 320.00 407.40 size 180.0 177.13 angle 5@ RGBA 255 255 255 255 03E3: set_texture_to_be_drawn_antialiased 1 0340: set_text_draw_RGBA 180 180 180 255 033F: set_text_draw_letter_size 0.7 2.6 045A: draw_text_1number 320.00 407.40 GXT 'NUMBER' number 5@
Как не крутил машину, как не ездил, цыфры не изменились.
Last edited by art-race74@yandex.ru (06-01-2011 15:14)
Offline
Дэн всё правильно сделал, это ты немного ошибся
должно быть так:
0A97: 2@ = car 1@ struct 0A8E: 3@ = 2@ + 68 // int 0A8E: 4@ = 2@ + 72 // int 0A8D: 3@ = read_memory 3@ size 4 virtual_protect 0 0A8D: 4@ = read_memory 4@ size 4 virtual_protect 0 0604: get_Z_angle_for_point 3@ 4@ store_to 5@ // возвращает угол между вектором {x;y} и глобальной осью Y 0174: 6@ = car 0@ Z_angle 0063: 5@ -= 6@ // (float) 0092: 7@ = float 5@ to_integer 03F0: enable_text_draw 1 045A: draw_text_1number 320.00 407.40 GXT 'NUMBER' number 4@ 03F0: enable_text_draw 0
Last edited by Gyr (06-01-2011 15:32)
Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!
Offline
ой ну я стормозил...
Den_spb большое тебе спасибо)
Offline
Pages: 1