#1 04-01-2011 12:50

art-race74@yandex.ru
Registered: 04-01-2011
Posts: 10
Website

Угол повората "на ходу"

Прошу помочь в написании скрипта. Смысл в том, что нужно отображать угол поворота на экране. График олжен поддерживать токо половину круга. Как вывести угол я разобрался, но как сделать так, чтобы Показывало только угол в зоне от (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

#2 04-01-2011 13:12

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Угол повората "на ходу"

Показывало только угол в зоне от (90;270)

if
    угол < 90.0
then
    угол = 90.0
end
if
    угол > 270.0
then
    угол = 270.0
end

Offline

#3 04-01-2011 14:19

art-race74@yandex.ru
Registered: 04-01-2011
Posts: 10
Website

Re: Угол повората "на ходу"

Проблема в том, что мне надо заставить стрелку двигаться с одним углом, как и машина, а так она стоит в одной позиции, которую мы задали. Как можно сделать, чтобы данные обновлял каждую секунду, ну или после нажатия на кнопки поворота??

Offline

#4 04-01-2011 14:50

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Угол повората "на ходу"

Если речь идёт о дрифте, то делать код надо абсолютно по-другому. Нужно вычислять угол отклонения продольной оси машины от вектора её скорости, а не от направления север-юг.

Offline

#5 04-01-2011 16:51

art-race74@yandex.ru
Registered: 04-01-2011
Posts: 10
Website

Re: Угол повората "на ходу"

Просмотрел все опкоды со словом 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

#6 04-01-2011 17:59

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Угол повората "на ходу"

Текущие проекции вектора скорости транспортного средства на оси глобальной системы координат записаны в его структуре по следующим смещениям:

+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

#7 04-01-2011 20:31

art-race74@yandex.ru
Registered: 04-01-2011
Posts: 10
Website

Re: Угол повората "на ходу"

Спасибо smile

Offline

#8 05-01-2011 11:58

art-race74@yandex.ru
Registered: 04-01-2011
Posts: 10
Website

Re: Угол повората "на ходу"

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

#9 05-01-2011 12:27

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Угол повората "на ходу"

Используй локальные переменные. За глобальные уже пора банить... Seemann, ты что-то говорил про то, что в будущем SB не будет компилировать CLEO скрипты с глобальными переменными... Ты нам нужен :-)

Offline

#10 05-01-2011 13:37

art-race74@yandex.ru
Registered: 04-01-2011
Posts: 10
Website

Re: Угол повората "на ходу"

Заменил на локальные, заметил что  число меняется, но на очень маленькие числа, гдето около миллионных или даже бальше.

Offline

#11 05-01-2011 17:18

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Угол повората "на ходу"

Вот код, выводящий на экран значение угла между продольной осью машины и её вектором скорости:

{$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

#12 05-01-2011 20:09

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Угол повората "на ходу"

Дэн, прогрессируешь на глазах good

Offline

#13 05-01-2011 20:39

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Угол повората "на ходу"

Благодаря этому форуму и хорошим учителям smile

Offline

#14 06-01-2011 10:24

art-race74@yandex.ru
Registered: 04-01-2011
Posts: 10
Website

Re: Угол повората "на ходу"

Den_spb  Опкод

 0604: get_Z_angle_for_point 2@ 3@ store_to 4@

возвращает постоянное число 270, которое всю игру одно и тоже, и от этого числа отнимаешь угол машины. Я ещё новичок и жестко туплю, но если вычислять угол между вектором скорости и направлением машины, угол должен быть не больше ±90 градусов.
Зачем нужно отнимать угол машины? Проблема в опкоде 0604, или я такой дурак, что он мне всегда выдает 270?

Offline

#15 06-01-2011 14:23

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Угол повората "на ходу"

0604: get_Z_angle_for_point 2@ 3@ store_to 4@
возвращает постоянное число 270, которое всю игру одно и тоже

При изменении направления движения машины число должно меняться. Когда я тестировал скрипт было именно так.

но если вычислять угол между вектором скорости и направлением машины, угол должен быть не больше ±90 градусов.

Машину может занести и более, чем на ±90 градусов, а именно до ±180 градусов.

Зачем нужно отнимать угол машины?

Нарисовал картинку, на которой видно, что угол между вектором скорости и глобальной осью Y (этот угол вычисляется с помощью 0604) является суммой двух углов - угла поворота машины вокруг вертикальной оси (Z) и угла заноса. Поэтому чтобы получить угол заноса, надо вычесть угол поворота машины вокруг вертикальной оси (Z).
5b03be87e4det.jpg

Last edited by Den_spb (06-01-2011 14:24)

Offline

#16 06-01-2011 15:12

art-race74@yandex.ru
Registered: 04-01-2011
Posts: 10
Website

Re: Угол повората "на ходу"

Вот смотри, даже скриншот прилепил)

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@

076689cc6114t.jpg
Как не крутил машину, как не ездил, цыфры не изменились.

Last edited by art-race74@yandex.ru (06-01-2011 15:14)

Offline

#17 06-01-2011 15:20

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Угол повората "на ходу"

Дэн всё правильно сделал, это ты немного ошибся
должно быть так:

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

#18 06-01-2011 15:57

art-race74@yandex.ru
Registered: 04-01-2011
Posts: 10
Website

Re: Угол повората "на ходу"

ой smile ну я стормозил...
Den_spb большое тебе спасибо)

Offline

Board footer

Powered by FluxBB