Реклама:

Для начала решим один очень важный вопрос: куда мы поместим код, обрабатывающий устройства ввода? Вроде бы его стоит поместить туда, где и требуется проверка реакции игрока: в код, который отвечает за оружие; в код, который отвечает за движение; в код, который отвечает за... И получается, что код управления будет размазан по всему движку. А как же наш принцип кирпичиков? Не дело это. Код управления должен быть цельным. Лучше место для кода — обработчик тсьСасЗепсег.

Многие начинающие программисты недоумевают, зачем вообще нужен этот компонент?! Казалось бы, код надо привязывать к событиям, а не к какому-то там таймеру. Но Модулятор (именно так переводится Сааепсег) не просто таймер. Интервал, с которым срабатывает его событие, постоянно меняется и зависит от скорости рендера. В обработчик передается важнейшая переменная с1е]^аТз.те — время, которое прошло с момента предыдущего рендера. Именно к этому времени надо привязывать все движения в игре.

Поясню на примере. Допустим, вы делаете гоночный симуля-тор, и в каком-то неопределенном пока обработчике клавиатуры написали что-то вроде:

Если нажата клавиша "вперед", положение машины:=положение машины + 10

Так как обработчик будет срабатывать только в перерывах между рендером кадров, а приращение координаты машины каждый раз одно и то же, скорость машины будет зависеть от fps, т.е. в конечном счете — от производительности компьютера. На быстрых компьютерах машина будет ездить со скоростью 300 км/ч, на медленных выдавать только 100, а на графических станциях вообще полетит со скоростью ракеты! В довершение картины представьте, что вы с вашим другом играете в Сети, и у него машина едет быстрее только потому, что мощнее компьютер. Согласитесь, несправедливо? Вот чтобы такого не случалось, придумали Cadencer. В его обработчике вы можете написать так.

Если нажата клавиша "вперед", положение машины:=положение машины + 0,01* deltaTime

Коэффициент перед deltaTime подбирается экспериментально. Вот теперь машина будет ездить с одинаковой скоростью на любых компьютерах. Это же относится и к любым другим движущимся или меняющимся во времени игровым объектам. Поэтому TGLCadencer— один из центральных элементов нашего движка, и код работы с устройствами мы поместим именно в его обработчик.

Казалось бы, с клавиатурой и мышью никаких проблем нет — назначаем соответствующие события OnKeyDown и OnMouseMove главной формы и там описываем все необходимые действия... И нарываемся на подводный камень. Так делать категорически нельзя, особенно в том случае, если игра будет работать в полноэкранном режиме. Для полноэкранного режима GLScene создает особый тип окна, который несколько неадекватно реагирует на стандартные обработчики событий клавиатуры и мыши. Чаще всего в момент нажатия клавиши или кнопки мыши рендерер "запинается", геймеру кажется, что игра "тормозит". Поэтому код для работы с устройствами нам придется написать самостоятельно, благо дело это не особенно сложное.

Разработчики GLScene предусмотрели многие препятствия, которые могут встретиться на нашем пути, и загодя постелили соломку. А соломка эта выражается в специальном модуле Keyboard.pas.


⇐ Предыдущая страница| |Следующая страница ⇒