2017-02-20 6 views
12

私はStarling(Action Script 3)でボードゲームをプログラミングしています。私が使用しているStarlingバージョンには、Sprite3Dというクラスがあり、このゲームで使用されているカードのフリッピングを便利に簡単にコーディングできます。私はカードが反転したときにカードの寸法が変わってしまい、変更の原因を見つけることができないということに悩まされています。このカードによるディメンションの変更原因は何ですか? [ビデオとコード]

すべてのご協力をいただきありがとうございます。

this youtube videoで問題を表示できます。

このコードはgithubでthis github pageに完全に見ることができます。

私はここで詳細を続けます...すべての以下の情報は、ビデオでカバーされています。

カードクラスには視覚情報が含まれていません。これはコントローラクラスです。それは2つのスプライトを保持します。 1つのスプライトが前面に塗りつぶされ、もう1つのスプライトが背面に塗りつぶされます。 Cardクラスには、マスクが適用され、面のサイズと形状が同じになるように寸法属性が設定されています。

カードクラスには、アニメーションコードも保持されます。カードをアニメートするコードは、スターリングブログにあるビデオで使用されているコードと非常によく似ています。これは、Stage3Dを2Dメモリのゲームに非常に迅速かつ簡単に実装する方法を示しています。 Cardクラスは、トゥイーンを使用してカードのrotationYプロパティを0からPIに変更し、タッチイベントでPIから0に変更することによって回転をアニメートします。エラーは、反転処理中に発生したので、私はここで反転コードが含まれます:両方のクラスから派生CardFace

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クラスは、カードを参照として使用し、カードのマスクのサイズと形状に等しいマスクを設定します。これは、カードのマスクがすべての子DisplayObjectをマスクする必要があるため、おそらく冗長ですが、とにかくそれを行います。

BackFaceには、テキスト、ロゴ、テクスチャ、および色があります。

FrontFaceは何もしません。特定の動作でサブクラス化され、データオブジェクトを表示レイアウトに変換します。

この場合、FrontFaceをProfileFrontFaceでサブクラス化しています。 ProfileFrontFaceは、カードオブジェクトとプロファイルデータオブジェクトをコンストラクタ引数として取ります。カードオブジェクトは、super()呼び出しによってCardFaceに渡され、プロファイルオブジェクトは後で使用するために保存されます。

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のマスクがマスクとして機能しないケースは誰も見ていますか?

通常のスプライトオブジェクトでマスクの実行に失敗したケースは誰も見ていますか?

Tweenをオブジェクトの "rotationY"の値を変更するために使用すると、Tween.animate()メソッドで奇妙な動作が発生することはありますか?

すべての回答が役立ちます。ありがとうございました!

答えて

5

固定!!!!!見つけた!

問題は正面ではないことがわかりました。 Sprite3Dオブジェクトであるカード自体にマスクを適用しました。そのマスクは問題を引き起こしていました。私がそれを取り除くと、BackFace(スプライトオブジェクト)が前面と同じサイズに拡大されました。そして、カードの寸法を設定すると、両方の面のサイズが同じになります。

元のBackFaceレイアウトと一致するようにカードのサイズを400x250に更新しました。今はすべてうまくいきます。

ヒント:可能であれば、Spriteオブジェクトにマスクを設定し、Sprite3Dオブジェクトにはマスクを設定しないでください。これは2Dオブジェクト上で2D操作を維持します。

関連する問題