7. Родительская зависимость или Привязки В этой
главе мне бы хотелось рассказать о том что такое привязки, и что с ними можно
делать. Начнём сразу с примера. Да возьмём один из прошлых – помните, когда
мы поворачивали кубик?
В
общем-то ничего не изменилось, мы только поставили плоскость внизу, и (зачем-то
J)
создали камеру ПОСЛЕ создания куба. Хорошо,
теперь кое-что изменим. Представим, например, что мы делаем какую-нибудь игру
с видом от третьего лица. Тогда нам надо, чтобы камера двигалась вместе с
кирпичом – вернее сзади него. Сделайте вот что - замените простую строчку
создания камеры на:
Какая-то
хитрая строчка… вроде ничего не изменилось, кроме того, что мы поставили в
скобки переменную созданного нами куба. В этом и весь фокус! Когда мы создаём
какой-то объект, и в скобках ничего не указываем, объект создаётся свободным,
а если мы что-то укажем – объект становится зависимым от другого объекта,
указанного в скобках – в данном случае это куб. Немного расскажу об этой
зависимости: Значит
так, во-первых свободный, непривязанный ни к чему объект создаётся в точке
0,0,0 относительно мировой системы координат. Объект же, привязанный таким
образом к другому объекту - родителю, создаётся в той точке, где находится
его родитель. Второе – все команды которые писались раньше относительно
мировой системы координат – теперь пишутся относительно системы координат
родителя т.е. в данном случае если бы камера не была привязана к кубу,
команда PositionEntity cam,0,5,-10 означала бы поставить объект cam в точку с координатами 0,5,-10. А так как она
привязана к кубу, камера ставится в точку 0,5,-10 относительно куба (т.е.
центр куба для камеры считается точкой 0,0,0). Получается, что камера
располагается сзади и немного сверху относительно куба. И куда мы этот куб перед
этим бы не поставили, как бы не повернули – всё равна камера бы поставилась
именно таким образом. И, наконец, самое главное: Все движения и повороты,
которые применяются к родителю автоматически применяются к зависимым от него
объектам – то есть они как будто бы привязаны к родителю. Например, если мы
подвинем родителя, все зависимые от него объекты также подвинутся. Если
повернём – все зависимые объекты относительно него повернутся! Но не
наоборот! Как бы мы не вертели не крутили и не двигали зависимые объекты,
родителю будет на это всё глубоко параллельно… J Надеюсь
понятно объяснил. Хотелось бы только отметить: если всё же нам нужно будет
поместить, передвинуть или повернуть зависимый объект относительно мировой
системы координат, то это делается очень просто – в конце добавляется True (что значит, что команда совершается ГЛОБАЛЬНО – то
есть относительно мировой системы координат.). Например, если нам камеру надо
будет поставить в точку 5,5,-20 относительно мировой системы координат, а не
относительно мировой системы родителя - мы просто пишем PositionEntity cam,5,5,-20,True ! И всё! И
связь всё равно от этого не потеряется! Ох
и сочинение я тут написал! Ну да ладно – запустите программу, и вы увидите,
что камера стоит ровно, и следит за кубом. А он ездит (это видно по
плоскости, которая пролетает внизу – вот зачем она была нужна!). Чтобы
показать, что движение зависимых объектов никак не влияет на родителей,
добавим ещё две строчки в цикл:
В
них, как вы видите, условие – если нажата кнопка A – двигать камеру вперёд, а если нажата Z – назад. Куб остаётся на месте J! Полный
код:
Ну,
мы раскрыли секрет игр, сделанных от третьего лица J!
Но использование привязок не ограничивается «следящей» камерой. О том, что
ещё можно сделать с привязками, я расскажу в следующей главе. |
Оглавление: 0. Введение 5. 2Д в 3Д 7. Родительская зависимость или Привязки 9. Коллизион Детекшн или как устроен мир… 10. Первая 3Д игра. Часть 0 – основы движка 11. Первая 3Д игра. Часть 1 – разработка движка 12. Первая 3Д игра. Часть 2 – устранение багов 13. Первая 3Д игра. Часть 3 – внешний вид 14. Первая 3Д игра. Часть 4 – от массива к спискам 15. Первая 3Д игра. Часть 5 – оптимизация кода 16. Первая 3Д игра. Часть 6 – завершение 17. Выведение |