Я бы порекомендовал либо:
- Использовать физические триггеры
- Использовать список синхронизированных событий
Физические триггеры
Просто поместите коробку на свой уровень.Когда он прокручивается частично или полностью на экран (в зависимости от того, что имеет больше смысла - может быть, использовать оба в разных случаях?), Вы запускаете событие, связанное с этим триггером.
Это было бы проще поддерживать в редакторе уровней, посколькуфизическая природа очень проста для визуализации.
Временные события
Вы в основном создаете объект таймера в начале уровня и упорядоченную очередь событий.В цикле обновления игры загляните в начало очереди.Если время запуска элемента в начале очереди меньше текущего истекшего времени, извлеките элемент из очереди и запустите событие.
Временные события были бы более полезными, поскольку они также поддерживали быне прокручиваемый уровень или не прокручивающиеся части уровней.
Комбинация обоих
Вы также можете сделать какое-то их сочетание, чтобы получить преимущества обоих стилей: Более простая визуализация / уровеньредактирование и поддержка секций без прокрутки или событий на основе времени.
Каждый физический триггер будет иметь свою собственную очередь сценариев.Когда срабатывает триггер, запускается таймер и создается очередь событий.Этот таймер и очередь добавляются в список текущих запущенных таймеров и очередей.
В своей функции обновления вы проверяете все элементы в списке и запускаете события так же, как вы делали это с вышеупомянутой синхронизированной очередью событий.Как только очередь очищается, вы удаляете ее из списка таймеров / очередей.
Как определить, что на экране отображается триггер
Сначала следует реализовать прокрутку.
Если у вас есть прокрутка, вычислите прямоугольник, который соответствует расположению экрана в вашей системе координат пиксель / мир.Это даст вам «ограничивающую рамку» экрана.
Отсюда выполните тест пересечения между «ограничительной рамкой» вашего триггера событий и экраном.
Вот тест, чтобы увидетьесли есть любое перекрытие между двумя прямоугольниками.Это не зависит от заказа:
rect1.left < rect2.right && rect1.right > rect2.left
&& rect1.top < rect2.bottom && rect1.bottom > rect2.top
Если касания касаются вообще, то вернется true.
Вот тест, чтобы убедиться, что rect1
содержит rect2
.Порядок важен:
rect1.left <= rect2.left && rect1.right >= rect2.right
&& rect1.top <= rect2.top && rect1.bottom >= rect2.bottom
Если rect2
полностью содержится в rect1
(он полностью отображается на экране), он вернет true.
Как реализовать простые таймеры
Просто получите какое-то значение часов (может быть SDL_GetTicks
) и сохраните это значение.
Чтобы узнать, сколько времени прошло с момента запуска таймера, позвонитефункцию снова и вычтите.Сравните значения с <
, чтобы увидеть, больше ли разница, чем целевое время.