FlasherのためのSilverlight入門(3) アプリ構造

今回はFlasherがSilverlightのプログラムを作るにあたりどのような順序で作ればいいかを考えてみます。

さて、まず、前にもあげましたExpression Blend。GUIでXAMLを構成してくれるソフトですが、これあまり使わないかもしれません。

もちろん、単純なアプリを作る分には有効だと思うのですが、ゲームなんかを作る場合、画面内に収まるオブジェクトはプログラムの実行状況によって、ガンガン変わるわけです。1個だけの場合もあれば100個ぐらいになるときもあります。XAMLだと最初に、画面上で使うオブジェクトを配置するわけですからそのようなゲームはXAMLだけでは用意することができません。

プログラムの中でSprite的なものを用意して操作するといったプログラムを書く必要があります。が、どういうわけか、巷にあるSilverlightのサンプルプログラムは、

1.まずXAML作る

2.XAMLに配置したオブジェクトにイベントをつけてプログラムを書く

という説明ばっかりがされていて、本格的なゲームプログラムを書くにはどうすりゃいいねん、という状態に陥りました。というわけで、そのあたり調べたことを書いていきます。

チュートリアル : 初めての Silverlight アプリケーションの作成はやってるという前提で書いていくので、見ておいてください。

ついでに一番最後にここまでのプロジェクトをZIPにしてアップしてあります。

App.xaml と App.xaml.cs

Visual Studio 2008で、Silverlightのプロジェクトを新規作成すると、デフォルトで用意されるファイルがいくつかあります。その中に、App.xamlとMainPage.xamlがあり、それぞれ折りたたみを開くと、App.xaml.csとMainPage.xaml.csがあります。

App.xaml.cs内にはApplicationクラスを継承したAppクラスがあります。Silverlightが起動したときに一番最初に実行されるのがどうやらこのクラスです。

このAppクラス内で、Application_Startup関数が呼ばれ、その中で、

 this.RootVisual = new MainPage();

という処理が行われます。

で、MainPageはどこにあるかというと、先ほどのMainPage.xaml.csで定義されています。デフォルトだとほぼ空ですが、チュートリアルなどではこのMainPage.xamlに対してフォーム・コントロールをおいたりといった作業をしてプログラムを作ったと思います。これが動いているのは、App内で、this.RootVisualにnew MainPage()をしているからというわけです。

// public partial class App : Application内です
 private void Application_Startup(object sender, StartupEventArgs e)
 {
            this.RootVisual = new MainPage();
 }

なんで、アプリケーションは、Appクラスの Application_Startup関数を経て、MainPageが呼ばれるということが分かりました。というわけなので、本格的なプログラムを書くのに必要な処理はこのどちらかで書けばよさそうだということも分かりました。

 

StartupEventArgs ~FlashVars的なもの

というわけでなんですが、その前にもう一つ重要なことがあります。先ほどのApplication_Startup関数の引数である、StartupEventArgs e についてです。実はこれが、FlashでのFlashVarsに当たる役割をする大事なものだったりします。HTML経由で渡されるパラメーターなどはこれで取得するわけです。(StartupEventArgsのAPIリファレンスはこちら。

 

private void Application_Startup(object sender, StartupEventArgs e)
{

            foreach (string k in e.InitParams.Keys)
            {
                System.Diagnostics.Debug.WriteLine(k + "," + e.InitParams[k]);
            }

            this.RootVisual = new MainPage();
}

このときHTMLが以下のようになっていると、

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">

<param name="source" value="ClientBin/VariousTest.xap"/>

<param name="onError" value="onSilverlightError" />

<param name="background" value="white" />

<param name="minRuntimeVersion" value="3.0.40818.0" />

<param name="autoUpgrade" value="true" />

<param name="initParams" value="aaa=111,bbb=222,ccc=333" />

</object>

 

Visulal Studioでデバッグしたときに出力パネルに、

aaa=111

bbb=222

ccc=333

と出力されます。

 

デバッグ時にVisual Studioの出力パネルに出すには、System.Diagnostics.Debug.WriteLineを使います。System.Console.WriteLineではないのが要注意。

 

連想配列~Dictionary

では、ついでにe.InitParamsの中身を連想配列に移します。e.InitParamsはIDictionaryインターフェースなんですが、なんかよくわからんけど、変なところで躓いてるゆとりがないので、とりあえず移しておきます。

public Dictionary htmlParams;

private void Application_Startup(object sender, StartupEventArgs e)
        {
            htmlParams = new Dictionary();

            foreach (string k in e.InitParams.Keys)
            {
                htmlParams[k] = e.InitParams[k];
            }
            this.RootVisual = new MainPage();
        }

こんな感じです。これで、this.htmlParams["aaa"]みたいにアクセスできるようになりました。

 

URLのQueryも取得する

ついでに、URLのQueryも取得して、htmlParamsに入れてみることにします。

MSDNのドキュメントでは、HtmlDocument htdocs = new HtmlDocument()なる書き方が出てきたりしますが、どうもこれは古い書き方のようでビルドエラーがでます。以下のようにするようです。

using System.Windows.Browser; //これは省略してますが、namespaceの外に書きます。

public Dictionary htmlParams;

private void Application_Startup(object sender, StartupEventArgs e)
        {
            Dictionary htmlParams = new Dictionary();

            foreach (string k in e.InitParams.Keys)
            {
                htmlParams[k] = e.InitParams[k];
            }

            foreach (string k in HtmlPage.Document.QueryString.Keys)
            {
                htmlParams[k] = HtmlPage.Document.QueryString[k];
            }

            this.RootVisual = new MainPage();
        }

これで、http://localhost:64771/VariousTestTestPage.aspx?fff=21223 のようにアクセスしたときに、fff=21223の値も、this.htmlParams["fff"]で使えるようになりました。

 

ここまでのサンプルをとりあえずZIPにしてアップしておきます。このサンプルではmainAppというnamespaceのMainModel.csというクラスも作成してそこにhtmlParamを渡しています。

VariousTest.zip

 

コメントする
トラックバック(0)

トラックバックURL: http://blog.tokyoace4.com/cgi-bin/mt/mt-tb.cgi/149