2017-02-20 33 views
12

Programuję grę planszową w Starling (Action Script 3). Wersja Starling, której używam, ma klasę o nazwie Sprite3D, która pozwala mi wygodnie i łatwo kodować odbijanie kart używanych w tej grze. Niepokoi mnie fakt, że moja karta zmienia wymiar po odwróceniu i nie mogę znaleźć źródła zmiany.Co sprawia, że ​​ta karta zmienia wymiary? [Video & Code]

Cała pomoc jest doceniana.

Problem można wyświetlić pod numerem this youtube video.

Kod można zobaczyć w całości na github pod numerem this github page.

Będę tu kontynuować z bardziej szczegółowymi informacjami. Wszystkie poniższe informacje są zawarte w filmie.

Klasa Karta nie zawiera informacji wizualnych. Jest to klasa kontrolera. Ma dwa sprity. Jeden sprite wypełnia twarz, a drugi sprite wypełnia twarz. Klasa Card ma również nałożoną maskę i atrybuty wymiarów, aby twarze miały jednakową wielkość i kształt.

Klasa Karta zawiera również kod animacji. Kod służący do animacji karty jest bardzo podobny do kodu użytego w filmie wideo znalezionym na starling blogu, który pokazuje, w jaki sposób można w prosty i łatwy sposób używać Stage3D w 2D w pamięci. Klasa Card animuje rotację za pomocą animacji, aby zmienić właściwość karty z rotationY z 0 na PI i z PI na 0 w przypadku zdarzeń dotyku. Błąd występuje podczas odbijania, więc będzie zawierać kod odwracania tutaj:

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; 
    } 
} 

The FrontFace i klas tylna obie pochodzą z CardFace klasy. Klasa CardFace przyjmuje kartę jako odniesienie i ustawia maskę równą rozmiarowi i kształtowi maski karty. Prawdopodobnie jest to zbyteczne, ponieważ maska ​​karty powinna maskować wszystkie elementy podrzędne DisplayObjects, ale i tak to robimy.

BackFace zawiera tekst, logo, teksturę i kolor.

FrontFace nic nie robi. Subklasuje się z określonymi zachowaniami i przekształci obiekt danych w układ wyświetlania.

W tym przypadku tworzymy podklasy FrontFace z profilem ProfileFrontFace. ProfileFrontFace przyjmuje obiekt karty i obiekt danych profilu jako argumenty konstruktora. Obiekt karty jest przekazywany do CardFace poprzez wywołania super(), a obiekt profilu jest zapisywany do późniejszego wykorzystania.

Po dodaniu profilu ProfileFrontFace do etapu, klasa wyodrębnia tytuł, dochód i wydatki z obiektu danych profilu. Tworzy pola tekstowe dla każdego z tych elementów. Oblicza również przepływ środków pieniężnych i tworzy pole tekstowe dla tej wartości. Tło jest tworzone przy użyciu tekstury PNG, która jest prostym białym kwadratem, rozciągniętym na całej powierzchni wymiarów karty. Nad tym białym kwadratem stosujemy kolorową fakturę. Po utworzeniu obraz tła nie zostaje zmieniony. Kod wygląda następująco:

//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); 

W pozostałych funkcji, tworzymy tekst i wyświetlić go. Nie włączam tutaj tego kodu dla uproszczenia. Podczas testowania usunąłem ten kod i zauważyłem, że nie ma on wpływu na dziwne zachowanie, które zmienia wymiary karty po odwróceniu jej na przednią stronę.

Czy ktoś widział przypadek, w którym maski na Sprite3D nie działają jako maska?

Czy ktoś widział przypadki, w których maska ​​nie działa na zwykłym obiekcie Sprite?

Co w przypadku metody Tween.animate() może powodować dziwne zachowanie, gdy do zmiany wartości "rotationY" na obiekcie używany jest Tween?

Wszystkie odpowiedzi pomogą. Dziękuję Ci!

Odpowiedz

5

STAŁA !!!!! Znalazłem to!

Odkryłem, że problemem nie była twarz przednia. Zastosowałem maskę do samej karty, którą był obiekt Sprite3D. Ta maska ​​powodowała problemy. Kiedy ją usunąłem, BackFace (obiekt Sprite) rozszerza się do tego samego rozmiaru co przednia strona, a teraz, gdy ustawiam wymiary karty, obie twarze mają taką samą wielkość.

Zaktualizowałem wymiary karty do 400 x 250, aby dopasować ją do oryginalnego układu BackFace, a teraz wszystko działa dobrze.

Wskazówka: Ustaw swoje maski na obiektach Sprite, a nie na obiektach Sprite3D, jeśli to możliwe. Pozwala to na manipulacje 2D na obiektach 2D.