вторник, 25 июня 2013 г.

Контуры или форма спрайта для andengine

Shape - контур, рассмотрим один из вариантов формирования формы спрайтов для движка andengine. AndreasLoew сделал прекрасный вспомогательный класс  PhysicsEditorShapeLibrary (ссылка на гитхаб проекта) необходимый класс для загрузки формы спрайтов. Сам спрайт надо обработать предварительно, сделав прозрачным фон, где его не должно быть.

Исходное изображение, пусть будет фон:
После удаления фона:

Для создания формы (контура) можно воспользоваться или блокнотом (по-сути на выходе xml-файл) или спец. приложениями.
Типовой xml содержащий контур имеет следующую структуру(сгенерирован автоматически, приведён не полностью):
<?xml version="1.0" encoding="UTF-8"?>
<!-- created with http://www.physicseditor.de -->
<bodydef version="1.0">
    <bodies numBodies="1">

        <body name="level1" dynamic="false" numFixtures="3">

            <fixture
                density="2"
                friction="0"
                restitution="0"
                filter_categoryBits="1"
                filter_groupIndex="0"
                filter_maskBits="65535"
                isSensor="false"
                type="POLYGON"
                numPolygons="46"
                >


                <polygon numVertexes="3">

                    <vertex x="240.0000" y="18.0000" />

                    <vertex x="238.0000" y="20.0000" />

                    <vertex x="238.0000" y="18.0000" />

                </polygon>

*** *** *** *** *** *** *** *** *** *** *** *** ***

                <polygon numVertexes="3">

                    <vertex x="401.0000" y="-240.0000" />

                    <vertex x="292.0000" y="-37.0000" />

                    <vertex x="292.0000" y="-39.0000" />

                </polygon>


            </fixture>

            <fixture
                density="2"
                friction="0"
                restitution="0"
                filter_categoryBits="1"
                filter_groupIndex="0"
                filter_maskBits="65535"
                isSensor="false"
                type="POLYGON"
                numPolygons="2"
                >


                <polygon numVertexes="6">

                    <vertex x="-103.0000" y="51.0000" />

                    <vertex x="-80.0000" y="52.0000" />

                    <vertex x="-74.0000" y="57.0000" />

                    <vertex x="-72.0000" y="61.0000" />

                    <vertex x="-110.0000" y="55.0000" />

                    <vertex x="-108.0000" y="52.0000" />

                </polygon>

                <polygon numVertexes="6">

                    <vertex x="-116.0000" y="62.0000" />

                    <vertex x="-112.0000" y="55.0000" />

                    <vertex x="-110.0000" y="55.0000" />

                    <vertex x="-72.0000" y="61.0000" />

                    <vertex x="-72.0000" y="240.0000" />

                    <vertex x="-116.0000" y="240.0000" />

                </polygon>


            </fixture>

        </body>

    </bodies>
    <metadata>
        <format>1</format>
        <ptm_ratio></ptm_ratio>
    </metadata>
</bodydef>
Заполнять в ручную координаты - извращение, поэтому этот процесс автоматизирован спец. софтом.
1. PhysicsEditor, условно-бесплатная
http://www.codeandweb.com/physicseditor
Логика элементарная, добавляем спрайт кнопкой Add Image, дальше означиваем контур с помощью "волшебной палочки" или в ручную.
Выбранный фон был повернут на 90 градусов, так как в andengine так настроена камера была, цвет "стенок" изменен. Фон неподвижный объект, поэтому галочка IsDynamic снята. В качестве экспортера выбран andengine. Инструмент "волшебная палочка" имеет несколько настроек, от них зависит "угловатость" многоугольника.

2. Physics Body Editor, бесплатная.
Для ее работы необходима установленная java. Функционал аналогичный-минималистичный.
https://code.google.com/p/box2d-editor/

Контуры сохраняются в папку \assets\shapes

В проект необходимо включить класс PhysicsEditorShapeLibrary, а на методе загрузки ресурсов проинициализировать её:
this.physicsEditorShapeLibrary = new PhysicsEditorShapeLibrary();
this.physicsEditorShapeLibrary.open(this, "shapes/1.xml");
Файл 1.xml может (и должно) содержать не одно описание контура, как в примере, а множество. Осталось создать "тело" спрайта с нашим контуром, например так:
private void addBackGround() {
        String shape = "level1";
        Sprite sprite = new Sprite(0, 0, mBackGroundTextureRegion, this.getVertexBufferObjectManager());
        sprite.setPosition(0, 0);
        sprite.setColor(Color.CYAN);
        mBody = this.physicsEditorShapeLibrary.createBody(shape, sprite, this.mPhysicsWorld);
  this.mScene.attachChild(sprite);
  this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(sprite, mBody, true, true));
 }

Комментариев нет:

Отправить комментарий