Урок 4: Физика и столкновения В этом уроке мы научим взаимодействовать друг с другом объекты на нашем игровом уровне. Шаг 1: Имена объектов На данный момент мы не используем никаких объектов, кроме камеры. Для начала давайте возьмем парочку и установим для них физические настройки. У всех объектов на уровне есть свое имя, и именно по нему мы будем обращаться к ним. На картинке ниже показаны имена, которые мы будем использовать: Почему же шар называется Cube.002? Это долгая история, и пока что это абсолютно не важно... Итак, теперь мы знаем имена двух объектов. Они и будут взаимодействовать друг с другом в дальнейшем. Шаг 2: Физические примитивы и масса Давайте вернемся к коду из первого урока: scn = elf.LoadScene("level1.pak") while elf.Run() == true do end Нам требуется изменить код, добавить две строчки после elf.LoadScene. Если добавить их до этой строки, то мы получим ошибку, т.к. переменная scn не будет ничего содержать. Наконец, обратимся к нашим двум объектам и запишем их в переменные ent1 и ent2: scn = elf.LoadScene("level1.pak") ent1 = elf.GetEntityByName(scn, "Plane") ent2 = elf.GetEntityByName(scn, "Cube.002") while elf.Run() == true do end Функция elf.GetEntityByName берет со сцены, которая является первым агрументом, объекты под нужным именем, которое, соответственно, является вторым аргументом этой функции. Вот мы "захватили" нашу сферу и пол и можем установить для них физику: scn = elf.LoadScene("level1.pak") ent1 = elf.GetEntityByName(scn, "Plane") ent2 = elf.GetEntityByName(scn, "Cube.002") elf.SetActorPhysics(ent1, elf.MESH, 0.0) elf.SetActorPhysics(ent2, elf.SPHERE, 1.0) while elf.Run() == true do end Первый аргумент функции SetActorPhysics - тот объект, который мы "обучаем" физическим законам, второй аргумент - тип физического примитива. А третий это масса. В BlendElf все статические объекты, например пол, обладают нулевой массой. Что такое физический примитив? В BlendElf каждый объект, подчиняющийся физике, должен иметь один из доступных в движке примитивов, по сути, это определение формы нашего объекта. Вот список доступных примитивов: elf.BOX - обыкновенная коробка\куб elf.SPHERE - шар\сфера elf.MESH - модель, столкновения с которой происходят по ее полигонам. Лучше всего подходит для статических объектов, вроде пола\стен. elf.CAPSULE_X - Капсула (элипс, овал) с концами по оси X elf.CAPSULE_Y - Капсула (элипс, овал) с концами по оси Y elf.CAPSULE_Z - Капсула (элипс, овал) с концами по оси Z elf.CONE_X - Конус с углом по оси X elf.CONE_Y - Конус с углом по оси Y elf.CONE_Z - Конус с углом по оси Z Размеры примитива, как правило, определяются автоматически (для объектов, подчиняющихся физике, естественно), так что можете об этом не беспокоиться. Но на всякий случай вы сами можете определить размеры вашего тела функцией elf.SetActorBoundingLengths. Для elf.MESH вычисление размеров не требуется, т.к. информация о нем уже загружена в BlendElf и может спокойно использоваться в физическом движке. Запустите игру. Мои поздравления, теперь ваш шар падает вниз и катится по полу. Шаг 3: Добавим "интересностей" Падающий шар не очень интересен, давайте добавим ему немного начальной скорости. scn = elf.LoadScene("level1.pak") ent1 = elf.GetEntityByName(scn, "Plane") ent2 = elf.GetEntityByName(scn, "Cube.002") elf.SetActorPhysics(ent1, elf.MESH, 0.0) elf.SetActorPhysics(ent2, elf.SPHERE, 1.0) elf.SetActorLinearVelocity(ent2, 0.0, 0.0, 6.0) while elf.Run() == true do end Первый аргумент новой функции elf.SetActorLinearVelocity это объект, который мы хотим ускорить, остальные три - скорость в определенном направлении: по x, y, z.
Источник: КЛИК» |