spiffieldLabs
AS3のTimerのズレ
- 2011/12/19 16:08
- AS3
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した方がよいのかもしれません。
ライブラリの選択中のアイテムをフレームに配分するJSFL
Flashで数字入りの画像をタイムラインに並べたい時に、一気に並べられたら便利だなーと思って作ってみた。
正確にはどっかにあるかなーと思って探してみたら、Kayacのブログが出てきたけれど、ファイルをDLできなかったので作ってみたという感じです。
/**
* 選択中のアイテムをフレームに分配
*/
var _doc = fl.getDocumentDOM();
var _timeline = _doc.getTimeline();
var _lib = _doc.library;
function main(){
fl.outputPanel.clear();
var selectedItems = _lib.getSelectedItems();
var numItem = selectedItems.length;
if(numItem == 0){
fl.trace('何も選択されていません');
}
else{
_timeline.convertToKeyframes(0, numItem);
fl.trace(numItem);
for(var i = 0; i < numItem; i++){
var item = selectedItems[i];
var name = item.name;
name.match(/[0-9]+/g);
var num = parseInt(RegExp.lastMatch);
if(selectedItems.length == 10 && num == 0){
num = 10;
}
setNumFrame(item, num);
}
fl.trace("処理が完了しました");
}
}
/**
* 指定したフレームに配置
*/
function setNumFrame(item, frame){
_timeline.currentFrame = frame - 1;
_doc.addItem({x:0, y:0},item);
_doc.selectNone();
_doc.selectAll();
var elem = _doc.selection[0];
var mat = elem.matrix;
mat.tx = 0;
mat.ty = 0;
elem.matrix = mat;
}
main();
使い方
- 空のムービークリップを作成、編集モードに入る
- ライブラリのアイテムを選択(ライブラリアイテムは数値があるものとする)
- コマンドを実行
数値がフレーム番号になります。中を見れば分かるかと思いますが、0~9の時のみ、0番は10フレーム目に置きます(数値を画像にしたとき用)。数字のないものはうまく配置できません。
使用の際はバックアップなど行ったほうが良いかと思います。あんまり多いとフリーズするかもしれません。50程度は問題なく動きました。(WinXP+CS5で確認)
参考
TitaniumMobile勉強中
- 2011/05/06 23:43
- Titanium | javascript
最近はFlashもやってはいるんですが、スマートフォンアプリの方に興味が移りつつあります。もちろん、Flashでも作れるんですが、Flashだったらまあ何とか今までの知識を使えるだろうということで、そうではない方法を試しています。今のところやってるのは、JavaとTitaniumMobileです。
- Titanium Mobile(公式)
- titanium-mobile-doc-ja(こちらからいろんな記事を見に行くといい感じです。)
JavaはAndroidの方だけなんですが、TitaniumMobileではiOSでもAndroidでも両方書き出せます。また、開発言語がJavaScriptなので、Web系プログラマには取っ付きやすい感じになってると思います。
ただ、このTitaniumMobile、結構癖があるみたいで、同じソースでAndroidアプリもiPhoneアプリもどっちもさくさく作れるぜーとは行かない様子。
というわけで、まだ完成したアプリなど1つもないのですが、詰まった(ている)ところを少しばかりまとめてみる。
試したのはTitaniumMobile1.6.2+TitaniumStudio(Preview)です。
倉庫番とTenorionを合わせたらどうなるか?
タイトルのようなものを、年末あたりに思いついたんですが、途中まで作って完成させていませんでした。
Tenorionは正確にはTENORI-ONと書く、ヤマハの電子楽器です。→詳しくはこちら
これをFlashで再現されたのがこのFlashで、SiONというライブラリを使って実装されています。
面白いですよね。
これを何かと合わせて別のものができないか、と考えたのがこちらになります。
倉庫番 + 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)。さすが。
- 検索
- フィード
- メタ情報