2017-02-20 4 views
12

Ich programmiere ein Brettspiel in Starling (Action Script 3). Die Starling-Version, die ich verwende, hat eine Klasse namens Sprite3D, die es mir ermöglicht, das Umdrehen der in diesem Spiel verwendeten Karten bequem und einfach zu programmieren. Mich beunruhigt die Tatsache, dass meine Karte beim Umdrehen die Dimension ändert und ich die Quelle der Änderung nicht finden kann.Was verursacht diese Karte, um Dimensionen zu ändern? [Video & Code]

Alle Hilfe ist willkommen.

Das Problem kann auf this youtube video angesehen werden.

Der Code ist vollständig auf github unter this github page zu sehen.

Ich werde hier mit mehr Details fortfahren ... Alle folgenden Informationen sind in dem Video abgedeckt.

Die Kartenklasse enthält keine visuellen Informationen. Es ist eine Controller-Klasse. Es hält zwei Sprites. Ein Sprite füllt die Vorderseite und das andere Sprite füllt die Rückseite. Die Card-Klasse verfügt auch über eine Maske und Attribute, so dass die Flächen die gleiche Größe und Form haben.

Die Card-Klasse enthält auch den Animationscode. Der Code zur Animation der Karte ist dem Code sehr ähnlich, der in einem Video im Starblog verwendet wird und zeigt, wie Stage3D sehr schnell und einfach in einem 2D-Memory-Spiel implementiert werden kann. Die Card-Klasse animiert die Drehung mithilfe eines Tweens, um die -Eigenschaft der Karte von 0 zu PI und von PI zu 0 bei Berührungsereignissen zu ändern. Der Fehler tritt während des Umklappen Prozess, also werde ich das Umklappen Code hier sind:

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

Die Frontface und Klassen RÜCKSEITE sowohl aus der Klasse CardFace abzuleiten. Die CardFace-Klasse nimmt eine Karte als Referenz und legt eine Maske fest, die der Größe und Form der Kartenmaske entspricht. Dies ist wahrscheinlich redundant, da die Maske der Karte alle untergeordneten DisplayObjects maskieren sollte, aber wir tun es trotzdem.

Das BackFace hat Text, ein Logo, eine Textur und eine Farbe.

Das Frontface tut nichts. Es unterliegt einem spezifischen Verhalten und konvertiert ein Datenobjekt in ein Anzeige-Layout.

In diesem Fall bilden wir FrontFace mit ProfileFrontFace ab. ProfileFrontFace verwendet das Kartenobjekt und ein Profildatenobjekt als Konstruktorargumente. Das Kartenobjekt wird über super() - Aufrufe an CardFace übergeben, und das Profilobjekt wird zur späteren Verwendung gespeichert.

Wenn ProfileFrontFace zur Bühne hinzugefügt wird, extrahiert die Klasse Titel, Einnahmen und Ausgaben aus dem Profildatenobjekt. Es erstellt Textfelder für jedes dieser Elemente. Es berechnet auch einen Cashflow und erstellt ein Textfeld für diesen Wert. Ein Hintergrund wird mit einer PNG-Textur erstellt, bei der es sich um ein einfaches weißes Quadrat handelt, das über die gesamte Fläche der Kartenmaße gestreckt wird. Über diesem weißen Quadrat wenden wir eine Farbtextur an. Nach der Erstellung wird das Hintergrundbild nicht geändert. Der Code sieht wie folgt aus:

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

Im Rest der Funktion erstellen wir den Text und zeigen ihn an. Ich füge diesen Code hier zur Vereinfachung nicht ein. Beim Testen habe ich diesen Code entfernt und festgestellt, dass er keinen Einfluss auf das eigenartige Verhalten hat, das die Abmessungen der Karte ändert, wenn sie auf die Vorderseite gewendet wird.

Hat jemand einen Fall gesehen, in dem Masken auf einem Sprite3D nicht als Maske funktionieren?

Hat jemand Fälle gesehen, in denen eine Maske auf einem regulären Sprite-Objekt nicht funktioniert?

Was ist mit der Tween.animate() -Methode kann seltsames Verhalten verursachen, wenn Tween verwendet wird, um den Wert von "rotationY" für ein Objekt zu ändern?

Alle Antworten werden Ihnen helfen. Vielen Dank!

Antwort

5

FEST !!!!! Ich habe es gefunden!

Ich entdeckte, dass das Problem nicht die Vorderseite war. Ich hatte eine Maske auf die Karte selbst aufgebracht, die das Sprite3D-Objekt war. Diese Maske verursachte Probleme. Wenn ich es entferne, wird das BackFace (ein Sprite-Objekt) auf die gleiche Größe wie die Vorderseite erweitert, und jetzt, wenn ich die Kartenmaße festlege, haben beide Seiten die gleiche Größe.

Ich habe die Kartenmaße auf 400x250 aktualisiert, um dem ursprünglichen BackFace-Layout zu entsprechen, und jetzt funktioniert alles gut.

Tipp: Legen Sie Ihre Masken nach Möglichkeit auf die Sprite-Objekte und nicht auf die Sprite3D-Objekte fest. Dies hält die 2D-Manipulationen an den 2D-Objekten aufrecht.

Verwandte Themen