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:

初めての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: ,

flashの情報をローカルで保存してみよう

flashでクッキーを使いたい場合
SharedObjectクラスを使うと大変便利ですよ

いままで使ったことなかったけど、
意外とお手軽だね。

わかりづらいけどリロードした後
選択した項目に印がついたままならローカルに情報が保存されています。

ちなみに配列を保存することもできます。

そして下がソースです

var sObj:SharedObject = SharedObject.getLocal("flag");

//ステージ上に配置したラジオボタンの名前
var rgBtn:Array = [point0, point1, point2];

// マウスリスナーオブジェクト
var mouseListener:Object = new Object();

if (sObj.data.flag != undefined)
{
rgBtn[sObj.data.flag].selected = true;
}
//マウスダウンイベントを受け取った時
mouseListener.onMouseDown = function() {
var nCount:Number = 0;
while (nCount < rgBtn.length) {
if (rgBtn[nCount].hitTest(_xmouse, _ymouse, false))
{
sObj.data.flag = nCount;
break;
}
nCount++;
}
};

Mouse.addListener(mouseListener);

flashlite2.0から利用できるから携帯でもきっと活躍できるよ!

ドコモ以外だけどね!

ドコモはクッキー使えないし、
flashlite1.1から2.0とばして最近3.0だから
実際まだまだflashで携帯サイトは作りたくないよねー

Tags: ,

Tweenerをつかってみよう 2

なんか久しぶりにflashを作ることになりそう(しかもas2.0で)
せっかくなのでTweener使ったろうと思いさらっとチェックしてみよう。

お題は
【Tweenerペジェ線をスクリプトで描画してみよう!】

ペジェ線でうごかせるんだねTweener
おもすれー

まずはCurveModifiersをインポート

import caurina.transitions.properties.CurveModifiers;

ふむふむ参照サイトによると
_bezier配列に座標を設定してやると、その点を「ベジエ曲線軌道のコントロールポイント」とした、トゥイーンが行なわれます。

ふむふむ。
CurveModifiers.init();
はとりあえず入れとけばいいのか。

では
さっそくいっちょas2.0で書いてみよう!

ソース

import caurina.transitions.Tweener;
import caurina.transitions.properties.CurveModifiers;
CurveModifiers.init();

//myMcはステージ上に配置したムービークリップ
myMc._x = 40;
myMc._y = 100;
var xpos:Number = myMc._x;
var ypos:Number = myMc._y;

function pointDrow():Void {
lineStyle(2,0xff0000,100);
moveTo(xpos,ypos);
lineTo(myMc._x,myMc._y);
xpos = myMc._x;
ypos = myMc._y;
}

myMc.onPress = function():Void {
Tweener.addTween(myMc,{_x:460, _y:100, _bezier:[{_x:266, _y:212}, {_x:134, _y:57}, {_x:81, _y:206}], time:5, transition:"linear"});
var timer:Number = setInterval(pointDrow, 10);
};

こんな感じで結果がこれです
※くろぽちを押してみて

いいね、
マスクにつかっても面白いし。

参照URL
AS3でTweener 1.31.67を使う
Tweener Transition sheet
Tweener Documentation and Language Reference
Tweenerをつかってみよう 1

Tags: ,

外部からLoadした画像の処理

外部から読込んだ画像をそのまま
拡大・縮小・回転をした場合
カクカクのきったない表示になってしまいます。

この対処法として、読込んだ画像はそのまま使わず
BitmapDataにdrowしスムーシングをかければ
オブジェクトを拡大・縮小・回転してもきれいに表示されるというものです。

※ソースはas2.0です

import flash.display.BitmapData;

var my_mcl:MovieClipLoader = new MovieClipLoader();
var myListener:Object = new Object();
my_mcl.addListener(myListener);

/*
ステージ上でボタンを配置している為、震度を0に指定
*/
var mcItem:MovieClip = createEmptyMovieClip("Item", 0);
my_mcl.loadClip("img/mario.png",mcItem);

myListener.onLoadInit = function(targetMc:MovieClip):Void {
if (targetMc._name == "Item")
{
var mcDisplay:MovieClip = createEmptyMovieClip("Display", getNextHighestDepth());
bitmapSmoothing(targetMc,mcDisplay);
btnAction(mcDisplay);
}
};

function bitmapSmoothing(loader:MovieClip, holder:MovieClip):Void {
var bd:BitmapData = new BitmapData(loader._width, loader._height, true, 0×00000000);
bd.draw(loader);
holder.attachBitmap(bd,0,"auto",true);
holder._x = Stage.width * 0.5 - loader._width * 0.5;
holder._y = 50;
loader.removeMovieClip();
}
//ボタンは直接ステージ上に置いたものをつかってます
function btnAction(targetMc:MovieClip):Void {
btn1.onPress = function():Void {
targetMc._xscale += 10;
targetMc._yscale += 10;
};
btn2.onPress = function():Void {
targetMc._xscale -= 10;
targetMc._yscale -= 10;
};
btn3.onPress = function():Void {
targetMc._rotation -= 15;
};
}

参照サイト にゃあプロジェクト - ウェブログ - 画像のスムージング設定 (2)

Tags: ,