Пила сказав(ла):
а не можешь рассказать как это на экран вывести, ести тебе не трудно. ПОЖАЛУСТА
Это было не трудно, времени только малость жалко... Карта-пример прилагается, потому что объяснять со слов бесполезно!
Нюанс. Карта создана под CS:S, но в ep2 тоже будет работать. Только скайбокс будет отображаться неправильно.
Ниже я опишу как всё это работает:
1. point_proximity_sensor
Изначально создана бочка и объект
point_proximity_sensor.
point_proximity_sensor настроен, чтобы измерять расстояние до бочки.
2. Расстояние в метрах
Объект point_proximity_sensor измеряет расстояние в юнитах. Чтобы перевести юниты в метры, полученный результат делится на 52.5 (из расчёта на
официальный источник).
Полученное значение используется для дальнейших вычислений.
3. Точность измерений
Точно измерений может быть вплоть до сотых миллиметра, но такая точность не нужна, к тому же лишние числа создают лишнюю нагрузку.
В примере используются три знака перед запятой и два знака после запятой. То есть, точность - до сантиметра, и максимально возможное значение, которое будет отображено - это 999.99 метров, после чего дисплей будет показывать результат не правильно.
4. Оптимизация
Расчет и вывод результата на дисплей - это медленная операция, а объект point_proximity_sensor производит измерения постоянно, генерируя огромное количество Output'ов.
Чтобы этого избежать, после одного действия объект point_proximity_sensor выключается и включается через некоторое время.
В примере point_proximity_sensor работает 10 раз в секунду, что тоже многовато, можно поставить меньше.
Для настройки см. Output'ы объекта counter_main
5. Хитрости и "подводные камни"
Все расчёты, используемые при решении этой задачи, были выполнены с использованием специфики редактора Hammer и движка Source.
Обратите внимание, что все Output'ы имеют задержку выполнения равную
0.00! То есть за один проход, безотлагательно.
При создании Output'ов последовательность вызова этих Output'ов в игре полностью зависит последовательности их создания в редакторе.
Правило: Если два Output'а имеют одинаковое название, и время, то первым будет вызван тот, который был создан последним! Принцип LIFO (Last In First Out).
В редакторе Hammer последний созданный Output отображается ниже!
В следующем примере два Output'а с одинаковым названием и временем, в той последовательности как они отображаются в редакторе Hammer:
OnGreaterThan | counter_loop100 | Subtract | 100 | 0.00
OnGreaterThan | counter_temp100 | Add | 1 | 0.00
Какой будет вызван первым? Тот, который в списке ниже, т.е. где "Add | 1"
Для движка Source - это правило, поэтому можете безбоязненно пользоваться им для повышения быстродействия и эффективности своих карт

6. Определения
"Число" и "цифра" - это не одно и тоже!
Не нужно их путать. Из цифр состоят числа.
Пример цифр: 0, 1, 2, ... 9
Пример чисел: 15, 143.33, 48.3, 0.33
7. Расчёты
В движке Orange Box нет объекта, для работы с целочисленной арифметикой, поэтому все расчеты производятся с дробными числами.
Чтобы разбить какое-либо число на цифры, я использовал следующий алгоритм:
- Сначала вычисляется самая старшая цифра числа, в нашем случае - это сотни.
- Входное число отправляется первому объекту logic_compare, который сравнивает число с 100. Если входное число больше или равно 100, то из входного числа вычитается 100, и для текущей цифры увеличивается счётчик (объект counter_res100) на 1.
Цикл повторяется пока входное число остается быть больше 100.
- Когда входное число становится меньше 100, операция повторяется для следующей цифры. В нашем случае - для десятков.
Из входного числа вычитается по 10 до тех пор, пока входное число не станет меньше 10. Как и в случае с сотнями, количество циклов сохраняется в аналогичном объекте counter_res10
- Тоже самое повторяется для единиц (counter_res1), десятых (counter_res01), и сотых (counter_res001)
- После подсчёта всех цифр, результирующие значения для каждой цифры получаются сохранены в соответствующих объектах: от counter_res100 до counter_res001
То есть в объекте:
counter_res100 - первая цифра числа (сотни);
counter_res10 - вторая цифра (десятки);
counter_res1 - третья (единицы);
counter_res01 - четвертая (десятые, после запятой);
counter_res001 - пятая (сотые, после запятой).
8. Отображение результата
В этом примере для отображения результата используются браши.
Каждая цифра числа представлена в виде 7 брашей, расставленных так, как у цифр на калькуляторе.
Для того чтобы из этих 7 брашей изобразить какую-либо цифру, одни браши скрываются, а другие остаются видимыми. Короче, тут по принципу калькулятора.
Для удобство понимания последний шаг - вывод результата, определен в объекте relay_display.
Если понадобится выводить результат не брашами а как-то ещё, то расчёты трогать не нужно, достаточно просто подправить Output'ы объекта relay_display
9. Альтернативное отображение результата
В данном примере для вывода результата используются браши, но это очень неэффективный метод, пригодный лишь для примера.
Лучшим решением для поставленной задачи будет использование объекта
env_texturetoggle и создание специального материала с цифрами.
Вот и всё... кури, разбирайся...
PS. Нужно запатентовать этот метод )))