Home > AS3 Archive

AS3 Archive

Adobe jpegEncoderを(今更ながら)使ってみる

  • Posted by: ryow
  • 2009年4月 5日 14:35
  • AS3

2009.10.25追記

An asynchronous, vector optimized JPEG encoderという、Flash Player10に最適化したJPEGエンコーダを使えば、処理が約5倍も早いです。300x400とか、小さい画像を作るなら問題ありませんが、大きい画像を扱う場合は大変便利です!! さらに、時間がかかるというか、基本のJPEGEncoderはブラウザが固まってるので、その間に時計マークを出したりすることすらできないという気持ち悪さがあります。ぜひ、vector optimizedを使いましょう(Flash Player9必須ならしょうがないけど)。

Google code にAS3coreLibというプロジェクトがあって、その中にadobeのjpegエンコーダーとPNGエンコーダーがあります。Flash内の一部またはすべてをbyteArrayとして画像にできるものです。これを使い、byteArrayを画像として書き出すPHPなどで画像ファイルを作成し、ダウンロードまたはサーバに保存すれば、お絵かきサイトみたいなのがカンタンに作れるという寸法です。

Continue reading

AS3でNow loading...なローディング(フレームアクション)

  • Posted by: ryow
  • 2009年3月31日 23:58
  • AS3

AS3で読み込みを作るとき、LoaderInfoのProgressEventで書こうが、Event.ENTER_FRAMEで書こうが、なぜか100%になったときしか処理が動かなくて、途中の読み込み状況がまったく出ません。なんでだよ。

stop();
var loadInfo:LoaderInfo = this.loaderInfo;
loadInfo.addEventListener(ProgressEvent.PROGRESS, nowloading);
loadInfo.addEventListener(Event.COMPLETE, onloaded);
function nowloading(event:ProgressEvent):void{
        var per:uint = Math.floor(event.target.bytesLoaded / event.target.bytesTotal * 100);
        trace(per);
};
function onloaded(event:Event):void {
        trace("complete");
};
stop();
this.addEventListener(Event.ENTER_FRAME, checkBytes);
function checkBytes(e:Event){
	var per = this.loaderInfo.bytesLoaded / this.loaderInfo.bytesTotal * 100;
	if (per >= 100) {
		complete();
	}
	trace(per)
}
function complete() {
	this.removeEventListener(Event.ENTER_FRAME, checkBytes);
	trace("complete")
}

出力結果

comp
100

Continue reading

AS3のコンボボックスで内容を動的に作る

  • Posted by: ryow
  • 2009年3月25日 13:01
  • AS3

Flash CS3での使用を想定しています。
コンボボックスのアイテムを動的に作る方法です。

このサンプルでは、テキストエリアに文字を入れて「追加」ボタンを押すとコンボボックスに入力されたテキストが追加されます。テキストエリアが空のときは「入力してね」みたいなことを表示します。

k_btn.addEventListener(MouseEvent.CLICK,kclick);
function kclick(e:MouseEvent):void {
	if (val_txt.text != "") {
		cb1.addItem({label:val_txt.text,data:""});
		setumei_txt.text="選択肢:" + val_txt.text + "を追加しました";
		val_txt.text="";
	}else{
		setumei_txt.text ="テキストを入力してください"
	}
}
cb1.addItem({label:"入力テキストが選択枝になります",data:""});

要はaddItemなんですが、これはObjectになっているので、labelとdataを入れてあげればいい、ということっすね。

いちおう、サンプルも置いておきます。こちら(CS3 .fla形式)。

ドメインもブラウザも超えて、ログインなしでユーザを判別する「ExSO」でwebを進化させる

  • Posted by: ryow
  • 2008年10月22日 22:33
  • AS3

via:別ドメイン間でのSharedObjectの共有 - loftimg.jp/blog

このページを、違うブラウザでアクセスしてみてください。
さて、どうでしょう。アクセス回数が表示されましたね。で、URLから分かるとおり、これはFlashファイルを見ている状態です。

※普通の人ってブラウザを切り替えて使ったりしないもんかなぁ?

Continue reading

マッシュアップのための第二歩目:FlashでAPIからXMLを呼んだときはxmlnsに注意する(2)

  • Posted by: ryow
  • 2008年9月 4日 23:27
  • AS3

このエントリの続きです。今回はHotPepperAPIを使って適当なお店の名前と住所とキャッチコピーをゲッツします。

いきなりハマる

普通にXMLをE4Xで解釈して trace(dataXML.shop[i].catch) と書くとエラーが出ます。これはどういうことか。クーピーさんのこのエントリによれば、catch というのは try~catch の名前とバッティングしてしまうから、らしいです。で、解決方法も書いてあるんですがよくわかりません。

trace(xml.ns::["catch"][0]); // 出力 :: Flasher 募集中!

こういう書き方でいいらしいんですけど、このns::をどこにつけたらいいのかが、このエントリからはサッパリ分かりません。たとえば、xml本体が dataXML.shop[i].catch だった場合はどこにns::をつけるの? ということです。

Continue reading

AS3でDataGridのソートを文字列から数値にする

  • Posted by: ryow
  • 2008年8月24日 01:32
  • AS3

via. DataGridのソートについて質問 - Flex User Group

DataGridコンポーネントは、そのままだとヘッダをクリックしたときにソートされる並び順は「文字列の比較」になります。データの中身が数値だとしても、「1,2,3,5,10,20,100」というデータをソートしようとしたときに「1,10,100,2,20,3,5]のようになってしまいます。これはよくない。数値データのソートなら、数値で降順昇順を決めるべきです。

なので、flexでいうところの sortCompareFunction をFlashで使うときはどうすりゃいいの、というところですが、結論から書くとこうなりました。

Continue reading

fl.control (CS3のコンポーネント)の文字を大きくする

  • Posted by: ryow
  • 2008年7月15日 23:58
  • AS3

fl.control の文字を大きくするにはどうすればいいか。文字自体は インスタンス.label で取得できます。たとえばラジオボタンやチェックボックスのとき、label以外にtextFieldを持ちます。実際のラベルはtextFieldを使っているということですね。
でも、textFieldにtextFormatを当てても変わりません。

結果から言うと、setStyleメソッドを使います。↑のサンプルは以下の設定。

var tf:TextFormat=new TextFormat()
tf.size=20

my_radio1.setStyle("textFormat",tf)
my_cb1.setStyle("textFormat",tf)

フォントサイズを20に設定したよ、ということです。

マッシュアップのための第一歩:FlashでAPIからXMLを呼んだときはxmlnsに注意する

  • Posted by: ryow
  • 2008年7月13日 01:13
  • AS3

なんかマッシュアップとやらが流行ってるらしいので、リクルートAPIキーを取得してマッシュアップしてやろう、と思い立ったんですがXMLを呼んだだけで満足してしまったので続きは後日。
今回の結果だけ書いておこう。っていうか1年も前にMTLのtaquoさんがそういう記事を書いてた。

Continue reading

AS3で2つのコンボボックス(comboBoxコンポーネント)を連携させる

  • Posted by: ryow
  • 2008年7月 7日 20:46
  • AS3

↑のように2つのコンボボックスを連携するときは、dataProviderを指定すると一瞬で出来ます。

Continue reading

AS3でDataGridの頭のよさに感動した!2分で作るRSSリーダ

  • Posted by: ryow
  • 2008年6月25日 10:57
  • AS3

ステージにボタンとDataGridコンポーネントを置いて、テキストフィールドを作ればほとんど出来たようなものです。
DataGridコンポーネントを初めて使ったんですが、XMLのバインドが驚くほど簡単で感動しました。XMLの構造をまったく知らなくても、タグ名だけ知っていれば使えるこの簡単さがすばらしいですね。その秘密はDataProviderにありました。

Continue reading

EventDispatchの意味がわからん

  • Posted by: ryow
  • 2008年6月22日 17:48
  • AS3

AS3の話ですが、カスタムイベントを自作する意味が分かりません。ない頭をひねってみたサンプルが↑です。
とりあえず、以下の要領でボタンを押してみてください。

  1. 青いmcをクリック
  2. イベントをつけるボタンをクリック
  3. 青いmcをクリック
  4. イベントをはずすボタンをクリック
  5. 青いmcをクリック

説明。

まず、青い四角のmcをクリックするとテキストエリアに「mcをクリック」と表示されます。これはmcにaddEventListenerしたMouseEvent.CLICKのハンドラから呼び出したものです。
で、イベントをつけるボタンを押すと、カスタムイベントが発行され、青い四角mcにPUSHというカスタムMouseEvent.CLICKが設定されます。この状態で青い四角mcをクリックすると、「mcをクリック」に追加して「クリックイベント」と表示されます。
イベントをはずすボタンを押すと、カスタムイベントがremoveEventListenerされ、青いmcを押しても「クリックイベント」と表示はされません。

これはどういうことか。

mcやまぁその他のターゲットに対して、クリックしたときの関数を変える、または追加する、という使い方ですね。
ボタンの形をしたものを置いといて、何かのタイミングにカスタムイベントを追加して押したときの挙動を変えるとか。そういう使い方なの? クリックハンドラのオーバーライドってことか。違うのか。

今回使ったサンプルソースはこちら(CS3 .fla形式)。

うーむ。初級を抜けた人が中級~上級に向かうときにハマる、「使い方の分からないクラス/関数」というのは実はいっぱいあって、それを解決するにはASの勉強だけではダメっぽいように思います。たとえばroot変数をクラスのstatic変数にするとか、サウンドの制御をカスタムのクラスで使うとか、コンポーネントを使わないvideoPlayerクラスを試してみるとか、MVCモデルとか、デザインパターンとか。
あとは、この年齢になってプログラミングをやり直してもいいものか、という戸惑いもあります。若くて優秀な人がいっぱいいる中、フレームワークやライブラリも充実しているのに業務ですぐに使えないことをコツコツ勉強する時間をとってしまっていいものか、みたいな。

AS3でリンケージクラスを使うときはpublicにしないと使えない

  • Posted by: ryow
  • 2008年6月12日 22:33
  • AS3

※超当たり前のことなのでスルーしてください。

AS3でmcをリンケージするとき、方法としては2つあって、(1)アニメーションなどを設定したmcをスクリプトで呼び出す場合、(2)MovieClipを継承したクラスを設定して、それをライブラリのmcシンボルに当ててスクリプトで呼び出す場合、です。

(1)アニメーションなどを設定したmcをスクリプトで呼び出す場合

AS3でリンケージ
・ライブラリのmcシンボルを右クリックして「Actionscriptに書き出し」にチェックします。
・「クラス」の設定部分で適当な名前をつけます(ここではTestMC1)。
・スクリプトで「var m:MovieClip = new TestMC1();addChild(m)」などと書きます。

(2)アニメーションなどを設定したmcをスクリプトで呼び出す場合

AS3でリンケージ
・ライブラリのmcシンボルを右クリックして「Actionscriptに書き出し」にチェックします。
・「クラス」の設定部分でクラスの名前をつけます(ここではTestClass1)。
リンケージしたいクラスをpublic Classにします
・スクリプトで「var m:MovieClip = new TestClass1();addChild(m)」などと書きます。
クラスの例:

package{
	import flash.display.MovieClip
	public class TestClass1 extends MovieClip{
	function TestClass1(){}
	}
}

public class にしないと 1180 エラー(未定義である可能性が高いメソッド TestClass1 の呼び出しです)が出てしまいます。コンストラクタは public function にしなくてもOK。
しかし、リンケージクラスがメソッドを使いたいときは、public function にしないといけません。しないと 1069 エラー(TestClass1 にプロパティ testFunc が見つからず、デフォルト値もありません)が出ます。

AS3で作るものを考える、というプロセス

  • Posted by: ryow
  • 2008年6月 4日 22:02
  • AS3

「たとえば」なんつってプログラムを組む練習をしたいとき、参考書に載ってるような「車クラス」「タイヤクラス」「エンジンクラス」を用意して「ブッブーと鳴る」とか「drive()メソッドを動かす」とか、そういう中身のない練習をしてもダメだと思うのですよ。

Flashでやるなら、車ゲームを作る、くらいのことはしなきゃいけない。

車をパーツに分けて組み上げました、やったね! なんてそんなの何の栄養にもならない。車を作ったら道を走る、曲がる、止まる、目的地に着くまでの距離を測る、みたいなことはしないと勉強にならないのです。

というわけで、これをAS3で考えるとき、パーツはそれぞれ Tireクラス、Engineクラス、Bodyクラスを用意するのはいいとして、いま走ってるとか止まってるとかガソリンの残量とかの変数を作るとき、publicクラスで変数だけを入れるクラスを用意するのは正しいでしょうか?
たとえば クルマデータクラス(public class KurumaData)、変数を設定するときはどっからでもアクセスできるメソッドを用意するとか(public static drive(gasolin):void)して、使うときは KurumaData.drive(10)とかやるわけですが、こういうのは違うのかな。

オブジェクト指向を学ばないといかん、という結論に達するんですが、超初級だとクルマ作って終わりだし、もうちょっと上のレベルだとイベントとか使っちゃうし、なんかちょうどいい参考書や参考サイトがないかなぁ、と思っております。
心当たりがあればぜひ教えてくださいませ。

まぁイベントにしても、どこからどこまでをイベント発行すればいいのかも判断つきません。
たとえばボタンを押したときにボタンを押したイベントを発行するのか、とか。

AS3でラベルごとにフレームスクリプトを実行する

  • Posted by: ryow
  • 2008年6月 2日 20:06
  • AS3

AS3で、フレームアニメーションをスクリプト制御したいとき(実際には、アニメーションの中でif分岐したりしたい)、フレーム上にスクリプトを書いていくのはエレガントじゃないのでどうすりゃいいのかなぁ、と常々考えていたんですが、こういうのはどうでしょう。

これまで、ENTER_FRAMEでcurrentFrameを取得して分岐したいラベルなら実行、というやり方をとってみたり、addFrameScriptを試してみたりしましたが、今度はフレーム上に1行だけ関数を書いておいて、これで判断するというやり方です。

たとえば、クイズゲームを作っていて、AかBか選択肢を選んだら「司会者がうーんうーん、とうなって顔色がだんだん黒くなっていって、まだ数秒ためて」ついに正解とか残念、とか言うというアニメーションで、正解とか残念とか言うまでは1本のアニメーションで使いまわして、分岐するところまでいけばいい、と思っているのです。
正解とか残念とか言うところまでを1本のアニメーションにして、どちらを再生するかを最初に分岐するやり方でもいいけど、これだとクイズの数だけアニメーションが必要になっちゃう。

//フレームアクション(ラベル[label1])
checkFrame(currentLabel)

↑のようなスクリプトを書いて、↓のクラスをリンケージしたmcでやってみようと作ってみました。これだと一応動くけど、処理的にどうだろう。こういう書き方で実用的なんでしょうか。フレームスクリプトに詳しい皆様、教えてくださいませ。

package{
  import flash.display.MovieClip
  public class SampleFrameMC extends MovieClip{

    public function checkFrame(label:String):void{
      switch(label){
        case "label1":
          gotoAndPlay("atari")
          break;
        case "label2":
          gotoAndStop("hazure")
          break;
      }
   }
 }
}

AS3でタイムラインスクリプトを書きたければaddFrameScript()を使う

  • Posted by: ryow
  • 2008年5月29日 20:14
  • AS3

AS3でムービークリップにラベルを設定してフレームスクリプト(stop()とか)を書く方法をメモ。

addFrameScriptという関数があって、これを指定してやればいいらしいです。引数は2つで、最初のがフレームラベルかフレーム番号、2番目が関数です。いままでフレームラベルチェック用のENTER_FRAMEをリスンしてたのでこれでかなり楽になったよ!! と書きたかったんですが、なぜか指定どおりに動きません。なぜだ。教えてくださいませませ…

以下の例はステージに置いた test_mc のクラスファイルです。

var testmc = new TestClass(test_mc)

フレーム1でインスタンスにクラスをあてます。フレーム4に"label1"、フレーム9に"label2"を書いてあります。フレームアクションは何も書きません。

package{
  import flash.display.MovieClip;

  public class TestClass extends MovieClip{

    var my_mc:MovieClip

    function TestClass(mc){
      my_mc = mc
      mc.addFrameScript("label1",func1)
      mc.addFrameScript(9,func2)
    }
    function func1():void{
      trace(my_mc.currentFrame) //結果:1
    }
    function func2():void{
      trace(my_mc.currentFrame) //結果:10
    }

  }
}

実行結果は、フレーム4にあるはずのlabel1がフレーム1で実行されちゃっているのと、フレーム9で実行するはずのfunc2がフレーム10で実行されちゃってるという不具合があります。

追記。うまく動かないのはもしかすると、「自分自身のクラスで自分にaddFrameScriptしているからなのかも。他のクラスから動的に作った(リンケージの)mcに対してaddFrameScriptする、というのが正しい使い方なのか!!?

インスタンスメンバーとクラスメンバー

  • Posted by: ryow
  • 2008年5月23日 18:00
  • AS3

インスタンスメンバーはインスタンス化(new SampleClass();)したクラス内の変数。
クラスメンバーは直接クラスを呼んだときの変数(SampleClass.testNum)。

当たり前のことは当たり前なんですが、AS2からAS3に移行するとき、どこにも書いてないんだけどメッチャ大事なのが変数のスコープ問題です。

AS2では _root.testNum でアクセスできたものは、入れ子になったmcからも同じようにアクセスできました。

AS3では rootに変数を置くことはナンセンスとされているので、変数の置き場所に困ります。たとえば沢山の入れ子になったmcがいくつもあって、そのどれもが _root に置いた変数 testNum を参照したいとき、それぞれのmcのタイムラインにいちいち _root.testNum と書くのではないということです。

ここでクラスメンバーの登場というわけですね。

どんな深い入れ子になったmcからも、すべて一律に SampleClass.testNum でアクセスできれば、階層を意識する必要はありません。

そのためにはどうするか。

package{
  public class SampleClass{
    public static var testNum:int;
  }
}

これですべてのmcなどから簡単にアクセスできます。タイムラインだけじゃなく、他のクラスからも同じ。 インスタンスメンバーとどう違うのかというと、インスタンス化してしまうとそのインスタンスごとに testNum という変数が設定され、値を共有できなくなってしまうということですね。 「AS3」「変数」「置き場所」「設置場所」「階層」とかのキーワードで引っかかるようになれば初心者に役立つと思います。

AS3でタイムラインベース開発

  • Posted by: ryow
  • 2008年5月22日 16:31
  • AS3

ホント初心者でスミマセン。

root変数

AS3のタイムラインベース開発で、入れ子になったmcの内側からroot変数を参照するときは、AS2だと _root.hoge でよかったんですが、AS3では違います。rootをMovieClipにする必要があります。

//rootのタイムライン1
var rootNum:uint =1
//
//mc1の内側
MovieClip(root).rootNum = 2

あるいは

var rootObj = this.root as MovieClip
rootObj.rootNum = 2

サウンド

ここではライブラリに mySound というリンケージサウンドがあるものとして、このmySoundのボリュームを10%で1回再生したいときは、AS2では

var s1:Sound = new Sound(_root)
s1.attachSound(mySound)
s1.setVolume(10)
s1.start(0,1)

だったんですが、AS3では違いますよね。

var s1:Sound = new mySound()
var channel1:SoundChannel = s1.play(0,1)
var trans:SoundTransform = channel1.soundTransform
trans.volume = 0.1

サウンドごとにチャンネルを割り当てて、チャンネルごとにトランスフォーム(ボリューム、パン)を設定するということですね。じゃあボリュームを変えて再生を止めたいときは s1.setVolume(50);s1.stop() じゃすまないんですね。

点P1と点P2がなす角度を求める

  • Posted by: ryow
  • 2008年5月 9日 07:30
  • AS3
var P1:Point = new Point(10,20)
var P2:Point = new Point(300,400)

var vector:Point = P2.subtract(P1)
//vector=(x=290,y=380)

var angle:Number = Math.atan2(vector.y,vector.x) * 180/Math.PI
//angle=52.65

Math.atan2の引数は(y,x)の順番なので注意が必要。っていうかatanとatan2が何者なのかを知らないのでこういう部分でつっかえるんです。

覚えるとAS3使い的にかっこいい関数

  • Posted by: ryow
  • 2008年4月28日 20:40
  • AS3

職場ではCS3を使えるので、参考書片手にいまさらAS3の勉強を始めています。
1年半前(Flash9 public alpha版)にちょっと触っといてよかった。addEventListener とかに拒否反応がおきなくてよかった(俺が)。

で、
参考書を見ていると、AS2時代は触ったこともなかった関数がたくさんあります。
新しい関数もあると思います。

Continue reading

変数をXMLにする

  • Posted by: ryow
  • 2008年4月24日 20:14
  • AS3
XMLを読み込んで変数にするんじゃなくて、E4X的に変数をXMLにするときはタグ名、属性名、属性値、内容を設定してあげればよいらしいです。
var tagName:String = "data"
var attributeName:String = "id"
var attributeValue:String = "XX1234"
var content:String = "XMLです"
var dataXml:XML = <{tagName} {attributeName} = {attributeValue} >{content}</{tagName}>

trace(dataXml.toXMLString())
//結果:<data id="XX1234">XMLです</data>

AS3でマスク

  • Posted by: ryow
  • 2007年5月28日 00:00
  • AS3

※Flash9 アルファ版でのスクリプトテストです

AS2ではmc.setmask(target)。
なんかもうメンドイのでAdobeのサンプルをそのまま掲載。

import flash.text.TextField;
import flash.display.Sprite;
import flash.events.MouseEvent;

var tf:TextField = new TextField();
tf.text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " 
            + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "
tf.selectable = false;
tf.wordWrap = true;
tf.width = 150;
addChild(tf);

var square:Sprite = new Sprite();
square.graphics.beginFill(0xFF0000);
square.graphics.drawRect(0, 0, 40, 40);
addChild(square);

tf.mask = square;

要は、マスクされるもの.mask = マスクするもの。
マスクするものはDisplayobjectじゃないとダメ…でいいのかな。

onEnterFrameイベントを覚えた

  • Posted by: ryow
  • 2007年5月27日 00:00
  • AS3

※Flash9 アルファ版でのスクリプトテストです

function onEnter(event:Event){
if(this.currentLabel=="lalala"){
	removeEventListener(Event.ENTER_FRAME,onEnter);
	trace("aa");
}else{
	trace("bb");
	}
}
root.addEventListener(Event.ENTER_FRAME, onEnter);

たとえば、ラベルが「lalala」のフレームに来るとこのenterFrameを終わらせるような処理。この場合、trace("aa")は一度だけ実行され、タイムラインは「lalala」で止まる。
currentLabelプロパティはAS3から登場。

マウスクリックとイベントリスナを覚えた

  • Posted by: ryow
  • 2007年5月16日 00:00
  • AS3

※Flash9 アルファ版でのスクリプトテストです

function clickmc(event:MouseEvent):void{
	trace("aaa");
}
mc1.addEventListener(MouseEvent.CLICK,clickmc);

mc1をクリックしたときに何かする、というボタンアクションを定義。
僕は馬鹿なのでimport文がサパーリ分からないんだけれども、たぶん import flash.events.*; と import flash.Mouse; でもやっとけばOKでしょう。
ついでに、マウス関連のMouseEventを書いとこう。メモメモ。

onRelease : MouseEvent.CLICK
onRollOver : MouseEvent.MOUSE_OVER or MouseEvent.ROLL_OVER
onRollOut : MouseEvent.MOUSE_OUT or MouseEvent.ROLL_OUT
onMouseWheel : MouseEvent.MOUSE_WHEEL

ダブルクリック -> MouseEvent.DOUBLE_CLICK

ダブルクリックが使えなかった。。

追記。doubleClickEnabled を trueに設定すると使えるようになるとのこと。

this.doubleClickEnabled = true;
this.addEventListener(MouseEvent.DOUBLE_CLICK, testFunc);

AS3で新規オブジェクトを作るとき

  • Posted by: ryow
  • 2007年5月12日 00:00
  • AS3

※Flash9 アルファ版でのスクリプトテストです

気をつけるべきなのが、今までcreateEmptyMovieClipやらcreateTextFieldをやってた処理。
今では空のmcなら

var mc1:MovieClip=new MovieClip();

でいいし、テキストフィールドなら

var tf1:TextField=new TextField();

でいいみたい。
楽!!
ということで比較!!

AS3

var mc1:MovieClip=new MovieClip();
mc1.graphics.lineStyle(3,0x00000000);
mc1.graphics.moveTo(100,100);
mc1.graphics.lineTo(300,400)
addChild(mc1)

AS2

var mc1=createEmptyMovieClip("mc1",1);
mc1.lineStyle(3,0x00000000);
mc1.moveTo(100,100);
mc1.lineTo(300,400);

AS3の場合、たとえばラインを引きたい場合は、オブジェクトを生成してからそいつの持つgraphicsプロパティか何かに一旦描画して、それをオブジェクト自身にaddChildするわけです。めんどくさいというかちょっと分からなかった。graphicsって何だって感じ。

でもこれを覚えておけば、仕様書を読んだときにクラスとメソッドの間にgraphicsやらDisplayObjectやらって変なのがいたとき、それをそのまま受け入れて書けばいいというのが分かってとてもナイス。

まぁAS2でも、空のmcを作ってその上に描画して、さらにそれを他のmcに乗せたり深度変えたりして使わなきゃいけなかったから同じかな。むしろやっぱ楽になってるかも。AS2の場合、同じ深度のインスタンスを作っちゃったらそれ前のものが消えちゃう危険性があったからね。

AS3でリンケージ(ビットマップ)ができた

  • Posted by: ryow
  • 2007年5月10日 00:00
  • AS3

※Flash9 アルファ版でのスクリプトテストです

リンケージ名をhoge_bmpとした(hoge.jpg)ファイルを表示させる場合

import flash.display.Bitmap;
import flash.display.BitmapData;

var e=new hoge_bmp();
var bit:BitmapData=new BitmapData(e.width,e.height);
bit.draw(e);
var bmp:Bitmap=new Bitmap(bit);
addChild(bmp)

リンケージクラスを実体化させるのはよかったんだけど、ビットマップデータの場合は直接addChildできないっぽかったので(addChildはDisplayObjectのみ)これを新規ビットマップデータにdrawして、さらにそれを新規ビットマップで定義してからaddChildしてみた。

つーかなんだこれ。めんどくせぇーーー。Javaかっつーの。

AS3でloadMovie

  • Posted by: ryow
  • 2007年5月 9日 00:00
  • AS3

※Flash9 アルファ版でのスクリプトテストです

基本的にexe書き出しの上でのloadMovieばっかりやってるんですが、flash8exe書き出しの際はドキュメントルートがそれまでと違ったり、screenweaverでロードするときはドキュメントルートを含んだ上でパスを指定したりと、まぁめんどくさいわけですが。

今回はAS3でloadMovie。
というかloadMovieメソッドはなくなったので、Loaderクラスを使います。

import flash.display.*;
import flash.net.URLRequest;
var rect:Shape = new Shape();
rect.graphics.beginFill(0xFFFFFF);
rect.graphics.drawRect(0, 0, 100, 100);
rect.graphics.endFill();
addChild(rect);

var ldr:Loader = new Loader();
ldr.mask = rect;
var url:String = "Hoge.swf";
var urlReq:URLRequest = new URLRequest(url);
ldr.load(urlReq);
addChild(ldr);

まず上半分はいらないんだけどとりあえず。
シェイプクラスで0,0から100,100まで四角を描きます。addChildってのは今まででいうattachMovie。Childを使うことでE4Xに対応するのが簡単ということですね。
で、下半分。読み込むのはHoge.swf。これをURLリクエストクラスのオブジェクトで生成して、loadメソッドで読み込み、addChildで表示。

コード的には直感的になってるとはいえ、これまでのノウハウを一切使えないというところが怖い。
しかもこの場合、ムービーのローディングはloaderクラス内でやるべきなのかな? だとすると今までの資産の再利用が…あああー! ってことになりかねません。

引き続き調査。

AS3でのリンケージが分かった!!

  • Posted by: ryow
  • 2007年5月 8日 00:00
  • AS3

FlashCS3でのリンケージはこちらに書き直しました。
AS3でリンケージクラスを使うときはpublicにしないと使えない

※Flash9 アルファ版でのスクリプトテストです

結論から言うと、new リンケージ名。そーのまんまや!!
サウンドのロードは分かった。

  • コンストラクタ:new Sound()
  • メソッド:load/play/close
  • プロパティはいろいろ。

今までのattachSoundやstartがなくなった? みたいなので、以下のようにやる。コード的にはシンプルになってるけど…具合が悪い。

import flash.media.Sound;
var s1:Sound=new Sound();
s1.load(new URLRequest("s.mp3"));
s1.play();

これはswfと同階層にs.mp3というのを置いている場合の話。
なので使用する際はサウンドのロードが発生してしまいます。
これじゃダメなんだよぅ…リンケージしたサウンドを使いたいんだよぅ…

Continue reading

AS3でgetURL

  • Posted by: ryow
  • 2007年5月 6日 00:00
  • AS3

※Flash9 アルファ版でのスクリプトテストです

getURLでjsを使う場合はこちらにもちょっと書いてあります。参考になるかどうか。。

いまさらなんだけど、getURLもAS3では新規関数に置き換わっています。

var url:String = "http://www.adobe.com";
var variables:URLVariables = new URLVariables();
var request:URLRequest = new URLRequest(url);
 try {            
    navigateToURL(request);
 }catch (e:Error) {
    // handle error here
 }

navigateToURL関数は、引数request(URLRequestタイプ)を取ります。
上記はさらに

var variables:URLVariables = new URLVariables();
variables.exampleSessionId = new Date().getTime();
variables.exampleUserLabel = "Your Name";
var request:URLRequest = new URLRequest(url);
request.data = variables;

って感じでrequestの中身を拡張して送信することもできるっぽい。

Index of all entries

Home > AS3 Archive

About

りょうどっとねっとブログ

Twitter Id:ryownet

はてなブックマーク Id:ryownet

Search

Return to page top