ExternalInterfaceでつまづく

swfとjavascript間で通信するためのクラス
ExternalInterface Class でつまづいたのでメモ

かるくつまづいた 1

allowScriptAccessをsameDomainかalwaysにしないと
swfとjavascript間で通信できない。
追加先
parameタグ/embededタグ(アトリビュート)

まあまあつまづいた 2

objectタグのidの名前に"extanal"の文字列
例)"objextanal","extanalObj","myextanalObj"

を加えないとIEで
swfからjavascriptの関数を呼び出せるが戻り値がnullになって返ってくる。

注意!!
id名が重複すると最初に表示されたもの以外はnullになるみたい
複数同じswfをページくつける場合は動的はidを用意してください

ExternalInterface.call Internet explorerでnullが返ってくる件
http://quality.ekndesign.com/archives/2006/07/externalinterfa.html

かなりつまづいた 3

これもIE系
IEはIE8だけなくとも通信できた気がする・・・(あいまい)

objectタグに

classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"

csとかでパブリッシュすればタグにデフォルトで含まれてるんだけどね

これがないと
swfからjavascriptの関数を呼び出せるが戻り値がnullになって返ってくる。

そもそもclassidってなんだよとかおもったけど
ブラウザの ActiveX コントロールを識別します。だそうだ。

こんなんだから
ExternalInterface Classは嫌いというか苦手意識がつくよね。

参考になったページです
ExternalInterfaceとかの落とし穴まとめ
http://0-9.sakura.ne.jp/blog/archives/2008/04/14224435.html
ExternalInterfaceを使ってみる (2)
http://www.project-nya.jp/modules/weblog/details.php?blog_id=644

Tags:

雪が降るエフェクトAS3

季節はずれですけど、
雪国生まれの僕が納得いく
雪エフェクトをちょっと昔に発見したので紹介します。
※多分adobeのサイトにあったサンプルをちょっといじった。

サンプルasはこちら
main.as
snowflake.as

Tags:

2つの色を混ぜてみる

2つの色を混ぜて中間色を求めるスクリプトが
必要になったのでググったらありました。

参照サイト: nondelion.com 2つの色の中間色を求める方法

~方法~

1, 2色とも16進数からRGB値を割り出す(ビットマスクを利用します)

2, RGB値を足す

3, また16進数に戻す

こんな感じ。

以下がサンプルソースになります

package
{
import flash.display.Sprite;

public class Main extends Sprite
{
//黒色
private var color1:Number = 0×000000;
//赤色
private var color2:Number = 0xff0000;

public function Main():void
{
init();
}

private function init():void
{
var sp:Sprite = new Sprite();

//赤と黒の中間色
var mixColor:Number = setMiddleColor(color1, color2);

sp.graphics.beginFill(mixColor);
sp.graphics.drawRect(0, 0, 100, 100);
sp.graphics.endFill();
addChild(sp);

}
private function hex2rgb(n:Number):Array
{
var rgbArray:Array = new Array(3);
rgbArray[0] = ( n >> 16 ) & 0xff;
rgbArray[1] = ( n >> 8 ) & 0xff;
rgbArray[2] = n & 0xff;
return rgbArray;
}

private function setMiddleColor(firstColor:Number, secondColor:Number):uint
{
var firstRGB:Array = hex2rgb(firstColor);
var secondRGB:Array = hex2rgb(secondColor);
var red:Number = int((firstRGB[0] + secondRGB[0]) * 0.5);
var green:Number = int((firstRGB[1] + secondRGB[1]) * 0.5);
var blue:Number = int((firstRGB[2] + secondRGB[2]) * 0.5);
var hex:uint = red << 16 | green << 8 | blue;
return hex;
}
}

}

>>サンプルASのダウンロードはこちらから

Tags:

小さなコトスペシャル

小さなコトでイライラしたので忘れていもいいように
書き留めときます。

stage.stageWidth/stage.stageHeightはブラウザによって値を取得できるタイミングがちがう

IEはコンストラクタで値を取得しようとしてもとれないわよ
firefoxはとれるけどね。
そうめん使ってる人はrunの時もステージサイズはとれないわ!
次のfunctionで取得して!!

flvをNetStreamクラスをつかって再生した時の音量を0にしたい
こいつがミソ! 無音にできます。

import flash.media.SoundTransform;

/*このへんはおきまり
var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
*/
//音量調整するところ ※SoundTransform 第一引数と第二引数で右と左のボリュームだったきする。
var mySoundTransform:SoundTransform = new SoundTransform(0);
ns.soundTransform = mySoundTransform;

TextFieldのautoSizeはas2.0と書き方が違う
textField.autoSize = (Boolean値) だったのが
左ぞろえ右揃え中央ぞろえとか機能がついてんだね

定数 文字 説明
TextFieldAutoSize.NONE “none” なし
TextFieldAutoSize.LEFT “left” 左に揃えて整形
TextFieldAutoSize.RIGHT “right” 右に揃えて整形
TextFieldAutoSize.CENTER “center” 中央に揃えて整形

オブジェクトを最前面にしたい時

いっつも忘れるコレ
stage.setChildIndex(最前列にしたいオブジクトの名前,numChildren-1);

例)

var sp:Sprite = new Sprite();
var objS:Shape = new Shape();
sp.addchild(objS);
・・

中略
//spの中でobjS最前列にする
sp.setChildIndex(objS,numChildren-1);

しらべるといつもnumChildrenがくせものに感じる

xmlのパースの仕方

これもすぐ忘れる
本みないとわかんなくなる

アトリビュートの場合(アトリビュートがIDの場合)
var str:String = hoge@ID
長いしだんだん眠くなってきた。

長くなりそうだから続きは次にかきます。

Tags:

初めてのpapervision3D その3

次は3Dの球体にテクスチャを張り付けてみよう。

BitmapFileMaterialをつかって画像をはりつける
せっかくなのでgooglemapの航空写真をつかってみました。

bg
サンプルはこちら

そしてソース

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import caurina.transitions.Tweener;
	import org.papervision3d.view.*;
	import org.papervision3d.objects.primitives.*;
	import org.papervision3d.materials.*;

    public class Main extends BasicView
    {
		private var mySphere:Sphere;
		public function Main() {
			init();
		}
		private function init():void
		{
			var material:BitmapFileMaterial = new BitmapFileMaterial("bg.jpg");
			mySphere = new Sphere(material, 300, 30, 30);
			var sp:Sprite = new Sprite();
			scene.addChild(mySphere);
			startRendering();
			sp.addEventListener(Event.ENTER_FRAME,enterFrameHandle);

		}
		private function enterFrameHandle(e:Event):void
		{
			mySphere.rotationY += 0.5;
		}
	}
}

追加変更した部分は・・

1、materialsをインポート
import org.papervision3d.materials.*;

2、BitmapFileMaterialに対象画像のパスをつっこみ
var material:BitmapFileMaterial = new BitmapFileMaterial(”bg.jpg”);

3、Sphereをnewする際に第1引数にいれちゃういましょう

mySphere = new Sphere(material, 300, 30, 30);

ちなみに第2引数は表示サイズ、第3引数と第4引数は縦線横線の数になります。
初めてのpapervision3D その2 の時より線を増やしてカクカク感をとりより球体らしくしました。

VF1からVF3位の差がでたきがします。

Tags: ,

初めてのpapervision3D その2

前回のつづきです。
※Papervision3D 2.0 Great Whiteをダウンロードしてパスが通っているのが前提とりなります。

ではではこんな感じで

サンプルSWF

3Dの球体がよこにクルクル回るクラスをかいてみましょうか。

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import org.papervision3d.view.*;
	import org.papervision3d.objects.primitives.*;

    public class Main extends BasicView
    {
		private var mySphere:Sphere;
		public function Main() {
			init();
		}
		private function init():void
		{
			mySphere = new Sphere(null, 300, 10, 10);
			var sp:Sprite = new Sprite();
			scene.addChild(mySphere);
			startRendering();
			sp.addEventListener(Event.ENTER_FRAME,enterFrameHandle);
		}
		private function enterFrameHandle(e:Event):void
		{
			mySphere.rotationY += 1;
		}
	}
}

Tags: ,

初めてのpapervision3D

flashとか作りますよ、とかいうと必ずといっていいほど
「3Dできんの?」
なんて聞かれますよね。

てなわけで papervision3D をつかってみた。
papervision3Dとは簡単に3Dグラフィックスを表現できるactionscriptライブラリです。

まずはpapervision3Dをダウンロードしよう。
とりあえず現状で一番新しいバージョン

Papervision3D 2.0 Great White をつかいます。
※バージョン1.5 / 1.7 とはいろいろ仕様がかわっているそうです。

まためんどくさいことに
Papervision3D 2.0 Great WhiteはSubversionで入手するしかないようです。
※Subversionについてはこちらを参照してください
Subversion - Wikipedia
TortoiseSVNのインストールと設定(windowsのひと)

リボジトリのURL:
http://papervision3d.googlecode.com/svn/

ダウンロードしたフォルダは任意のディレクトリにおいておきましょう。
ちなみに僕はフォルダに「p3d」と名前をつけCドライブ直下においたのでパスはこうなりました。

C:\p3d\trunk\as3\trunk\src

でflash cs3 環境の場合は 

編集 >> 環境設定 >> Actionscript >> Actionscript 3.0 設定
で上記のパスを追加

flashDevelop環境の場合は

Tools > Global Classpaths に上記パスを追加

これでPapervision3D 2.0 Great Whiteを利用できる環境ができました
ながかったー

ながかったのでスクリプトは次の機会に
・・つづく

Tags: ,

インスタンスのnameプロパティ

Actionscript3.0では
getChildByName()メソッドで
インスタンスのnameプロパティが参照できます。

for (var i:int = 0; i < 10; i++)
{
var mc:MovieClip = new MovieClip();
mc.name ="mc" + i;
this.addChild(mc);
}
for (i = 0; i < 10; i++)
{
trace(this["mc" + i]);
//出力結果 undefined ・・・これではまりました。
trace(this.getChildByName("mc" + i).name);
}

名前でインスタンスを動かしたかったんです。

参照ページ
getChildByName()メソッド

Tags:

Tweenerをつかってみよう 1

Tweenerとはトゥイーンを実現するActionScript用ライブラリ。

いつも動きの部分は自作の関数つかってたが
ここらで利用してみるこころみ。

さっそくにとよんさんが書いた記事を参考にTweenerに挑戦してみるぞう!

まずはtweener - Google Code
でtweener_1_31_74_as3.zipをダウンロード げっつ!

続きを読む »

Tags: ,

Actionscript3.0の最適化

ActionScript3 最適化・高速化Tips 簡易まとめ

という大変興味深い記事を発見しました。
すぐに理解して実行できそうな部分だけピックアップしとこ。

続きを読む »

Tags: