SB LitDev #2 Гравитация, ускорение и столкновения


Try it out

1. Мячик в невесомости

1.1. Создадим проект, назначив размеры экрана и его физические границы.
width = 600
height = 400

GraphicsWindow.Width = width
GraphicsWindow.Height = height
LDPhysics.SetBoundaries(0,width,0,height)

1.2. Добавим мячик и изменим его расположение.
hero = Shapes.AddEllipse(30,30)

LDPhysics.AddMovingShape(hero,.3,0.5,1)
LDPhysics.SetPosition(hero,250,height-32,0)

1.3. При нажатии на стрелки на клавиатуре будем указывать направление движения, при отжатии клавиши направление будет обнуляться.
GraphicsWindow.KeyDown = onKeyDown
GraphicsWindow.KeyUp = onKeyUp

Sub onKeyDown
  k = GraphicsWindow.LastKey
  If (k = "Left") Then
    left = 1
  ElseIf (k = "Right") Then
    right = 1
  ElseIf (k = "Up") Then
    up = 1
  ElseIf (k = "Down") Then
    down = 1
  EndIf
EndSub
  
Sub onKeyUp
  k = GraphicsWindow.LastKey
  If (k = "Left") Then
    left = 0
  ElseIf (k = "Right") Then
    right = 0
  ElseIf (k = "Up") Then
    up = 0
  ElseIf (k = "Down") Then
    down = 0
  EndIf
EndSub

1.4. Добудем массу объекта. Она понадобится для того, чтобы придавать ему ускорение в будущем.
mass = LDPhysics.GetMass(hero)

1.5. Создадим игровой цикл. В нём будем давать ускорение для мячика в зависимости от того, какое направление сейчас активно.
While "True"
  If (left = 1) Then
    LDPhysics.SetImpulse(hero,-2*mass,0) ' Дать ускорение по оси Х в размере -2 массы (влево)
  EndIf
  If (right = 1) Then
    LDPhysics.SetImpulse(hero,2*mass,0)
  EndIf
  If (up = 1) Then
    LDPhysics.SetImpulse(hero,0,-2*mass)
  EndIf
  If (down = 1) Then
    LDPhysics.SetImpulse(hero,0,2*mass)
  EndIf
  LDPhysics.DoTimestep()
  Program.Delay(20)
EndWhile

1.6. Пора убрать гравитацию. По умолчанию, гравитация по оси х = 0, по оси у = 100.
LDPhysics.SetBoundaries(0,width,0,height)

LDPhysics.SetGravity(0,0)

Таким образом, можно настраивать уровень гравитации в игре, её направление.

2. Пуля и коробаны.

Создадим проект, в котором будем давать шарику начальное ускорение и он будет сбивать ящики, собранные в столбик.
2.1. Базовый шаблон:
width = 600
height = 400

GraphicsWindow.Width = width
GraphicsWindow.Height = height
LDPhysics.SetBoundaries(0,width,0,height)

2.2. Создадим вертикальный ряд из кубиков, добавив им физики:
For i = 1 To 20
  block[i] = Shapes.AddRectangle(20,20)
  LDPhysics.AddMovingShape(block[i],0.3,0.8,1)
  LDPhysics.SetPosition(block[i],500,height-20*i+10,0)
EndFor

2.3. Создадим маленький шарик.
bullet = Shapes.AddEllipse(8,8)
LDPhysics.AddMovingShape(bullet,0,1,1)
LDPhysics.SetPosition(bullet,50,200,0)

2.4. Зададим ему большую скорость по оси Х:
LDPhysics.SetVelocity(bullet,1000,0)

2.5. Игровой цикл.
While "True"
  LDPhysics.DoTimestep()
  Program.Delay(20)
EndWhile

В конспект

Настройки гравитации

LDPhysics.SetGravity(gravX, gravY)

Получить массу объекта

mass = LDPhysics.GetMass(object)

Дать объекту ускорение (импульс, удар)

LDPhysics.SetImpulse(shapeName, impulseX, impulseY)

Установить скорость объекта

SetVelocity(shapeName, velX, velY)

Задачи

Задача 1*. Чем отличается установка скорости объекта от ускорения объекта? Попробуйте проверить на практике.

Задача 2*. Настройте скорость пули из кода Try it out 2 так, чтобы она сбивала только один верхний ящик с первого выстрела.

Задача 3***. Создайте проект "Сбор космического мусора". Видео проекта:

Подсказки: вам понадобится расчёт расстояния от центра зоны сбора мусора (зелёная) до центра ящика и расчёт скорости объекта. Мусор съедается только при условии, что расстояние до него от зоны меньше 50 и скорость этого мусора меньше 40. Чтобы рассчитать скорость, используйте такой код:
Sub getVelocity
  velocityArray = LDPhysics.GetVelocity(box)
  velocity = Math.SquareRoot(Math.Power(velocityArray[1],2) + Math.Power(velocityArray[2],2))
EndSub

Задача 4***. Добавляйте очки за каждый собранный ящик мусора. Чем медленнее мусор заходит в мусоросбор, тем больше очков пусть даётся.
Например, если скорость velocity ящика на момент исчезновения была 32, то пусть даётся 8 очков, если скорость была 20, то пусть начисляется 20 очков и т.п.

Задача 5*. Добавьте таймер, за который нужно собрать как можно больше мусора.

Задача 6****. Добавьте второго игрока и второй мусоросборник. Добавьте несколько ящиков разного цвета, которые будут давать разное количество победных очков. Добавьте определение победителя как того, кто больше соберёт мусора.

Комментарии