‘Silverlight’のエントリ

夏休みにSilverlightで遊んでみた。Windows Phone向けウェザタイに向けて,って感じ。

なんだけど,やろうとすることがことごとくSilverlightではサポートされてなくて思った以上に苦労する。WPFなら楽なんだろうけど,Windows Phoneで動くようにするとなるとSilverlightだよね,ってことで。

まずXAMLからのリソース使用。WPFと同じようにresxに文字列を定義してXAMLからStaticResourceで表示しようとしたが,Silverlightではサポートされていない。そのためProperties.Resourcesをラップしたプロパティを作成してBindingで文字列を表示することに。でもそれだとExpression Blendでデザイン時に表示されないのでXAMLでインスタンス化。MSDN Magazineのこの辺を参考にした。

次に困ったのが背景のスクロール。画像のタイル表示はSilverlightではサポートされていないので画像をキャンバスに貼り付けて複数配置。次にThicknessAnimationがSilverlightではサポートされていないのでDoubleAnimationで中継。ここまでやってみたけどかなり重い。

とりえずAndroid版のタイトル画面をほぼそのまま再現してみた。タイトル画面。Silverlightだからもっと凝った画面にできるけどまだいいか。このままでも画面サイズを変更したいという要望はクリアできて,横長にすればある程度長い文字列も打てる,のかな。ちなみにMacでも実行可能だし,moonlightを使えばLinuxでも実行可能。

Silverlightで通信ができないというメールが来た。どうやらSilverlight 2 Beta 1からBeta 2になったときに仕様が変わったとのこと。ローカルPCにSilverlightのコンテンツを置いておいてローカルPC上のサーバにアクセスする際にも,クロスドメインポリシーを考慮しなければならなくなったらしい。どこがクロスだよ,って気もするけど。

早速実験してみる。Silverlight Tools Beta 2を入れる場合,Beta 1のアンインストールが必要なのだが,普通にアンインストールしただけではだめで,更新プログラムの一覧からKB949325を直接消さないといけないというのにはまりつつ,インストール完了。微妙にWatermarkedTextBoxが消えてたりするのに困りつつ実験開始。

確かに以前と同じコードでSocket通信すると,AccessDeniedになってしまう。ということでクロスドメインポリシーサーバをたててみる。FlashのSocket通信のときに同じようなことをやってたのでほぼ流用。ポート943で,「<policy-file-request/>」という文字列を受信したら以下のような文字列を送信するサーバをたてればOK。許可ドメインはちゃんと絞り込まないといけないけど。

<?xml version="1.0" encoding ="utf-8"?>
<access-policy>
 <cross-domain-access>
  <policy>
   <allow-from>
    <domain uri="*" />
   </allow-from>
   <grant-to>
    <socket-resource port="4502" protocol="tcp" />
   </grant-to>
  </policy>
 </cross-domain-access>
</access-policy>

結局,Socket通信は以下のような感じになる。

  1. Silverlightクライアントからサーバの943ポートへ,フレームワークが勝手に「<policy-file-request/>」を送信する
  2. サーバの943ポートからSilverlightクライアントへ,クロスドメインポリシーを返信する
  3. Silverlightクライアントからサーバの4502-4532ポートへ通信

ロビーサーバ復旧完了。


Silverlight。TextBoxのスクロールできないのかな,と調べてみた結果,ScrollView ElementにTextBox Elementを入れればいいことが分かった。これにVerticalScrollBarVisibility="Auto",ScrollView.ScrollToVerticalOffsetを組み合わせれば一通りのことができる感じ。

Silverlight版ロビーサーバをローカルではなくWebサーバ上に置いて実験してみた。でもロビーサーバに接続しようとするとAccessDeniedが返ってくる。Webで検索するとSilverlight 2 beta 1 and Socket Exception: Access Deniedというページに原因が書いてあった。どうもサーバのドメイン名の逆引きができないとダメらしい。まあIPアドレス指定すれば使えるから実験としてはいいか。Silverlightの正式版ではこの辺りの制限は緩くなるっぽいし,何か作って公開するまでには正式版が出てる,かなあ。


第1ロビーサーバが停止している間にロビーサーバの気になっていた箇所を修正している。Unicode正式対応とか英語化とかゲームごとにサーバを分離とか。なので第1サーバ自体が復旧してももうしばらく第2サーバをメインにしておくかも。

Silverlightの実験として,ロビークライアントを作ってみる。Silverlight 2.0からは日本語入力とSocket通信がサポートされたので,なんとなくうまくいった。でも使用できるポートが4502-4532に制限されているので,そのままではウェザタイのロビーサーバには接続できない。まあSilverlightでネット対戦ゲームは作れそうってことで。

以下画面キャプチャ。IEの中でロビークライアントが動いている。ホントはぱじさんのFlashクライアントと同時接続して,JavaのサーバにC++/Flash/Silverlightクライアントから同時利用,というわけのわからない画面が欲しかったんだけどとりあえずここまで。

2008040601


Silverlightの開発環境があまりに混沌としているのでメモ。以下を使えばSilverlight 2.0開発,実行が可能(必須ではないが)。