000114. Делаем спидометр!
Делаем спидометр!|Всем привет! Сегодня речь пойдёт об спидометрах! Мы научимся создавать без каких-либо усилий неплохие измерители скорости автомобилей.|wmysterio|wmysterio||||Хочу сказать, что методов очень много и в этом уроке я расскажу о самом популярном и моём любимом способе - привязка скорости автомобиля к углу текстуры. Первым шагом будет поиск нужных текстур. Рыская в интернете, я нашел подходящие картинки для спидометра. Эти картинки я закинул в новый TXD-архив "SPEED", который вы можете скачать отсюда. и поместил в папку models/txd. Запускаем наш Санни Билдер, и создаём новый документ. Проверим, сначала, если игрок не найден, то завершим наш поток:
1
{$CLEO}
2
0000:
3
thread 'SPEED'
4
5
if
6
Player.Defined($PLAYER_CHAR)
7
jf @SPEED_END
8
9
// // //
10
11
:SPEED_END
12
wait 0
13
0A93: end_custom_thread
Copied!
Если условие сработало, то создаём новый бесконечный цикл. В нём напишем проверку: "Актёр $PLAYER_ACTOR в транспорте?". Если этот так, то загружаем наш архив текстур и сами картинки, которые она содержит:
1
while true
2
if
3
Actor.Driving($PLAYER_ACTOR)
4
then
5
0390: load_txd_dictionary 'SPEED'
6
038F: load_texture "CIRCLE" as 1
7
038F: load_texture "STRELK" as 2
8
9
// // // // //
10
11
0391: release_txd_dictionary
12
end
13
wait 0
14
end
Copied!
и тут-же выгружаем её из памяти. На месте комментариев, нам понадобится ещё один цикл while. Проверка будет такая-же, как и в условие IF, в которого вложен цикл:
1
while Actor.Driving($PLAYER_ACTOR)
2
03F0: enable_text_draw 1
3
4
wait 0
5
end
Copied!
Следующий пункт - рисование текстур. Обе картинки в нас имеют размер 256х256, что, согласитесь, многовато. Поэтому рисовать текстуры мы будем размером 128х128. Первую текстуру мы будем рисовать опкодом "038D", так как мы не собираемся её привязывать к скорости. А вот вторую ( стрелку ) рисуем опкодом "074B", так как он может вращать картинки на экране. В нас получится следующее:
1
while Actor.Driving($PLAYER_ACTOR)
2
03F0: enable_text_draw 1
3
03E3: set_texture_to_be_drawn_antialiased 1
4
038D: draw_texture 1 position 540.0 280.0 size 128.0 128.0 RGBA 255 255 255 200
5
03E3: set_texture_to_be_drawn_antialiased 1
6
074B: draw_texture 2 position 540.0 280.0 scale 128.0 128.0 angle [email protected] color_RGBA 255 255 255 128
7
wait 0
8
end
Copied!
Всё, что нам осталось - определить переменную "[email protected]". Что-бы сделать скорость реалистичнее, и спидометр показывал более-менее правильные данные, мы должны перевести скорость ( юниты ) машины в километры. Я подсчитал, что для данного спидометра нужно умножить скорость машины на 4.0. Так, как выбранная машина едет со скоростью 40 юнитов ( в игре по ровной трассе ), а в "handling.cfg" указано 160.0 км ( или миль ), юниты должны быть умножены на ( 160 / 40 ) = 4. Следовательно, мы получим:
1
03C0: [email protected] = actor $PLAYER_ACTOR car
Copied!
Таким образом, мы получили скорость машины. Нам осталось отобразить её на спидометре. Если так запустить скрипт, то стрелка будет в начале смотреть в низ, где никаких цифр не указано. Следовательно нам нужно сместить угол поворота стрелки на какой-то градус. Я вычислил, что для данного спидометра смещение должно быть на 54.0 градуса:
В нас получится следующий код:
1
{$CLEO}
2
0000:
3
4
thread 'SPEED'
5
if
6
Player.Defined($PLAYER_CHAR)
7
jf @SPEED_END
8
9
while true
10
if
11
Actor.Driving($PLAYER_ACTOR)
12
then
13
0390: load_txd_dictionary 'SPEED'
14
038F: load_texture "CIRCLE" as 1
15
038F: load_texture "STRELK" as 2
16
while Actor.Driving($PLAYER_ACTOR)
17
03F0: enable_text_draw 1
18
03E3: set_texture_to_be_drawn_antialiased 1
19
038D: draw_texture 1 position 540.0 280.0 size 128.0 128.0 RGBA 255 255 255 200
20
03E3: set_texture_to_be_drawn_antialiased 1
21
03C0: [email protected] = actor $PLAYER_ACTOR car
23
[email protected] *= 4.0 // Переводим скорость с юнитов в километры
24
[email protected] += 54.0 // Поворачиваем текстуру стрелки на 54 градуса
25
074B: draw_texture 2 position 540.0 280.0 scale 128.0 128.0 angle [email protected] color_RGBA 255 255 255 128
26
wait 0
27
end
28
0391: release_txd_dictionary
29
end
30
wait 0
31
end
32
33
:SPEED_END
34
wait 0
35
0A93: end_custom_thread
Copied!
Результат:
Спидометр работает как часики, что и нужно было сделать :) На этом урок окончен. Удачи!
P.S. Вычислял нужный угол смещения стрелки я следующим кодом:
1
03C0: [email protected] = actor $PLAYER_ACTOR car
5
6
while true
7
if
8
0AB0: key_pressed 49 // 1
9
then
10
if
11
0AB0: key_pressed 16 // SHIFT
12
then
14
end
16
end
17
18
038D: draw_texture 1 position 540.0 280.0 size 128.0 128.0 RGBA 255 255 255 200
19
074B: draw_texture 2 position 540.0 280.0 scale 128.0 128.0 angle [email protected] color_RGBA 255 255 255 128
20
0AD0: show_formatted_text_lowpriority "%f" time 1 [email protected]
21
wait 0
22
end
Copied!
Когда мы сели в транспорт, нажимаем 1 и стрелка будет постепенно менять свой угол. Я определил, что число 54, которые показывает опкод "0AD0" и есть идеальным смещением для даного случая.|2018|1|0|32064124png600337400224``\|31167069png350289
1
`\||delaem_spidometr|1504503695
Copied!
Copy link
Edit on GitHub