2017-02-20 2 views
12

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

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

Проблема может быть просмотрена на this youtube video.

Код можно увидеть полностью на github по номеру this github page.

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

Класс карты не содержит визуальной информации. Это класс контроллера. Он держит два спрайта. Один спрайт заполняет переднюю грань, а другой спрайт заполняет заднюю грань. Класс 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 и классы отсева и выводит из класса 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» на объекте?

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

ответ

5

ФИКСИРОВАННЫЙ !!!!! Я нашел это!

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

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

Совет. По возможности установите маски на объекты Sprite, а не объекты Sprite3D. Это сохраняет 2D-манипуляции на 2D-объектах.

Смежные вопросы