カテゴリー別アーカイブ: AS3

2次元Vectorの初期値設定


1次元Vectorの書き方は覚えたけど、2次元Vectorに初期値を入れたい時ってどうするんだろ?って思ったのでメモ。

以下のようにすればできる。

var vec2:Vector.<Vector.<int>> = new <Vector.<int>>[new <int>[0, 1, 1], new <int>[1, 0, 0]];

少し見やすくすると、

var vec2:Vector.<Vector.<int>> = new <Vector.<int>>[
    new <int>[0, 1, 1],
    new <int>[1, 0, 0]
];

こう。

CS5からの書き方で、CS4以前では違う書き方をすることになります。

全部にnew <int>を書く、というのと、最初のnew <Vector.<int>>がハマりどころでした。考えて見れば、確かにそうですねという所。流石に3次元Vectorまではやりたくない感じがしますね。

参考:FN0902001 – Vectorクラス – Flash : テクニカルノート

AS3のTimerのズレ


AS3でタイマーを使ったとき、処理が重いとズレる場合がある、というのは時々言われているみたいです。しかし、全然重くない処理でももともとズレるようになっているようです。

回数をTimerで設定することができるんですが、これが回数が増えると、大きくズレる。

今までずっと、

var timer1:Timer = new Timer(1000, 1);

var timer2:Timer = new Timer(50, 20);

は同じ時間にTIMER_COMPLETEを吐くとばかり思っていたんですが、
実はやってみると、0.5秒くらいtimer2の方が遅い。1秒で0.5秒ずれる、っていうのは相当な誤差です。誤差と言える範囲ではないです。

タイマーをフレーム間隔に近づけると、誤差は少なくなっていく気がしますが、絶対そう!というわけでもないみたいです。あと、回数を増やせば増やすほどずれる、というわけでもない。

0.05秒というのが、30fpsで1フレームあたりの秒数(≒0.033)にちょうど合いにくいのかもしれません。時間ごとに処理したい場合は、Timerを使うよりも、ENTER_FRAMEでgetTimerした方がよいのかもしれません。

Timerのズレ実験 – wonderfl build flash online

倉庫番とTenorionを合わせたらどうなるか?


タイトルのようなものを、年末あたりに思いついたんですが、途中まで作って完成させていませんでした。

Tenorionは正確にはTENORI-ONと書く、ヤマハの電子楽器です。→詳しくはこちら

これをFlashで再現されたのがこのFlashで、SiONというライブラリを使って実装されています。

SiON Tenorion

面白いですよね。

これを何かと合わせて別のものができないか、と考えたのがこちらになります。

倉庫番+Tenorion実験(音注意!)

倉庫番 + Tenorion 実験 – wonderfl build flash online

緑が自機。青が箱、黄色がターゲットで箱が重なってる時は薄い青になります。倉庫番のルールはそのままで、緑の人を動かして、青い箱を黄色の所に全て配置すればクリアです。箱の位置によって、音が変わります。全て配置すると・・・?

普段作成するコンテンツがPlayer9ばかりだったもので、Vector型をまともに使うのが初めてで、ちょっと混乱しました。

これで音がうまいこと作られたら楽しいことになりそうです。しかしそうなるとステージを作るのが難しくなるので、両立は難しそうですが。まあ実験でした。

TweenerのuseFrames


Tweenerを普段良く使うのですが、あまり使ってなかった機能で、最近便利だと思った機能があります。useFramesというオプションです。

使い方は次のような感じ。

Tweener.addTween(target, {useFrames:true, alpha:1, time:3, transition:'easeOutQuad'});

useFramesをtrueにすると、timeの値がフレーム数で指定できるようになります(この場合は3フレーム)。また、アニメーションもタイマーではなく、フレームレートによるタイミングで動作します。(古いリビジョンでは動かないとありますが、最新のものは大丈夫そうです)

つまりフレームレートが落ちているときに、タイミングがずれたりしないのです。これがすごく大事。

タイムラインアニメーションとスクリプトによるアニメーションを併用することがわりとあると思いますが、Tweenerは基本的にタイマーで動作するため、フレームレートが落ちたときに、アニメーションがずれてしまうことがあります。このオプションでこのズレを回避できます。

できるだけフレームレートが落ちるような処理を回避して軽く作る、というのが大事と思っていますが、低スペックマシンで再生したときに変な動きをする、あるいはエラーで止まってしまうなんて事が無いように、両方使う場合には使ってみるといいかもしれません。

他のTweenライブラリでこういうフレームレートに応じた処理を入れてるライブラリはあるんだろうか・・・と思ったらBetweenAS3にもあるみたい(_frame)。さすが。

Eventメタデータタグを便利に使う


AS3のEventメタデータタグは何のためにあるの?というTogetterを見て、そういえば自分も調べたけど何も書いてなかったなぁと思ったのでメモ。

自分でカスタムイベントを作成すると、addEventListenerしたときのコードヒントにカスタムイベントが出てこなくて面倒だな、と思っていたんですが、Eventメタデータタグを使うと楽ができます。

ActionScriptのメタデータタグについては公式のこちらをどうぞ。

使い方は

[Event(name="eventName", type="package.eventType")]

というような感じで、カスタムイベントクラスの中・・・ではなく、そのイベントをdispatchするクラス(IEventDispacherなクラス)に書く感じになります。

すると、他でそのdispatchするクラスを使ってaddEventListenerしたときにコードヒントがでてくれます。

注意点としては、メタデータタグを書く位置をclassの書いてある位置の上(public class Hoge{}より外側)にすること。メタデータタグ内のプロパティは2重引用符/ダブルクォーテーション(“)で囲うこと

普段文字列はシングルクォーテーション派なので、何をどうやっても動かず、かなり悩まされました。。普通ダブルクォーテーションなんですかね。(FlashBuilderでの場合。FlashDevelop他では動くんでしょうか)

また、Eventのtypeに入れた名前がそのまま定数として大文字+アンダーバーに変換されるので、「hogeFugaXML」みたいなtypeにすると、「HOGE_FUGA_X_M_L」とか残念な変換をされてしまいます。これが実際のEvent側で用意している定数と違う場合、動作しなくなってしまうので注意が必要そうです(この場合はhogeFugaXmlと書けば正常に動作するはず)。

自分で作ったクラスの場合は特に書かなくてもいい場合がほとんどと思いますが、人に渡すものだったりする場合は、書いたほうが親切かなと思うので、有効に使っていきたいです。

参考: