В этой заметке я хочу рассказать о существовании такого расширения для AndEngine как physics2box.
AndEngine — это бесплатный движок для игр под Andtoid, один из наиболее популярных. Для него существует ряд расширений, одно из них — physicsbox2d. Эта библиотека позволяет создавать физику в игровом мире.
Про AndEngine на Хабре уже отлично написал stepango . Я с удовольствием воспользовался его трудами, и, заодно, прикрутил physicsbox2d. Это оказалось довольно просто.
Я не берусь рассказать обо всех, или даже о какой-то части возможностей этих двух инструментов, а только подскажу интересующимся, с чего начать. А начать вот с чего:
Создаем стандартный проект под Android, и добавляем в него библиотеки andengine.jar, andenginephysicsbox2dextension.jar. Также, понадобится папка armeabi с файлами libandenginephysicsbox2dextension.so и armeabilibxmp.so. В Nebeans достаточно положить все это в папку libs в проекте. Как добыть все это — описывать не буду, что помешает праздно любопытствующим, но не остановит действительно заинтересовавшихся. Теперь можно приступать.
1. Унаследуем нашу Activity от AndEngine-вской BaseGameActivity.
2. Реализуем нужные нам методы onLoadEngine и onLoadScene
Вот код:
Запускаем — и видим дружелюбный вакуум. В нашем мире пока ничего нет.
2. Загрузим текстуры. Немного совершенствуя пример stepango , используем статические переменные. Ходят слухи, что так лучше. Для этого создадим отдельный класс:
Нужно инициализировать сей объект в activity в соответствующем методе:
То, что не очень правильно работаем со статическими объектами — не в этом суть примера. По хорошему, тут бы какой-нибудь singleton подошел.
3. Теперь у нас есть текстуры. Самое время в методе onLoadScene создать объекты — боковые стенки, пол, и мячик.
Метод преображается следующим образом:
Вот и все. При запуске у нас появится фон, и мячик вверху слева. Он тут же начнет падать, долетит до конца экрана, отскочит… и дальше все как в жизни, без вского вмешательства прогаммиста.
После некоторого время знакомства, могу сказать: physics2box штука мощная и интересная. Есть проблемы с документацией и примерами, но тем любопытней процесс создания приложения.
Вот ссылка на статью stepango , которая мне помогла в моих изысканиях:
habrahabr.ru/blogs/android_development/120716
AndEngine — это бесплатный движок для игр под Andtoid, один из наиболее популярных. Для него существует ряд расширений, одно из них — physicsbox2d. Эта библиотека позволяет создавать физику в игровом мире.
Про AndEngine на Хабре уже отлично написал stepango . Я с удовольствием воспользовался его трудами, и, заодно, прикрутил physicsbox2d. Это оказалось довольно просто.
Я не берусь рассказать обо всех, или даже о какой-то части возможностей этих двух инструментов, а только подскажу интересующимся, с чего начать. А начать вот с чего:
Создаем стандартный проект под Android, и добавляем в него библиотеки andengine.jar, andenginephysicsbox2dextension.jar. Также, понадобится папка armeabi с файлами libandenginephysicsbox2dextension.so и armeabilibxmp.so. В Nebeans достаточно положить все это в папку libs в проекте. Как добыть все это — описывать не буду, что помешает праздно любопытствующим, но не остановит действительно заинтересовавшихся. Теперь можно приступать.
1. Унаследуем нашу Activity от AndEngine-вской BaseGameActivity.
2. Реализуем нужные нам методы onLoadEngine и onLoadScene
Вот код:
public class MainActivity extends BaseGameActivity
{
// Ширина экрана камеры типа пикселях
private static final int CAMERA_WIDTH = 800;
// Высота экрана камерыв пикселях
private static final int CAMERA_HEIGHT = 480;
// Параметры физической среды в нашем мире
private static final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);
// Камера, через которую мы смотрим на мир
private Camera mCamera;
// Сцена, на которую мы смотрим через камеру
private Scene mScene;
// Физический Мир, в котором все происходит.
private PhysicsWorld mPhysicsWorld;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
// загрузка движка
public Engine onLoadEngine() {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
// Тут происходят загадочные манипуляции с разрешением, чтоб
// не думать о нем в дальнейшем. RatioResolutionPolicy об этом вроде
// заботится. Однако детали я еще не выяснял, не судите строго
return new Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT,
new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),
this.mCamera));
}
public void onLoadResources() {
}
public Scene onLoadScene() {
// Создаем новую сцену. Можно создать многослойную сцену, но это не для нас, новичков.
mScene = new Scene(1);
// Создаем физический мир с земной гравитацией, действущей вниз.
this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false);
// Физический мир будет рулить сценой
mScene.registerUpdateHandler(mPhysicsWorld);
return mScene;
}
public void onLoadComplete() {
}
}
Запускаем — и видим дружелюбный вакуум. В нашем мире пока ничего нет.
2. Загрузим текстуры. Немного совершенствуя пример stepango , используем статические переменные. Ходят слухи, что так лучше. Для этого создадим отдельный класс:
public class Textures {
private Texture mTexture;
private static TextureRegion mBallTextureRegion;
private static TextureRegion mBackgroundTextureRegion;
public Textures(final BaseGameActivity activity, final Engine engine) {
// Здесь как бы атлас текстур - на этой "площадке" будут располагаться
// все текстуры.
mTexture = new Texture(1024, 1024,
TextureOptions.BILINEAR_PREMULTIPLYALPHA);
// Размер изображения - 512х1024.
mBackgroundTextureRegion = TextureRegionFactory.createFromAsset(
mTexture, activity, "gfx/bkg.png", 0, 0);
// обратите внимание - кладем некстуру на атлас с координат
// 512,0 - иначе мячик наложится на фон.
mBallTextureRegion = TextureRegionFactory.createFromAsset(
mTexture, activity, "gfx/ball.png", 512, 0);
engine.getTextureManager().loadTexture(mTexture);
}
public static TextureRegion getBackground() {
return mBackgroundTextureRegion;
}
public static TextureRegion getBallTextureRegion() {
return mBallTextureRegion;
}
}
Нужно инициализировать сей объект в activity в соответствующем методе:
public void onLoadResources() {
// Загружаем текстуры
mTextures = new Textures(this, getEngine());
}
То, что не очень правильно работаем со статическими объектами — не в этом суть примера. По хорошему, тут бы какой-нибудь singleton подошел.
3. Теперь у нас есть текстуры. Самое время в методе onLoadScene создать объекты — боковые стенки, пол, и мячик.
Метод преображается следующим образом:
public Scene onLoadScene() {
// Создаем новую сцену. Можно создать многослойную сцену, но это не для нас, новичков.
mScene = new Scene(1);
// Создаем физический мир с земной гравитацией, действущей вниз.
this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false);
// Физический мир будет рулить сценой
mScene.setBackground(new SpriteBackground(new Sprite(0, 0, Textures.getBackground())));
// Создаем линии - будут границами
Line line_top = new Line(0, 0, CAMERA_WIDTH, 0, 5.0f * metrics.density);
Line line_left = new Line(0, 0, 0, CAMERA_HEIGHT, 5.0f * metrics.density);
Line line_right = new Line(CAMERA_WIDTH, 0, CAMERA_WIDTH, CAMERA_HEIGHT, 5.0f * metrics.density);
Line line_bottom = new Line(0, CAMERA_HEIGHT, CAMERA_WIDTH, CAMERA_HEIGHT, 5.0f * metrics.density);
// Создаем тела на основе линий
Body wall_top = PhysicsFactory.createLineBody(mPhysicsWorld, line_top, FIXTURE_DEF);
Body wall_left = PhysicsFactory.createLineBody(mPhysicsWorld, line_left, FIXTURE_DEF);
Body wall_right = PhysicsFactory.createLineBody(mPhysicsWorld, line_right, FIXTURE_DEF);
Body wall_bottom = PhysicsFactory.createLineBody(mPhysicsWorld, line_bottom, FIXTURE_DEF);
// Создаем спрайт мячика
Sprite mSprite = new Sprite(0.0f, 0.0f, 100, 100, Textures.getBallTextureRegion());
// Устанавливаем его в нужное место
mSprite.setPosition(100, 100);
// Создаем физическое тело мячика
Body mBody = PhysicsFactory.createCircleBody(mPhysicsWorld, 100, 100, 50, 0, BodyType.DynamicBody, FIXTURE_DEF);
// Связываем спрайты с их физическими телами
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(line_top, wall_top, true, true));
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(line_left, wall_left, true, true));
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(line_right, wall_right, true, true));
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(line_bottom, wall_bottom, true, true));
mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(mSprite, mBody, true, true));
// Загружаем в сцену спрайты
this.mScene.attachChild(mSprite);
this.mScene.attachChild(line_top);
this.mScene.attachChild(line_left);
this.mScene.attachChild(line_right);
this.mScene.attachChild(line_bottom);
mScene.registerUpdateHandler(mPhysicsWorld);
return mScene;
}
Вот и все. При запуске у нас появится фон, и мячик вверху слева. Он тут же начнет падать, долетит до конца экрана, отскочит… и дальше все как в жизни, без вского вмешательства прогаммиста.
После некоторого время знакомства, могу сказать: physics2box штука мощная и интересная. Есть проблемы с документацией и примерами, но тем любопытней процесс создания приложения.
Вот ссылка на статью stepango , которая мне помогла в моих изысканиях:
habrahabr.ru/blogs/android_development/120716