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

BlitzMax + Farseer (2)

Встаньте дети, встаньте в круг.

Теперь создадим объект - круг. Это ничуть не сложнее, чем создавать прямоугольный объект, как мы это сделали ранее. У нас есть типы-помощники, названия которых мы уже знаем, так давайте воспользуемся ими! 

global CircleBody:Body ' это тело

global CircleGeometry:TGeom  ' это геометрия

global CircleImage:TImage ' это картинка

Для тела заюзаем ФабрикуТел (TBodyFactory) , для геометрии ФабрикуГеометрии (TGeomFactory), а для текстуры ПомощникРисования (TDrawingHelper). Вперед!

CircleBody = TBodyFactory.CreateCircleBody( physics, 15, 2 )

CreateCircleBody - создает тело для круга, в параметрах принимает(по порядку, слева-направо): физический симулятор, радиус(НЕ диаметр) и массу.

CircleGeometry = TGeomFactory.CreateCircleGeom(physics, CircleBody, 15, 2)

CreateCircleGeom - создает геометрию круга для тела, в параметрах принимает(по порядку, слева-направо): физический симулятор, тело, радиус и массу.

CircleImage = TDrawingHelper.CreateCircleTexture(radius, TColor.Black, TColor.White )

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

MidHandleImage( CircleImage )

Тут стоит остановиться и рассказать более подробно о различиях между телами и геометриями. В Farseer-е силы(Forces), моменты(Torques), и импульсы(Impulses) применяются только к телам (TBody), и они перемещаются, так реалистично, как это бывает в обычной жизни. Но сами по себе тела не имеют форм и между собой не сталкиваются, то есть не имеют коллизий. Между тем коллизируют между собой - геометрии (TGeom), которые представляют собой 2D полигоны и могут быть выпуклыми(concave) или вогнутыми(convex). Теперь должно быть понятно, что "установка позиции" (SetPosition) является методом для тела, так же как применение к нему силы, вращательных моментов и всего остального. К геометрии же применимы такие методы как категоря коллизий, с кем может колизиться данный объект, размеры сетки коллизий, коэффициент трения, коэффициент упругости и другие. Так что спозиционируем наш объект, другими словами - разместим, в нашем мире:

CircleBody.SetPosition( Vector2.Create(100 , 100) )

Ок. С кругом мы тоже справились. Поздравляю!

Сложные фигуры.

Теперь, когда мы создали самые примитивные фигуры, мы можем дать волю своей фантазии. В нашей жизни существует огромное множество геометрических фигур, выпуклых или вогнутых или еще каких либо, которые описывают контуры объектов. Создавать их по их же названиям не представляется возможным, необходимо будет описать столько типов принимающих разные параметры, что если мы и захотим это сделать, то быстро запутаемся и бросим эту затею. Тем не менее, есть более изящный способ для создания объектов произвольной формы. Если принять центр вашей сложной фигуры, за координаты (0,0) или другими словами, за начало координат, то указывая точки где эти высоты изгибаются, мы сможем получить любую фигуру. К примеру можно создать модель фигуры "треугольник". Она имеет всего три точки. Нетрудно представить в уме или накидать на бумаге систему 2Д координат. Тогда очевидными будут координаты этих точек. A(0,15) B(-15,-15) и C(15,-15). Впрочем вместо 15 можно другую цифру в зависимости от масштабов треугольника. А вместо трех точек можно задать больше, смотря насколько сложна фигура. Затем надо сообщить движку, что объект мы будем делать из координат ее вершин. Существует дополнительный тип вершин, который нам должен помочь: TVertices. Создав объект этого типа мы можем добавлять в него новые вершины методом Add. Вот что у меня получилось для треугольника:

 Local size:Int = 20 ' размеры треугольника
 Local vertices:TVertices = New TVertices ' создать список вершин треугольника

vertices.Add( Vector2.Create( 0 , size ) ) '  сверху
vertices.Add( Vector2.Create( -size , -size) ) ' слева 
vertices.Add( Vector2.Create( size , -size) ) ' справа

Сделать треугольник было несложно. Фигуру пентагона, можно сделать например так:

vertices.Add( Vector2.Create(0, -75) ) 
vertices.Add( Vector2.Create(75, 0) )
vertices.Add( Vector2.Create(50, 100) )
vertices.Add( Vector2.Create(-50, 100) )
vertices.Add( Vector2.Create(-75, 0) )

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

' это создаем тело

Local TriangleBody:TBody = TBodyFactory.CreatePolygonBody(physics, vertices, 1.0)

'это геометрию

Local TriangleGeometry:TGeom = TGeomFactory.CreatePolygonGeom(physics, TriangleBody, vertices)

' а здесь создаем рисунок
Local TriangleImage:Timage = TDrawingHelper.CreatePolygonTexture( vertices._vecArray, TColor.White )

'центруем картинку

MidHandleImage( TriangleImage )

Хочу заметить, что как я сказал ранее, из набора вершин можно сделать фигуры любой сложности, но обсчет их коллизий с другими объектами может занять немного больше времени, чем обсчет стандартных фигур. Учтите это, если вдруг получите тормоза при большом количестве таких объектов. Врочем, этого не стоит так бояться, но я счел за долг предупредить вас об этом.  

Все компоненты сделаны, осталось толко поместить наш свежеиспеченый треугольник на экране, и развернуть его, к примеру на 75 градусов, просто для разнообразия. 

TriangleBody.SetPosition( Vector2.Create( 600, 100) )

TriangleBody.SetRotation(-75)

Заметьте как "топорно" упал наш объект. Давайте для нашего пола (Floor*) добавим коэффициент трения(Friction).  Это делается так:

FloorGeometry.SetFrictionCoefficient(.5)

Обратите внимание, что коэфициент трения - это метод геометрии. Запустив программу можно увидеть, как треугольник упав проскользит по поверхности пола. Можете поэксперементировать с этим параметром.

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