Что заставляет эту карту менять размеры? [Видео & Код]

я программирую настольную игру в Старлинг (сценарий действия 3). Версия Starling, которую я использую, имеет класс Sprite3D, который позволяет мне удобно и легко кодировать переворачивание карт, используемых в этой игре. Меня беспокоит тот факт, что моя карта меняет размер при переворачивании, и я не могу найти источник изменения.

вся помощь приветствуется.

проблема может быть просмотрена на это видео youtube.

код можно увидеть полностью на github в эта страница github.

Я продолжу здесь с более подробной информацией... Вся следующая информация освещается в видео.

класс карты не содержит визуальной информации. Это класс контроллера. Он содержит два спрайта. Один спрайт заполняет переднюю грань,а другой - заднюю. Класс Card также имеет атрибуты маски и измерения, чтобы грани были одинакового размера и форма.

класс карты также содержит код анимации. Код для анимации карты очень похож на код, используемый в видео, найденном в блоге Старлинга, который показывает, как Stage3D можно использовать в 2D-игре памяти очень быстро и легко. Класс карты анимирует вращение с помощью анимации, чтобы изменить rotationY свойство от 0 до PI и от PI до 0 на сенсорных событиях. Ошибка возникает во время процесса листания, поэтому я включу код листания здесь:

public function flip() : void {
    _state = !(this._state);
    if( this.animations ){
        var tween : starling.animation.Tween = new Tween( this, 2, starling.animation.Transitions.EASE_OUT_BOUNCE );
        var card : Card = this;
        var didFlip : Boolean = false;
        tween.animate("rotationY", this._state == Card.FACE_UP ? Math.PI : 0 );
        tween.onUpdate = updateVisibility;
        Starling.juggler.add( tween );
    }
}
private function updateVisibility():void
{
    var sHelper:Vector3D = new Vector3D();
    var card : Card = this;
    stage.getCameraPosition( card, sHelper );
    if( sHelper ){
        this._front_face.visible = sHelper.z < 0;
        this._back_face.visible = sHelper.z >= 0;
    }
}

классы FrontFace и BackFace являются производными от класса CardFace. Класс CardFace принимает карту в качестве ссылки и устанавливает маску, равную размеру и форме маски карты. Это, вероятно, избыточно, так как маска карты должна маскировать все дочерние DisplayObjects, но мы все равно это делаем.

задняя поверхность имеет текст, логотип, текстуру и цвет.

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

в этом случае мы подклассы FrontFace с ProfileFrontFace. ProfileFrontFace принимает объект карты и объект данных профиля в качестве аргументов конструктора. Объект card передается в CardFace через вызовы super (), а объект profile сохраняется для последующего использования.

когда ProfileFrontFace добавляется к этапу, класс извлекает заголовок, доходы и расходы из объекта данных профиля. Он создает текстовые поля для каждого из них предметы. Он также вычисляет денежный поток и создает текстовое поле для этого значения. Фон создается с использованием текстуры PNG, которая представляет собой простой белый квадрат, растянутый по всей поверхности размеров карты. Поверх этого белого квадрата нанесем цветовую текстуру. После его создания, фоновое изображение не меняется. Код выглядит следующим образом:

//we remove the event listener so this function code is only executed once
this.removeEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
var width : int = this.cardWidth; /* 400 */
var height : int = this.cardHeight; /* 300 */
var bg : Image = new Image( Game.assets.getTexture("blank") );
/* start the background in the top left */
bg.x = 0;
bg.y = 0;
/* have the background fill the card dimension space */
bg.width = width;
bg.height = height;
/* apply a color so that the background is not pure white */
bg.color = ColorScheme.OPAL;
/* add the background to the stage */
this.addChild( bg );

В остальной части функции, мы создаем текст и отобразить его. Я не включаю этот код здесь для простота. При тестировании я удалил этот код и увидел, что он не влияет на своеобразное поведение, которое изменяет размеры карты при переворачивании на лицевую сторону.

кто-нибудь видел случай, когда маски на Sprite3D не выполняют роль маски?

кто-нибудь видел случаи, когда маска не работает на обычном объекте Sprite?

как насчет Твина.метод animate () может вызвать странное поведение, когда Tween используется для изменения значения "rotationY" на объект?

любые ответы помогут. Спасибо!

1 ответов


исправлено!!!!! Я нашел его!

Я обнаружил, что проблема не в лицевой стороне. Я применил маску к самой карте, которая была объектом Sprite3D. Эта маска создавала проблемы. Когда я удалил его, задняя поверхность (объект Sprite) расширилась до того же размера, что и передняя грань, и теперь, когда я установил размеры карты, обе грани имеют одинаковый размер.

я обновил размеры карты до 400x250, чтобы соответствовать оригинальному макету задней поверхности, и теперь все хорошо работает.

Совет: по возможности установите маски на объекты Sprite, а не на объекты Sprite3D. Что держит в 2D обработку 2D-объектов.