2011-01-12 1 views
1

グッドモーニングオンステージをオブジェクトに、タイムラインコード指向のコード、アクセスインスタンスすでに

私の質問は、私はOOPの本を読んで、最後の2週間を費やしているに聞こえるかもしれないほど愚かな。いくつかのガイダンスを使用することができます。

私は基本的にアップスライドショーであるフラッシュプロジェクトを持っています。ステージ上で私は、次のしている:描画するときに「絵」

UI1(インスタンス名= ui1_mc)=ユーザーが画像上に描画することを可能にするユーザインタフェースを(保持

main_mc(インスタンス名= images_mc)=ムービークリップを

ui2(インスタンス名= ui2_mc)=選択した写真では目に見えないヒット領域(ボタン)を有効にします。ヒット領域をクリックすると、main_mcの別のピクチャにジャンプします。

タイムラインでこれをすべて達成しましたが、コードをOOPに更新しています。

私はインスタンス(images_mcなど)への参照を保存する方法を理解しようとしています。様々なクラスファイルからそれらを制御できます。ドキュメントクラスからインスタンスを制御するのは簡単だが、無関係なクラスファイルからインスタンスを制御するのは簡単であることがわかった。

例:images_mc.stop();ドキュメントクラスで動作します。 movieclip(Parent).images_mc.stop()はどのクラスファイル(例えばui2クラスファイル)でも動作しないようです。

Referencesと呼ばれるクラスを作成し、それ以外の無関係なクラスファイルに変数を渡す必要がありますか(例を参照してください)?基本的にこの状況ではベストプラクティスは何ですか?すべてが完全にそのまま配置されているため、コードを使用してインスタンスをステージに追加することは望ましくありません。正直なところ私はこのプロジェクト中にプログラム的にステージに何かを加える必要はないと考えているので、すでに存在するインスタンスへの参照は非常に重要です。私はこの作業を「正しい方法」で達成したいと思います。どんな助けでも大いに感謝します。

+0

クラスファイルの構造を識別できるように、コードを記入してください。 –

+0

これは、クラス構造を持っているわけではありません。インスタンスをアクセスする方法を見つけたら、そこから行くことができます。今のように、私はドキュメントクラスを持っており、クラスファイルはライブラリの各ムービークリップに結び付けられています(main_mcにはクラスファイルがあり、ui1には1、ui2には1があります)。各ファイルは、タイムラインの周りを移動するためにmain_mc(images_mcインスタンス)への参照を必要とします。基本的にUIクラスはimages_mcインスタンスを見つけることができる必要がありますので、私はムービークリップのフレームを選択するようにジャンプできます。 – Steve

+0

私が知る必要があるのは、すでに外部のクラスファイルからステージ上のインスタンスを参照する方法です。助けてください、解決策はおそらく非常に簡単なので私は私の心を失っています。 – Steve

答えて

0

あなたの質問は基本的にOOPと構造プログラミングの違いを示しています。 OOPを学ぶことは良い決定です、あなたはそれを好きになり、あなたの人生を楽にします。

私はあなたの理論とあまり気にしないようにしようとします - 私はあなたが後で学びます確信している - しかし、あなたはあなたのプロジェクトを完了するのに役立ちます。すべての

まず、私はそれがに良い習慣だと言うだろう包括的なUIアセットごとに別々のクラスを用意してください。これは、すべての画像やボタンではなく、スライドショー、ログインフォーム、コントロール、サウンド/音量ボタンなど、同じ目的を果たすオブジェクトのグループのためではありません。このようなクラスには、インタラクション。それはModel-View-Controllerと呼ばれる原理の一部です。あなたは後でそれを知ることができますが、ポイントはimages_mcと関連するオブジェクトのための別のクラスを持つ必要があります。ドキュメントクラスに作成し、ドキュメントステージへの参照を与えます。

slideShow = new SlideShow(this); 

package { 
    import flash.display.MovieClip; 
    public class SlideShow {   
     private var images : MovieClip;  
     public function SlideShow(stageRef : MovieClip) { 
      images = stageRef['images_mc'] as MovieClip; 
     } 
    } 
} 

注:私は原稿台呼び出すことは舞台ではない、それは最初のムービークリップです。

OOPで従うべき第2の原則は、encapsulationです。あなたのSlideShowにimages_mcがあることを誰も知ってはいけません。あなたはそれを再生したり停止したりすることができます。代わりに他のオブジェクトは、詳細を知らずにスライドショー全体を再生または停止できることを知っておく必要があります。

public function stopShow() : void { 
    images.stop(); 
} 

とドキュメントクラスのショーを停止したい場合は、単に

slideShow.stopShow(); 

注意を呼び出します:遊びのようなメソッドに名前を付けないように注意してくださいので、あなたは、スライドショーのクラスで、このような公共の機能を持っている必要がありますあなたのクラスがMovieClipを継承している場合は、そのクラスをオーバーライドする必要はありませんが、それは別のストーリーです)。

MVCは、そのうちの一つである:それは/アクセスしているすべてのこれらのクラスを制御することになると

は今、いくつかのアプローチがあります(ドキュメントクラス可能)コントローラ内の参照のほとんどを維持してみましょうそれは何をすべきかを決める。あなたのViewクラス(SlideShowのような)がステージ参照上のイベントをディスパッチさせるようにしてください(ドキュメントステージは実際にはMovieClipであり、それはEventDispatcherも意味します)、コントローラはそれらをlistenし、stopShow()のようなメソッドを呼び出します。

イベントに慣れていない場合、このコントローラー全体の概念が混乱する場合は、すべてのクラスへのすべての参照を1つの特別なクラスに置き、作成したすべてのクラスのコンストラクターに渡します。それは混乱ですが、スライドショーのような小さなプロジェクトでは大丈夫です。

EDIT

イベント処理:

それはあなたのスライド・ショーのために複雑すぎるかもしれないが、これは大きなプロジェクトでそれを行う方法です。あなたはあなたのUI2クラスでフォームフィールドとボタンがあり、提出のフォームフィールドからテキストを含むカスタムイベントを送出するとしましょう:

private var formField : TextField; 
private var submitBut : SimpleButton; 

とコンストラクタで:

formField = stageRef['form_txt'] as TextField; 
submitBut = stageRef['submit_but'] as SimpleButton; 
submitBut.addEventListener(MouseEvent.CLICK, buttonHandler); 

あなたは

private funstion buttonHandler(e : MouseEvent) : Void { 
    var customEvent : CustomEvent = new CustomEvent(CustomEvent.FORM_SUBMIT); 
    customEvent.text = formField.text; 
    this.dispatchEvent(customEvent); //check the note 
} 

注:フォームフィールドからテキストを運ぶカスタムイベントを送出しますハンドラのプロパティを必要とする今、あなたはそれを派遣していますこのクラスからEventDispatcherを継承してください。最終的には、stageRefからハンドラをディスパッチすることができます(コンストラクタにハンドラで使用するために格納します)。

は、コントローラ/ドキュメントクラスに耳を傾ける:

ui2.addEventListener(CustomEvent.FORM_SUBMIT, doSomething); 

カスタムイベントは、この(簡単にするために、それはsettter /ゲッターなしです)のようになります。

package { 
    import flash.events.Event; 
    public class CustomEvent extends Event {   
     public static const FORM_SUBMIT: String = "form_submit";   
     public var text : String;  
     public function CustomEvent (type : String) {  
      super(type); 
     } 
    } 
} 

これがちょうどです始まり、学習を続ける、幸運。

+0

それは私の頭脳を手続き的にしたいときにオブジェクト指向と思うようにすることが私の主な問題です。私はカプセル化/多型/継承に精通していますが、最初のoopプロジェクトを実装しようとするといくぶん圧倒されることがあります。今後もあなたの投稿を覚えておいてください。ありがとう。 – Steve

+0

私はあなたの答えを完全に理解していないと思います。私はこれを初めて知っています。この行をどこに置くべきか明確にしてください:slideShow = new SlideShow(this); – Steve

+0

OH、私はそれを手に入れよう!笑。私は、スライドショークラスの情報をドキュメントクラス(コントロールするスライドショーvarを作成する:public var slideShow:SlideShow;)に渡して、スライドショークラスのメソッドを実行します。今すぐ1最後の質問:images_mcのヒットエリア(ボタン)を有効にするボタンが含まれているui2クラスを持っている場合は、スライドショークラスで「アクティベーションメソッド」を作成し、それらのメソッドを直接実行するか、 – Steve

0

この問題には多くの方法があります。 1つの方法は静的変数を使用することです。それはプライベートVARSとゲッターを使用するための例は少し複雑であること

Static Stage Reference

:この例を見てみましょう。この手段を

MyDocClass.display = this; 

public static var display:MovieClip; 

を...そしてドキュメントクラスのコンストラクタで:あなたはちょうどあなたのドキュメントクラスでこれを行うことができ、それはとても安全でプレーしたくない場合

MyDocClass.display.myClip 

私は通常、ドキュメントクラスMainを呼び出します。したがって、あなたは次のようになります:

Main.display.myClip 

静的変数は、それらが何であるかわからない場合に興味があります。通常の変数は、クラスのインスタンス内に存在する - 私たちは財産の時間を持つ2つのクラス、それぞれを持っているとしましょう:

var day1:Day = new Day(); 
day1.time = "morning"; 

var day2:Day = new Day(); 
day2.time = "night"; 

時間varが「朝」で、2日目に時間varが「夜」で1日目に十分なシンプル。これらの変数は、インスタンス固有の変数です。これは静的変数には当てはまりません。静的変数はクラス自体に存在します。このように:

// inside the class 
public static var YEAR:String = "1980"; 

// outside the class 
Day.YEAR; 

静的変数は強力ですが、危険でもあります。それらはグローバルであり、グローバルを使用するとコード管理が難しくなります。

+0

ありがとうございます。私のプロジェクトのあらゆる側面はimages_mcインスタンスを制御する必要があるので、私は静的変数を使用します。私はこれが不適切に使用された場合、どのように危険になるかを見ることができますが、私の状況では完璧です。 – Steve

+0

男私はスマートに聞こえないが、これは非常に悪い練習です:) –

+0

どのように悪い練習ですか?このクリップ(images_mc)にアクセスするには、クラスプロパティである必要はありませんか?したがって、もし私が上記のプロパティを保護するならば、setterなしでgetterを使って(プロパティを読み込み専用にする)なぜこれはまだ悪いのでしょうか?代わりの解決法がありますか?たぶん私は元の質問ではっきりしませんでしたが、私のプログラム全体はimages_mcインスタンス(タイムラインの周りの開始/停止/描画/移動)を中心に構築されています。 – Steve

関連する問題