2010-12-27 23 views
0

私は異なる食品の分類メニューを構築しています。基本的には "サラダ"、 "ドリンク"などの文字列を返す "カテゴリ"(ボタン)用のクラスがあります。カテゴリ内のアイテムには別のクラス "menuItems"があり、これは "small"、 "私の問題は、「サラダ」を返すときに、サラダのすべての要素を含む配列を呼び出すことです。それをメニューアイテムに挿入するmenuItemsに送ります。これまでカテゴリオブジェクトとメニューオブジェクトの両方の設定があります。私はちょうど、カテゴリオブジェクトが返すデータを送信してメニューオブジェクトに渡すことができるようです。両方とも、以下に示すようにステージに追加されます:AS3オブジェクト/クラス間でデータを渡す

私はこれらのクラスをすべて1つのクラスに追加して、お互いに話すことができますこれを行う。

数時間立ち往生しましたが、何か助けていただければ幸いです。

答えて

8

オブジェクト間でデータを渡す一般的な方法の1つは、カスタムイベントを送出することです。これには、クラス間の依存関係を減らすという利点があります。たとえば、構造に「Drinks」クラスを追加したいとしましょう。すべてのクラスが相互に接続されている場合は、アプリケーションを更新するのが難しいかもしれません。一方、イベントでは、新しいCustomEventを作成するか、現在のイベントに飲み物のプロパティを追加するかのどちらかを決めることができます。

実際には、イベントを送受信するイベントディスパッチャが必要です。次に、関連オブジェクトに通知します。

は、各パッケージを取るとの.as拡張子(例:Main.as)とそれをクラスの名前を与え、自分のファイルに保存:

はここで広範な例です。すべてのファイルは同じフォルダに置く必要があります。 Main.asがあなたのエントリーポイントになります。もしあなたがFlash CSを使用しているなら、これはあなたのDocument Classです。

AS3に関するいくつかのチュートリアルをチェックしてみてください。これは、頭痛の負荷を軽減し、基本的な問題を解決しようとして時間を節約するために私がしばしば与えるアドバイスです。 Colin MookのLost Actionscript Weekend Videoチュートリアルを試してみましょう。たとえば、Adobe TVで見つけることができます。

package 
{ 
import flash.display.Sprite; 
    import flash.events.EventDispatcher; 

    public class Main extends Sprite 
    { 
     private var dispatcher:EventDispatcher; 

     private var salads:Categories; 
     private var menu:MenuItems; 

     public function Main() 
     { 
      dispatcher = new EventDispatcher(); 
      menu = new MenuItems(dispatcher); 
      salads = new Categories(dispatcher); 
     } 
    } 
} 


         ****** 
package 
{ 
    import flash.events.Event; 

    public class MenuEvent extends Event 
    { 
    //Your Custom Event 
    public static const CATEGORY:String = "Category"; 

    //Here I type the data property as an Object, but it could also 
    //be a String , depending on the type of info you need to pass 
    public var data:Object; 

    public function MenuEvent(type:String , data:Object):void 
    { 
     super (type); 
     this.data = data; 
    } 

    override public function clone():MenuEvent 
    { 
     return new MenuEvent(type , data); 
    } 

} 
         ****** 
package 
{ 

import flash.events.EventDispatcher; 
import flash.events.MouseEvent; 

    public class Categories 
    { 

     private var dispatcher:EventDispatcher; 

     public function Categories(dispatcher:EventDispatcher):void 
     { 
     this.dispatcher = dispatcher; 

     //for this example, i dispatch the event here 
     //so you don't have to create a button... 
     dispatcher.dispatchEvent(new MenuEvent(MenuEvent.CATEGORY , "salads" )); 
     } 

     private function clickHandler(event:MouseEvent):void 
     { 
     //for instance , in the "salads" category... 
     dispatcher.dispatchEvent(new MenuEvent(MenuEvent.CATEGORY , "salads" )); 
     } 
    } 
    } 

         ****** 
    package 
    { 

import flash.events.EventDispatcher; 

    public class MenuItems 
    {    
     private var dispatcher:EventDispatcher; 

     public function MenuItems(dispatcher:EventDispatcher):void 
     { 
     this.dispatcher = dispatcher; 
     dispatcher.addEventListener(MenuEvent.CATEGORY , menuEventHandler); 
     } 

     private function menuEventHandler(event:MenuEvent):void 
     { 
      trace(event.data as String); 
     } 
     } 
    } 
+0

ディスパッチャーを使用して2つのクラスを持つ簡単な例を教えてください。私はまだ少し初心者であり、本当にこのことについて私の頭を包んでいません。私はすべてのクラスが1つのクラスから拡張され、この1つのクラスを通して、他のすべてのクラスに話すことができるPHPに慣れていました。これまでのところ私はこれを使い続けているので、とてもイライラしています - >>>(MovieClipとしてthis.parent).someFunction()、すべてのデータを親に戻します。それはあまり効率的ではありません。 – 1337holiday

+0

私はやったと思ったが、私は答えを編集して詳細を与えた:)私は本当にそれをテストしていないので、何も足りないことを願っていない。 – PatrickS

+0

これは素晴らしいです!ありがとう、まさに私が必要なもの:) – 1337holiday

関連する問題