Воскресенье, 19.05.2024, 05:07
Personal dimanche13 site
Главная | Регистрация | Вход Приветствую Вас Гость | RSS
Категории каталога
Мои статьи [22]
BlitzMax [17]
раздел содержит статьи относящиеся к языку программирования BlitzMax
SDL [9]
раздел содержит статьи на тему SDL
Code::Blocks [3]
в этом разделе рассказывается как прикрутить движок к интегрированной среде разработки(IDE) Code::Blocks
Форма входа
Поиск
Друзья сайта
Главная » Статьи » BlitzMax

BlitzMax + Farseer (1)

Содержание:

1.Немного о FarSeer.

2.Пробуем

3.Радуемся

Немного о FarSeer.

полное название движка Farseer Physics Engine. Изначально движок был написан на С# Джеффом Вебером (Jeff Weber) из конторы Farseer Games. Язык С# очень молодой, но так как поддерживается корпорацией Microsoft стал заметно популярен, в связи с чем, на нем появляются всевозможные разработки. Одной из таких разработок и стал физический двумерный движок Farseer (еще есть Physics2D.Net к примеру). Основан он прежде всего на физ.движке Box2D, чего автор и не скрывает, выражая благодарности его создателю Erin Catto. Первый релиз Farseer был в начале октября далекого уже 2006 года. Насчитывал всего 3 демки и большого шума не наделал. Но благодаря упорству авторов и добавлению все новых и новых возможностей, он стал одним из сильнейших в своем классе. На данный момент на офф. сайте http://www.codeplex.com/FarseerPhysics доступна для скачивания версия 1.0.0.5 . Но C# нас пока мало интересует. Когда-то давно, я как раз искал  физический движок для своего маленького проекта на BlitzMax-е и кроме двух платных движков (1.PhysLite http://www.gooeyblob.com/phys.htm и 2.ppIsaac http://www.pyroplay.de/ppisaac.html) и заброшенного комьюнити проекта (PhysMax из которого, кстати и отделился PhysLite) ничего не нашел,к большому моему сожалению. Но вот, совсем недавно, Farseer портировал на BlitzMax один энтузиаст Alex Okafor  и мы теперь тоже можем попробовать этот движок в действии. Скачать этот модуль можно вот по этой ссылке http://www.paradeofrain.com/download.php?id=16 .

 Пробуем.

Для начала распакуйте архив в папку к модулям "\mod" и скомпильте его. Чтобы посмотреть все возможности движка, можно запустить ..\farseerphysics.mod\examples\main.bmx ,где вас будут ждать 13 пунктов испытаний, от самых простых, до физики флюидов. Давайте сначала рассмотрим как создать самые простые объекты, такие как круг, квадрат, прямоугольник. 

Основной цикл программы, как советует разработчик движка, должен выглядеть так

1.Create Body object.  (Создать объект)
2.Add Body object to simulator. (добавить его в физический симулятор)
Begin Game Loop 
  3.Apply forces and torques to Body. ( воздействовать на тело силой и вращением)
  4.Update the simulator ( апдейт симулятора физики )
  5.Set sprite position and rotation equal to Body position and rotation. ( установить позиции и поворот спрайтов такие же как у объекта )
  6.Draw game sprite ( нарисовать спрайты, отвечающие за объект )
End Game Loop

В скобках мой вольный перевод, без которого и так все понятно. Сначала, надо сказать, что в Farseer есть два основных понятия тело(Body) и геометрия(Geometry). Им соответствуют такие типы TBody и TGeom. При изначальном создании тела(body) ему не соответствует никакой геометрии, иными словами тело бесформенно. Естественно оно не будет иметь и коллизий. Для коллизий в Farseer -е используются геометрии объектов. К одному телу(body) могут быть прицепленны несколько геометрий(geometry). Теория теорией, а практика сразу расставит все на места. Для начала, давайте создадим простое тело и прицепим к нему геометрию, как того требует движок.

SuperStrict ' я всегда его использую ;)

Import aco.farseerphysics   ' подключим физ.движок farseer

global physics:TPhysicsSimulator  ' это будет симулятор физики

global BoxBody:TBody          ' это само тело объекта

global BoxGeometry:TGeom  ' это геометрия нашего объекта

rem

сначала надо создать наш физический симулятор, для чего мы должны воспользоваться функцией TPhysicsSimulator.Create в единственном параметре которой должны указать вектор гравитации, для создания вектора в движке есть специальный тип данных Vector2, он нам поможет не только сейчас, но и в дальнейшем. 

end rem

physics = TPhysicsSimulator.Create( Vector2.Create(0, 100) )

rem

Vector2 принимает два параметра X и Y, в данном случае (0,100) что означает вектор гравитации направлен только по одной оси Y(вниз, так как значение положительное) с силой 100, по оси X - гравитации нет, так как X = 0 .Попробуйте поменять эти параметры, для того чтобы понять как они работают. При (0, 0) гравитация в симуляторе отсутствует.

end rem

BoxBody = TBodyFactory.CreateRectangleBody(physics, 40, 40, 1)

rem

здесь мы инициализировали тело для нашего объекта воспользовавшись вспомогательным типом TBodyFactory, название которого говорит само за себя. Указали, что тело будет прямоугольником CreateRectangleBody , будет симулироваться в physics, который мы создали ранее, и иметь в ширину 40 пикселей и в высоту тоже 40 пикселей (это квадрат) с массой равной 1.

end rem

BoxGeometry= TGeomFactory.CreateRectangleGeom(physics, BoxBody, 40, 40)

rem

Для создания геометрии тела, есть специальный тип TGeomFactory, его функция CreateRectangleGeom создает геометрию прямоугольника, как вы могли заметить уже из названия. В параметрах передается- симулятор, тело:TBody, ширина и высота геометрической сущности тела.

end rem

Graphics(800, 600) ' включим оконный видеорежим 800х600 

BoxBody.SetPosition( Vector2.Create(800 / 2, 100) )

rem

разместим наш квадрат в координатах 300,300 для этого применим метод SetPosition из TBody. Следует заметить, что параметр имеет тип Vector2 и означет координаты экрана, куда будет перенесен центр объекта.

end rem

' теперь создадим второй объект: это будет неподвижный прямоугольник, 'воспользуемся уже знакомыми нам функциями

global FloorBody:TBody

global FloorGeometry:TGeom

FloorBody = TBodyFactory.CreateRectangleBody(physics, 800, 100, 1)
FloorGeometry= TGeomFactory.CreateRectangleGeom(physics, FloorBody, 800, 100)

' расположим его внизу экрана

FloorBody.SetPosition( Vector2.Create( 800 / 2, 600 - 50 ) )

' и укажем, что объект будет статичен, значит гравитация на него не влияет

FloorBody.SetStatic( True )

Почти все мы подготовили, теперь осталось решить какие картинки будут соответствовать нашим объектам. Конечно, вы можете загрузить картинку ящика для нашего Box-а или картинку кирпичного пола для Floor-а, но есть еще один вариант, разработчик версии для BlitzMax-а предусмотрел создание картинок, по их параметрам, то есть не надо суматошно искать или рисовать картинку квадрата 40х40, а для тестирования воспользоваться созданой движком элементарной картинкой. По-моему очень удобно. Сначала создадим картинку для квадрат:

global boxImage:Timage ' здесь будет картинка квадрата

BoxImage = TDrawingHelper.CreateRectangleTexture(40, 40, TColor.DarkGray)

Как видите все функции имеют названия сходные с их назначением, так TBodyFactory помогает создать тело, TGeomFactory помогает создать геометрию, а TDrawingHelper поможет нам создать тестовую текстуру для объекта и нарисовать её. Функция CreateRectangleTexture как раз делает текстуру прямоугольника и имеет следующие входные параметры: ширина, высота, цвет закраски, цвет границы фигуры(линий по периметру), ширину границы, ширина перехода внутренней границы(будет плавно переходить вовнутрь от цвета границы к цвету закраски), ширина перехода внешней границы. Обязательны только первые три параметра, остальные можете не указывать. Так, в примере выше, будет создана текстура 40 на 40, заполненная серым цветом. А если хотите контрастные границы объекта, например красного цвета, то это можно сделать так:

BoxImage = TDrawingHelper.CreateRectangleTexture(40, 40, TColor.DarkGray, TColor.Red)

Для того чтобы пользоваться помощником рисования(TDrawingHelper) и типом "цвет"(TColor) необходимо подключить(Include) к проекту соответствующие файлы  "DrawingHelper.bmx" и "Color.bmx" они находятся в папке  "../examples/DrawingSystem/.." я эту папку перенес, прямо в папку с этим проектом. 

Теперь также просто можно создать картинку и для объекта floor.

global FloorImage:Timage ' здесь будет картинка пола(floor)

FloorImage = TDrawingHelper.CreateRectangleTexture(width, height, TColor.Black, TColor.White, , , 10)

Здесь цвет закраски черный(Black) а цвет границы объекта белый(White), заметьте что я пропустил несколько параметров в функции, в BlitzMax-е это допустимо, и их значения установятся по-умолчанию, как описаны в объявлении функции. Последний параметр(10) создает плавный переход цвета от границы фигуры вовнутрь, в десять шагов. Картинки теперь надо отцентровать:

MidHandleImage( FloorImage )
MidHandleImage( BoxImage )

Радуемся.

Итак все подготовительные дела сделаны, надо бы уже запустить наш первый проект. Напишем, главный цикл программы, как всегда он очень прост, апдейтим симулятор физики и рисуем наши объекты.

Global deltaTime:Float = 0.016

While Not(KeyDown(KEY_ESCAPE))
 
 physics.Update( deltaTime )
 
 Cls
  TDrawingHelper.DrawGeom( BoxGeometry, BoxImage )
  TDrawingHelper.DrawGeom( FloorGeometry, FloorImage )
 Flip
 
Wend

Теперь можно запускать(F5) и увидеть как наш квадратик падает на пол. Как-то ненатурально он упал, как будто прилип к полу. Просто надо перед главным циклом вписать: 

BoxGeometry.SetRestitutionCoefficient(1.0)

Коэффициент Restitution определяет как будет реагировать тело на коллизию и с какой силой от него отскакивать.

Кстати, вы можете создать тело, но сразу не заносить его в симулятор физики (physics), для этого в параметре просто укажите Null и добавите тело в сиулятор, когда захотите :

physics.AddBody( MyBody )

Геометрия, естественно добавляется таким же примерно образом:

physics.AddGeom( MyGeom )

Поздравляю, с первым заданием мы справились. 






Категория: BlitzMax | Добавил: dimanche (20.07.2008) | Автор: Dmitriy
Просмотров: 2214 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Copyright MyCorp © 2024