Рейтинг - 4.5 (2)

Всем привет! Сегодня речь пойдёт об спидометрах! Мы научимся создавать без каких-то усилий неплохие измерители скорости автомобилей.
Хочу сказать, что методов очень много и в этом уроке я расскажу о самом популярном и моём любимом способе - привязка скорости автомобиля к углу текстуры.
Первым шагом будет поиск нужных текстур. Рыская в интернете, я нашел подходящие картинки для спидометра. Эти картинки я закинул в новый TXD-архив SPEED, который вы можете скачать отсюда. и поместил в папку models/txd.
Запускаем наш Санни Билдер, и создаём новый документ. Проверим, сначала, если игрок не найден, то завершим наш поток:
Code
{$CLEO}
0000:
thread 'SPEED'

if
Player.Defined($PLAYER_CHAR)
jf @SPEED_END

// // //

:SPEED_END
wait 0
0A93: end_custom_thread
Если условие сработало, то создаём новый бесконечный цикл. В нём напишем проверку: "Актёр $PLAYER_ACTOR в транспорте". Если этот так, то загружаем наш архив текстур и сами картинки, которые она содержит
Code
while true
    if
    Actor.Driving($PLAYER_ACTOR)
    then
    0390: load_txd_dictionary 'SPEED'
    038F: load_texture "CIRCLE" as 1
    038F: load_texture "STRELK" as 2  
  
    // // // // //
   
    0391: release_txd_dictionary 
    end
wait 0
end
и тут-же выгружаем её из памяти. На месте комментариев, нам понадобится ещё один цикл while. Проверка будет такая-же, как и в условие IF, в которого вложен цикл:
Code
      while Actor.Driving($PLAYER_ACTOR)
                03F0: enable_text_draw 1

        wait 0
        end
Следующий пункт - рисование текстур. Обе картинки в нас имеют размер 256х256, что, согласитесь, многовато. По-этому рисовать текстуры мы будем размером 128х128.
Первую текстуру мы будем рисовать опкодом 038D, так как мы не собираемся её привязывать к скорости. А вот вторую(стрелку) рисуем опкодом 074B, так как он может вращать картинки на экране. В нас получится следующее:
Code
        while Actor.Driving($PLAYER_ACTOR)
                03F0: enable_text_draw 1
                03E3: set_texture_to_be_drawn_antialiased 1
                038D: draw_texture 1 position 540.0 280.0 size 128.0 128.0 RGBA 255 255 255 200
                03E3: set_texture_to_be_drawn_antialiased 1             
                074B: draw_texture 2 position 540.0 280.0 scale 128.0 128.0 angle 2@ color_RGBA 255 255 255 128
        wait 0
        end
Всё, что нам осталось - определить переменную 2@. Что-бы сделать скорость реалистичнее, и спидометр показывал более-менее правильные данные, мы должны перевести скорость машины(юниты) в километры. Я подсчитал, что для данного спидометра нужно умножить скорость машины на 4.0. Так как выбранная машина едет со скоростью 40 юнитов(в игре по ровной трассе), а в handling.cfg указано 160.0 км( или миль), юниты должны быть умножены на 160 / 40 = 4. Следовательно, мы получим:
Code
03C0: 1@ = actor $PLAYER_ACTOR car
02E3: 2@ = car 1@ speed
2@ *= 4.0
Таким образом, мы получили скорость машины. Нам осталось отобразить её на спидометре. Если так запустить скрипт, то стрелка будет в начале смотреть в низ, где никаких цифр не указано. Следовательно нам нужно сместить угол поворота стрелки на какой-то градус. Я вычислил, что для данного спидометра смещение должно быть на 54.0 градуса:


В нас получится следующий код:
Code
{$CLEO}
0000:

thread 'SPEED'
if
Player.Defined($PLAYER_CHAR)
jf @SPEED_END

while true
    if
    Actor.Driving($PLAYER_ACTOR)
    then
    0390: load_txd_dictionary 'SPEED'
    038F: load_texture "CIRCLE" as 1
    038F: load_texture "STRELK" as 2  
        while Actor.Driving($PLAYER_ACTOR)
                03F0: enable_text_draw 1
                03E3: set_texture_to_be_drawn_antialiased 1
                038D: draw_texture 1 position 540.0 280.0 size 128.0 128.0 RGBA 255 255 255 200
                03E3: set_texture_to_be_drawn_antialiased 1
                03C0: 1@ = actor $PLAYER_ACTOR car
                02E3: 2@ = car 1@ speed
                2@ *= 4.0 // Переводим скорость с юнитов в километры
                2@ += 54.0 // Поворачиваем текстуру стрелки на 54 градуса             
                074B: draw_texture 2 position 540.0 280.0 scale 128.0 128.0 angle 2@ color_RGBA 255 255 255 128
        wait 0
        end          
    0391: release_txd_dictionary 
    end
wait 0
end

:SPEED_END
wait 0
0A93: end_custom_thread
Результат:


Спидометр работает как часики, что и нужно было сделать wink На этом урок окончен! Удачи.
P.S. Вычислял нужный угол смещения стрелки я следующим кодом:
Code
                03C0: 1@ = actor $PLAYER_ACTOR car
                02E3: 2@ = car 1@ speed
                2@ *= 4.0
                0087: 0@ = 2@ // (float)
               
                while true
                    if
                    0AB0:  key_pressed 49 // 1
                    then
                        if
                        0AB0:  key_pressed 16 // SHIFT
                        then
                        0@ += 0.2
                        end             
                    0@ += 0.2
                    end              

                038D: draw_texture 1 position 540.0 280.0 size 128.0 128.0 RGBA 255 255 255 200
                074B: draw_texture 2 position 540.0 280.0 scale 128.0 128.0 angle 0@ color_RGBA 255 255 255 128
                0AD0: show_formatted_text_lowpriority "%f" time 1 0@
                wait 0
                end
Когда мы сели в транспорт, нажимаем 1 и стрелка будет постепенно менять свой угол. Я определил, что число 54, которые показывает опкод 0AD0, есть идеальным смещением.

Dock174   (10.06.13 23:37)
Неплохо) Грамотно все, рассказал да показал)  wink

Vital   (11.06.13 14:33)
Здорово! Всё проще, чем я думал. О зависимость поворота стрелки от скорости всё же высчиатывать надо каждый раз заново, для разных спидометров.

Yurko_UA   (13.06.13 06:36)
І все так просто? Круто!
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Какие моды Вы хотите видеть на сайте?
Всего ответов: 5
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
wmysterio
Реклама