SB LitDev #1 Введение в библиотеку LitDev

О библиотеке 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, в которой вам понадобится код, что вы написали.

В конспект

Сделать физические перерасчёты

While "True"
  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**. При помощи прямоугольных шейпов создайте такой уровень. Подберите физические параметры для мячика, чтобы он попал в цель. Также вы можете изменять трение для прямоугольников и других фиксированных шейпов.


Задача 4***. Эффект домино. Используйте подвижные шейпы. Доминошки (голубые прямоугольники) создавайте при помощи цикла.


Комментарии