Pull to refresh

Farseer Physics Engine и разработка игр для Windows Phone 7. Часть 1

Что нам понадобится?


imageFarseer Physics Engine — бесплатный физический движок для платформы .net.
Скачать Farseer Physics Engine.

Visual Studio Express Edition и Windows Phone Developer Tools — можно скачть бесплатно с сайта Microsoft.
Подробнее о Windows Phone Developer Tools можно прочитать в цикле статей: “Создание приложения для Windows Phone 7 от начала до конца”.
Скачать Visual Studio Express Edition и Windows Phone Developer Tools.

Приступим


С чего начинается знакомство с любой системой? Конечно с написания простенького Hello World.
1) Для начала создадим новый проект “Windows Phone Game” и назовём его HelloPhysicWorld.
2) Добавим проект “Farseer Physics XNA WP7”.
image
image
3) И не забудьте добавить Reference.
image
Теперь можно перейти непосредственно к написанию нашей первой игры.

Создадим мир


Все взаимодействия в Farseer Physics Engine происходят в так называемом мире (класс World).
Добавляем в класс Game1:
using FarseerPhysics.Dynamics;

Cоздаём поле world:
private World world;


И добавим в конструктор его инициализацию:
world = new World(new Vector2(0, 20));


Теперь нам необходимо создать объекты, которые будут взаимодействовать в пространстве. В FPE эти объекты называются телами и все они наследуются от класса Body. Для создания тел используется фабрика BodyFactory.
Тела не знают как они будут отображаться на экране, об этом должен позаботиться разработчик. В нашем случае мы используем текстуры из XNA: Texture2D.

Для использования BodyFactory, необходимо подключить FarseerPhysics.Factories:
using FarseerPhysics.Factories;


Добавим поля:
private Texture2D ballSprite;
private Body ballBody;
private Body borderBody;
private const float MeterInPixels = 64f; // 1 метр соответствует 64 пикселям


Добавим текстуру мяча размером 55х55 пикселей.
image

Следующий код создаст тела и загрузит текстуру, добавьте его в метод LoadContent:
ballSprite = Content.Load("ball");

Vector2 ballPosition = (new Vector2(100, 100) / MeterInPixels);

ballBody = BodyFactory.CreateCircle(world, 55f / (2f * MeterInPixels), 1f, ballPosition);
ballBody.BodyType = BodyType.Dynamic;

ballBody.Restitution = 0.8f;
ballBody.Friction = 0.5f;

float width = (800 / MeterInPixels);
float height = (480 / MeterInPixels);

Vertices borders = new Vertices(4);
borders.Add(new Vector2(0, height));
borders.Add(new Vector2(width, height));
borders.Add(new Vector2(width, 0));
borders.Add(new Vector2(0, 0));

borderBody = BodyFactory.CreateLoopShape(world, borders);
borderBody.CollisionCategories = Category.All;
borderBody.CollidesWith = Category.All;


Отображаем мир


Добавьте в метод Update перед вызовом base.Update(gameTime):
world.Step((float)gameTime.ElapsedGameTime.TotalMilliseconds * 0.001f);


Добавьте в метод Draw, перед вызовом base.Draw(gameTime):
Vector2 ballPosition = ballBody.Position * MeterInPixels;
float ballRotation = ballBody.Rotation;
Vector2 ballOrigin = new Vector2(ballSprite.Width / 2f, ballSprite.Height / 2f);

spriteBatch.Begin();
spriteBatch.Draw(ballSprite, ballPosition, null, Color.White, ballRotation, ballOrigin, 1f, SpriteEffects.None, 0f);
spriteBatch.End();

Вот и всё, Hello World готов.
image

Заключение


Вы можете скачать исходники проекта: ссылка.
Спасибо за внимание.
П.С. если статья понравится, то будет продолжение. Не зря в заголовке стоит “Часть 1”.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.