О библиотеке LitDev
До сих пор мы прописывали простую физику сами – гравитацию в гугл-динозаврике, систему сталкивания. Мы прокачали этот скилл и пришла пора познакомиться с физическим движком LDPhysics, входящим в библиотеку LitDev.Скачать библиотеку вы можете с официального сайта.
Try it out
Создадим симуляцию движения падающего прыгающего мячика.1. Начнём со стандартного паттерна для игрового цикла:
Sub setup
width = 800
height = 600
GraphicsWindow.Width = width
GraphicsWindow.Height = height
EndSub
setup()
While "True"
Program.Delay(20)
EndWhile
2. Подключим физические перерасчёты и отрисовку графики физическим движком в цикле:
setup()
While "True"
LDPhysics.DoTimestep()
Program.Delay(20)
EndWhile
3. Создадим подпрограмму для создания мячика, на который действуют законы физики. Внимательно ознакомьтесь с комментариями для понимания, что происходит.
Sub createBall
GraphicsWindow.BrushColor = "Black"
diameter = 40
ball = Shapes.AddEllipse(diameter,diameter)
' Зададим физические параметры для мячика
friction = .2 ' Трение (от 0 до 1) – чем больше, тем больше сила трения мячика о поверхности
restitution = .2 ' Упругость (от 0 до 1) – чем больше, тем сильнее мячик отбивается от других предметов
density = 1 ' Плотность – пока что будем приравнивать к 1, значения сейчас не имеет
' Превращаем наш рисунок мячика в физический объект
LDPhysics.AddMovingShape(ball,friction,restitution,density) ' AddMovingShape означает "добавить движущийся объект"
LDPhysics.SetPosition(ball,40,40,0) ' задаёт позицию центра объекта х = 40, у = 40 и вращение на 0 градусов
EndSub
Не забываем вызвать эту подпрограмму в setup(). Запустите код и посмотрите, как работает физика.
4. Воу-воу! Мячик не долетает до нижней границы графического окна – границы отбивания невидимы и заданы по умолчанию, они явно короче, чем наше видимое окно. Изменим их:
Sub setup
width = 800
height = 600
GraphicsWindow.Width = width
GraphicsWindow.Height = height
LDPhysics.SetBoundaries(0,width,0,height) ' 0 левая граница, width – правая, 0 – верхняя, height – нижняя
createBall()
EndSub
Запустите код и убедитесь, что теперь мячик отбивается от краёв графического окна
5. Поиграйте с параметром restitution, посмотрите, как меняется отбивание мячика.
6. Создадим полигоны – это будет землица, от которой мячик будет отбиваться.
6.1. Сначала напишем подпрограмму для создания полигонов:
Sub createPolygones
GraphicsWindow.BrushColor = "Green"
' Координаты вершин полигона запишем в массив
points[0]["x"] = 0
points[0]["y"] = 400
points[1]["x"] = 150
points[1]["y"] = 300
points[2]["x"] = 300
points[2]["y"] = 300
points[3]["x"] = 600
points[3]["y"] = 450
points[4]["x"] = 650
points[4]["y"] = height
points[5]["x"] = 0
points[5]["y"] = height
' Создаём из массива вершин полигон:
polygon = LDShapes.AddPolygon(points)
' Добавляем созданный полигон к физическим объектам 0.5 - трение, 0.8 – упругость
LDPhysics.AddFixedShape(polygon,0.5,0.8)
' Координаты расположения полигона (280 и height-120) выведены экспериментально:
LDPhysics.SetPosition(polygon,280,height-120,0)
EndSub
6.2. Добавим ещё один полигон:
LDPhysics.SetPosition(polygon,280,height-120,0)
points2[0]["x"] = 700
points2[0]["y"] = height
points2[1]["x"] = 750
points2[1]["y"] = height-50
points2[2]["x"] = width
points2[2]["y"] = height
polygon2 = LDShapes.AddPolygon(points2)
LDPhysics.AddFixedShape(polygon2,0.5,0.8)
LDPhysics.SetPosition(polygon2,700,height-10,0)
EndSub
Не забудьте вызвать эту подпрограмму.
7. Добавим красную зону, в которую должен попасть мячик. Эта зона будет физически неактивной, поэтому её добавлять к физическому движку нет необходимости:
Sub createZone
GraphicsWindow.BrushColor = "Red"
zone = Shapes.AddRectangle(100,10)
Shapes.Move(zone,600,height-10)
EndSub
Запустите код, проверьте, что всё работает и отображается. У вас будет задача 1, в которой вам понадобится код, что вы написали.
В конспект
Сделать физические перерасчёты
LDPhysics.DoTimestep()
Program.Delay(20)
EndWhile
Добавить шейп к подвижным физическим объектам
LDPhysics.AddMovingShape(shapeName,friction,restitution,density)Добавить шейп к неподвижным физическим объектам
LDPhysics.AddFixedShape(shapeName,friction,restitution)Настроить границы физического мира
LDPhysics.SetBoundaries(left,right,top,bottom)Задачи
Задача 1*. Найдите значения friction (трения) и restitution (упругость) для мячика, чтобы он попал в красную зону. Density (плотность) можно оставить равной 1.
Задача 2*. Создайте 100 мячиков случайного цвета со случайными параметрами friction и restitution, появляющимися с интервалом в 100 мс в левом верхнем углу экрана.
Задача 3**. При помощи прямоугольных шейпов создайте такой уровень. Подберите физические параметры для мячика, чтобы он попал в цель. Также вы можете изменять трение для прямоугольников и других фиксированных шейпов.
Задача 3**. При помощи прямоугольных шейпов создайте такой уровень. Подберите физические параметры для мячика, чтобы он попал в цель. Также вы можете изменять трение для прямоугольников и других фиксированных шейпов.
Комментарии
Отправить комментарий