Я программирую настольную игру в Starling (Action Script 3). В версии Starling, которую я использую, есть класс под названием Sprite3D, который позволяет мне легко и удобно кодировать перелистывание карт, используемых в этой игре. Меня беспокоит тот факт, что моя карта меняет размер при переворачивании, и я не могу найти источник изменений.
Вся помощь приветствуется.
Проблема может быть просмотрена на этом видео youtube.
Код можно увидеть полностью на github на этой странице github.
Я продолжу здесь более подробно... Вся информация, содержащаяся в этом видео, представлена в видео.
Класс карты не содержит визуальной информации. Это класс контроллера. Он держит два спрайта. Один спрайт заполняет переднюю грань, а другой спрайт заполняет заднюю грань. Класс Card также имеет приложенную маску и атрибуты измерения, так что грани будут иметь одинаковый размер и форму.
Класс карты также содержит код анимации. Код для анимации карты очень похож на код, используемый в видео, найденном в блоге скворца, который показывает, как Stage3D можно использовать, реализованную в 2D-игре памяти очень быстро и легко. Класс Card оживляет вращение с помощью анимации для изменения свойства карты 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, но мы все равно делаем.
У BackFace есть текст, логотип, текстура и цвет.
FrontFace ничего не делает. Он подклассифицирован с конкретным поведением и преобразует объект данных в макет отображения.
В этом случае мы подклассифицируем FrontFace с ProfileFrontFace. ProfileFrontFace берет объект карты и объект данных профиля как аргументы конструктора. Объект карты передается в CardFace через вызовы super(), а объект профиля сохраняется для последующего использования.
Когда элемент 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?
Как насчет метода Tween.animate() может вызвать странное поведение, когда Tween используется для изменения значения "rotationY" на объекте?
Все ответы помогут. Спасибо!