U⁄A LABO

RSS

SEARCH

AUTHOR

  • KNOCKKNOCK (10件)小遣い2万円のフラッシュデベロッパー。
    帰りが遅いのにキレる嫁をだましだまし制作中・・・。

  • TAKAIW (13件)フラッシュデベロッパー。遊びでゲームを作るのも好きです。外見に似合わないイラストを描くのも好きです。とにかく作るのが好きです。

  • CHIKATHREESIX (8件)メタル界のフラッシュデベロッパー。またある時はメタルギタリスト。オーサリング中もヘッドバンギングは絶やさない。

  • YANBOU (6件)犬と猫で、家が毎日運動会のフラッシュデベロッパー。
    ビールから発泡酒へ変更で節約中。

  • AKUZE (2件)2003年からユナイティアに寄生しているフラッシュデベロッパー。
    シルクドソレイユとカナダが好き。

  • DECO-DEKAI (1件)ビートダウンパートでご飯何杯も食べられます。
    ハードコア・テクニカルディレクターを目指して日々精進。

CATEGORY

HOME  >  Flash DeveloperのためのSilverlight+C# (1)

2009.06.15 TAKAIW

Flash DeveloperのためのSilverlight+C# (1)

MovieClip(表示オブジェクト)の対応

SilverlightをやるためにC#と奮闘中です。
Silverlightをやってみたいが、C#のAPIを
調べるのがメンドクサイという方のために
これからメモ代わりに掲載してゆきたいと思います。
まだまだ始めたばかりで間違いもあるかもしれませんが
よろしくおねがいします。

Silverlight向け .NET Frameworkライブラリ
http://msdn.microsoft.com/ja-jp/library/cc838194(VS.95).aspx

ActionScriptでもっとも重要なクラスとは
と聞かれると、ほとんどの人がMovieClipクラスと
答えると思います。(AS3では「表示オブジェクト」
と答える人もいると思いますが...)

Silverlightでは表示オブジェクトがどうなっているのか?

FlashではMovieClipはタイムライン上で配置できる
静的配置とコード上でインスタンスを生成する
動的配置があります。

最初のドキュメント生成は下記を参照ください。
http://ua-labo.com/#/pid000026

上記の方法でプロジェクトを
生成すると
App.xaml・App.xaml.csと
Page.xaml・Page.xaml.csが自動生成されます。

App.xamlおよびApp.xaml.csはまだ深く突っ込んでいませんが、Applicationというクラスの
サブクラスですので、Silverlightアプリを
司るクラスのようです。

App.xaml.cs

using System.Windows;
using System;

namespace Sample0906
{
	public partial class App : Application 
	{
		public App() 
		{
			this.Startup += this.OnStartup;
			this.Exit += this.OnExit;
			this.UnhandledException += this.Application_UnhandledException;

			InitializeComponent();
		}

		private void OnStartup(object sender, StartupEventArgs e) 
		{
			// メイン コントロールをここに読み込みます
			this.RootVisual = new Page();
		}

		private void OnExit(object sender, EventArgs e) 
		{
		}

		private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 
		{
			// デバッガの範囲外でアプリケーションが実行されている場合、ブラウザの
			//例外機能を使用して例外が報告されます。IE では、この例外はステータス バーの
			//黄色の警告アイコンで示されます。Firefox では、スクリプト エラーが表示されます。
			if (!System.Diagnostics.Debugger.IsAttached)
			{
				// メモ: これにより、例外がスローされたが処理されなかった場合でも、
				//アプリケーションは実行を継続できます。
				// 実稼働アプリケーションでは、このエラー処理を、他の機能 (Web サイトへエラーを報告し、
				//アプリケーションを停止するような機能) に置き換える必要があります。
				e.Handled = true;
				Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
			}
		}

		private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
		{
			try
			{
				string errorMsg = e.ExceptionObject.Message + @"\n" + e.ExceptionObject.StackTrace;
				errorMsg = errorMsg.Replace("\"", "\\\"").Replace("\r\n", @"\n");

				System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight 2 Application " + errorMsg + "\");");
			}
			catch (Exception)
			{
			}
		}
	}
}

App.xaml


	
		
	

Page.xaml.csがFlashCS3でいうドキュメントクラスです。

Page.xaml.csつまりPageクラス

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Sample0906
{
	public partial class Page : UserControl
	{
		public Page()
		{
			// 変数を初期化するときに必要となります
			InitializeComponent();
		}
	}
}

Page.xaml


	

Page.xamlがタイムラインみたいなもので、下記のようにApp.xaml.cs内でルート指定してます。(OnStartUpはアプリ開始のイベントみたいなものです。)

private void OnStartup(object sender, StartupEventArgs e) {
	// メイン コントロールをここに読み込みます
	this.RootVisual = new Page();
}

Page.xaml.csはUserControlというクラスのサブクラスなのですが
UserControlクラスがMovieClipにあたります。
Page.xamlのルートノードがUserControlになるからです。
(ApplicationとUserControl以外あるのかまだ分かってません)
ただ、Flashと違い、子表示オブジェクトが1つしか
持てません。ここがFlashと違うところです。
UserControl.Contentプロパティ(DisplayObject→UIElement)
でムービークリップのルート上に配置する表示オブジェクトを
設定可能です。XAML内でデフォルトでGridタグが
書かれています(上記Page.xamlではCanvasタグ
にしてます。)が、これは表示オブジェクトの1つです。
これは下記と同じですね。


静的配置→XAMLで設定
タイムライン的なもの→XAMLで設定
動的配置→newで作成

GridとCanvasですが、GridはFlashにはありません。
CanvasがSpriteみたいなものです。

つまりこういう風に書きます。

■子表示オブジェクトの追加

ActionScript

var sp:Sprite = new Sprite();
var sp2:Sprite = new Sprite();
sp.addChild(sp2);
sp.removeChild(sp2);

 

C#

Canvas canvas = new Canvas();
Canvas canvas2 = new Canvas();
canvas.Children.Add(canvas2);
canvas.Children.Remove(canvas2);

先ほども述べましたがUserControlには子表示オブジェクトが
1つしか設定できないため、私はUserControl.ContentにCanvasを
設定し、そこにどんどん子表示オブジェクトを追加しています。

 

■座標の設定

ActionScript

sp2.x = 100;
sp2.y = 200;

C#

Canvas.setLeft(canvas2,100);
Canvas.setTop(canvas2,200);

※staticです。

■座標の参照

ActionScript

var x:Number = sp2.x;
var y:Number = sp2.y;

C#

double x =  Canvas.getLeft(canvas2);
double y =  Canvas.getTop(canvas2);

 

■アルファ

ActionScript

sp2.alpha = 0.5;

C#

canvas2.Opacity = 0.5;

 

■mouseEnabledについて

ActionScript

sp.mouseEnabled = true;

C#

canvas.IsHitTestVisible = true;

(UIElementクラスのプロパティのようです)
※デフォルトではtrueです。


分かってきたらこの部分は更新してゆきます。

 

 

■今回のクラス

CATEGORY