ActionScript3

2016年02月03日

swift


jsとphpとas3の野良webエンジニアがswiftについて勉強しているよ!で、デリゲートというのがなんの事がチンプンだったので、ここ数日色々テキストを色々読みまわしていました。その結果「ん?こういう事?」というのが見えたので、メモエントリー。ひょっとして間違ってるかもしれませんが、多分こういうことじゃないかなぁ。てか以外と普通の事?じゃない?これ。

どこ読んでもだいたい「デリゲートとは委譲するという意味です」みたいなこと書いてますが、これがjsなんかの発想と相性が悪い感じがします。例えばhtml+jsの場合、発想の手順は「divで箱を作って、idで名前付けて、jsで操作する」みたいな感じだと思います。

この発想の場合、divはあくまで無機能の箱なので、jsに何かを委譲するとは考えません。委譲するまでもなく、そもそもjsに全ての操作が託されています。

これがFlash/as3になると、発想が少し変わります。発想の手順は「ムービークリップシンボル(クラス)を作って、ステージに配置(インスタンス化)して、メインのタイムラインで操作する」となります。as2の場合は、配置したインスタンスにシンボル名という固有のidで命名して操作してましたが、as3になるとこの方法は一般的ではなくなり、インスタンス化したものを配列に記録したものを呼び出して操作したりしてました。懐かしい。

この発想は基本的にはhtml+jsと同じなのですが、ムービークリップシンボル自体に機能を持たせた場合、メインのタイムラインからその機能を「呼び出す」事ができるようになります。ここら辺がオブジェクト指向とかのキモだったように思うのですがあってるかな^^; とにかく、こうやってパーツを「ブラックボックス化」する事で、メインのタイムラインのソースコードがスッキリしたり、部品ごとの挙動が明快になったり、集団作業がしやすくなったりというメリットがありました。

違ったら恥ずかしいのですが、この「ブラックボックス化されているパーツを、メインのソースコードで操作する」という行為を、swiftでは「デリゲートを使って操作する」みたいに言っているように思います。flashの作業フローにデリゲートという言葉を無理やりねじ込んでみると、「インスタンスはデリゲートを使ってメインのタイムラインのソースコードで操作します」という言い方になるのかと思います。

js,as使いにとってデリゲートという言葉が難しいのは、今まで当たり前のように行っていた行為に名前がついちゃったため、なんかすごい事なのか?と思っちゃうせいじゃないかなーと思います。

もう一度Flashに戻って。Flashでは、as2まで「タイムラインアニメーションのパッケージ主体だったムービークリップ」が、as3で「コード主体のクラス」となった時に、ちょっとした発想の変換が必要でした。ステージに配置してただけの作業が「インスタンス化してステージの表示リストに追加する」みたいな言い方になったり。こういった経緯を踏まえると、as3の「インスタンス化したクラスの機能をメインのタイムラインから呼び出す」という作業の流れはむしろ自然だったため、その行為自体にデリゲートという名前がつく事は無かったのだと思います。

swiftでデリゲートという言葉が重要な意味を持つのは、swiftはflashでいう「コンポーネント」主体で設計されている言語だからなんだと思います。僕はflashではコンポーネントほとんど利用しなかったのですが、それは僕が行ったflash案件が「デザイナーさんが作ったグラフィカルなUIにアクションを追加する」という作業だったためで、これはflashエンジニアの多くが理解できるところだと思います。flash使ってた頃の僕にとってコンポーネントとは、「標準装備されてる便利なクラス(=便利だけどダサいからほとんど使うことはないムービークリップ)」みたいな認識でした。

しかしswiftに求められるのは多くの場合、「iPhoneらしいUIにサービスを落とし込む」作業で、必然的にiOS標準のUIパーツを使うことが多くなるため、コンポーネント(swiftではオブジェクトライブラリに表示されるパーツ)の出番が多くなります。そういった時に、「パーツそのものが複雑な機能を処理してて、勝手にいじられたらiPhoneぽいユーザー体験が得られなくなっちゃうから、ステージに配置したパーツそのものに個別の処理は書かないでね!viewControllerにデリゲートして、個別のことはそっちでやってね!」というメッセージを込めて、デリゲートという行為が重要視されているのだと思います。

ということで、ここまでの憶測があってるかはまだ不明なのですが、とりあえずこういう認識で勉強を進めようと思います。デリゲートにビビらない!outletはインスタンス!程度のノリで頑張ります。

16/2/3 8:50 追記
「ブラックボックス化されているパーツを、メインのソースコードで操作する」という行為は、どちらかというとoutlet/actionに関しての解釈に近いような気がしてきました。デリゲートはさらに積極的にブラックボックスを扱いたい時(FlashでいうdispatchEventしたい時に近いタイミング?)に必要になるものやもしれません。引き続き勉強します。

9:03 追記
outlet→インスタンス化
action→個別の処理(ボタン押したらXXXにジャンプする的な処理)
delegate→コンポーネントが発行するイベントを受け取るために必要な手続き(dispatchEvent的な...?)
こうか?

sarustar at 06:35|PermalinkComments(0)TrackBack(0)このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote

2015年10月27日

intensityshuttle


出来たのでメモ

トピック的には古いのかもだけど、Intensity Shuttleを購入するにあたって

・Macbook Airで使用できるのか?(USBの電力供給的にどうなのか)
・USBカメラ的に使えるのか?(Flash ActionscriptとかゆくゆくはopenFrameworksで使用したい)

という情報がネットで見つけられなかったので試してみました。結果出来ました。
Windowsでは認識出来ていません。USBホストコントローラとの相性とか?よく分かりません。

使用機材
・Macbook Air / 13-inch Mid 2012 / OSX Yosemite 10.10.5
・Blackmagic Design Intensity Shuttle for USB3.0(Macとは付属ケーブルで接続)
・BlueRigger イーサネット対応ハイスピードHDMI ケーブル 7.6m →
コチラ
 (ケーブル長ごとに在庫があったりなかったりするようです)
・ainex HDMI変換ケーブル AMC-MHD 15cm
・Sony α7 (ILCE-7)

手順
→機材を用意
Blackmagic Design ホームページ → サポート → 商品名検索 → 左下よりDesktop Video対応OS最新版をダウンロード
 (2015.10.27現在でver10.5)
→インストール後再起動(色々インストールされます)
→カメラのhdmi出力を1080iに設定
→カメラ接続後、デバイスドライバ?自動アップデート
→Blackmagic Desktop Video Utilityを起動して接続確認 → 設定アイコンより 1080i 59.94 を選択
→Blackmagic Media Express起動
→Media Express → Preference → Project Video Formatより 1080i 59.94 を選択
→Log and Captureタブをクリック
→カメラからの映像が来てればOK

→Flashでカメラテスト(swf上で右クリック→カメラ選択→Intensity Shuttle選択)


以上です。その他試したことは、

・Macbook Proで接続 → 出来た
・Photoboothで接続 → 出来た
・Premiere Pro CC でキャプチャ → 出来なかった。
 デバイスコントロールにはちゃんと表示されてるけど信号が来ない。ちゃんと調べたら出来るかも?
・swfで接続できてるので、割とふつーにUSBカメラとして認識されてるのではなかろうか。

という感じです。接続に関してはBlackmagicDesignのサポートに電話してポイントを聞きました。
技術に強いよ!って感じの声の男性がテキパキ教えて下さいました。ありがとうございました。

sarustar at 15:11|PermalinkComments(0)TrackBack(0)このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote

2013年03月13日

airflash
完成間近のAIRアプリなんだけど実機テストしたらメモリ使用量が増加し続けてまともに動かない助けて!という依頼を受けて、傭兵やりました。社会人になって最初の大きなミスが、Flash Liteのメモリ使用量を無視して作ってて、多くの端末で画面真っ赤、俺(と社長)真っ青。ってやつだったので、とても人ごととは思えません。幸い今はStatsという素晴らしいモノがあるので、あの頃の自分を救うという意味でも、出来るだけスマートに作業したい所。

調べたところ、イベント割当や変数代入といった参照を消したBitmapDataをdispose()する事で、メモリの解放を促せる(ガベージコレクト対象になる)という事のようです。bitmapをremoveするだけじゃ解放されないって事です。問題の.flaファイルは山ほどのBitmapをタイムライン上でステージに配置&トゥイーン、ASは各階層の各キーフレームに書いてあるといった状態だったので、まずはASをルートに整理して、全体の見通しを良くしました。これはぜひやった方が良いと思います。全部整理は出来なくても、出来る限りやった方が良いです。

で、disposeについて。AS整理してaddEventListenerとremoveEventListenerを一括管理するようにしたので、イベント割当は確実に消せているはずです。それが出来たら、ステージに配置したBitmapにASからアクセス出来れば、基本的にはASの修正だけで済むんじゃないかなと考えました。で、以下の感じ。手元にファイルが無いので、考え方のイメージだけ持ってもらえれば。事前作業として、ライブラリに格納してあるbitmapのプロパティで、ActionScriptに書き出し、1フレーム目に書き出し、基本クラス→flash.display.BitmapData にして下さい。これをせずにステージに配置したBitmapはShapeに分解されちゃうようです。


var bitmapArr:Array=[];

addEventListener(Event.ADDED,pickupBitmap()); //ステージに配置されたらイベント

function pickupBitmap(e){
if(e.target is Bitmap){
bitmapArr.push(e.target); //bitmapだったら配列に追加
};
};

// 適当なタイミングで以下を呼び出す
function disposeBitmapData(e){
for (var i:String in bitmapArr) {
bitmapArr[i].bitmapData.dispose(); //bitmapの中のbitmapDataにアクセス
bitmapArr[i]=null; //念のため
}
bitmapArr=[]; //disposeが終わったら配列初期化
};

※タイムラインにキーフレーム打って配置 = addChild();
 そのレイヤーにキーフレーム打って削除、空白レイヤーにする = removeChild();
になるようなので、disposeする前に空っぽなフレームに飛ばすか、キーフレーム打って空白にする必要があります。

ポイントは、タイムラインに縦横無尽に配置されているBitmapを軒並み拾うために、ADDEDイベントを使う事です。そこまでに配置したbitmapを全部解放対象にしちゃうので、disposeのタイミングは注意して下さい。AIRの場合はSystem.gc();で強制的にガベージコレクタ起動出来る様ですが、基本的にタイミングはシステム任せで、大きなきっかけの時のみ呼ぶようにしました。今一ガベージコレクタって、挙動が安定しないというか、使い勝手が微妙に悪いような...弱参照とか、曖昧で信用ならんし。

タイムラインに配置したインスタンスをASで操作するとか、goto文やキーフレーム、シンボル名とイベント処理を並列させるとかなるべくやりたくないですが、とはいえFlashの柔軟なタイムラインは使いどころ間違えなければ強力ですので、毛嫌いせず柔軟に対応出来たら良いのかなと思いました。

sarustar at 02:03|PermalinkComments(0)TrackBack(0)このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote

2012年03月20日

sphere01
↑クリックでサンプル見れます。

Papervision3DでPlaneを球状に配置する方法を試してみました。三角関数使うのかと思ってたけど、Sphereの頂点を取れば簡単に出来る様子。手順としては、まず頂点取得用のSphere(球体)を作って、for文でpositionSphere.geometry.vertices[i].x,y,zを取得すれば良い様です。参考にしたのはコチラ。Papervision3D(PV3D)で plane の球体配置

今回やりたかったのは、
1.枚数不定のPlaneを
2.球状に順不同で配置して、
3.球体ぽくなるようPlaneを傾けて、
4.各PlaneをクリックするとそのPlaneを中央表示するようにカメラが移動する
という動き。

上記のBlogにあるように、Planeの傾きを実装する時にエラーがでます。「配列の一番目のPlaneが消えてしまいました」とありますが、試したところ、球体の底に配置したPlaneが消え、球体の天に配置したPlaneを中央表示するようカメラを移動させると、なぜか全Planeが消えてしまいました。またボタンを仕込んでみると、底のPlaneはなぜか背景に透明で存在しているような、不思議な挙動をしました。カメラが軸上にくると向きがおかしくなるとか、そういう感じのエラーなのかな?と思います。せっかくLookAt関数があるのだから使いたいので、底と天の頂点にはPlaneを配置しない方向でいくことにしました。

ということでソース。そのままコピペしてるだけなのでみっともないです。あしからず。別途マテリアル用のMovieClip(CARDクラス)と、このBGインスタンスを配置するMainクラス、Papervision3DとKTween、配列のシャッフル用にExArray.asが必要です。

package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.MouseEvent;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.MovieMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;
import net.kawa.tween.KTween;
import net.kawa.tween.easing.*;
import net.kawa.tween.KTJob;

/**
* ...
* @author sarustar
*/
public class BG extends BasicView
{
private var cardArr:Array = [];
private var cardNum:int = 150;
private var hankei:int = 1500; //円半径
private var positionSphere:Sphere;
private var cameraSphere:Sphere;
private var shufflePositionArr:Array;

public function BG()
{
trace("BG");
super(640, 480, true, true);
camera.fov = 45;
test();
function test()
{
for (var i:int = 0; i < cardNum; i++)
{
var cardMC:MovieClip = new MovieClip();
var crd:CARD = new CARD(cardMC, i);
var cardMaterial:MovieMaterial = new MovieMaterial(cardMC, true, true, true);
cardMaterial.interactive = true;
cardMaterial.doubleSided = true;
var myCard:Plane = new Plane(cardMaterial, 320, 180, 1, 1);
myCard.extra = i;
scene.addChild(myCard);
cardArr.push(myCard);
if (i == cardNum - 1)
{
positionSetting();
startRendering();
}
myCard.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, function(e:InteractiveScene3DEvent) {
trace("CLICK", e.target.extra);
cameraMove(e.target.extra);
});
myCard.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, function(e:InteractiveScene3DEvent) {
trace("OVER", e.target.extra);
});
}
}
}

public function positionSetting()
{
//(n*(n-1))+2
var seg:int = 3;
if (cardNum >= 3)
{
while ((seg * (seg - 1)) + 2 < cardNum+2)
{
trace("seg",seg);
seg++;
}
}
var positionArr:Array = [];
for (var j:int; j < (seg * (seg - 1) + 2)-2; j++)
{
positionArr.push(j+1);
}
shufflePositionArr = ExArray.shuffle(positionArr);
trace("shufflePositionArr : " + shufflePositionArr,"length",shufflePositionArr.length);
positionSphere = new Sphere(null, hankei, seg, seg);
cameraSphere = new Sphere(null, hankei + camera.focus*camera.zoom, seg, seg);
trace("seg", seg, "頂点", positionSphere.geometry.vertices.length);
for (var i:int = 0; i < cardNum; i++)
{
cardArr[i].x = positionSphere.geometry.vertices[shufflePositionArr[i]].x;
cardArr[i].y = positionSphere.geometry.vertices[shufflePositionArr[i]].y;
cardArr[i].z = positionSphere.geometry.vertices[shufflePositionArr[i]].z;
(cardArr[i] as Plane).lookAt(DisplayObject3D.ZERO);
}
}
public function cameraMove(targetID:int) {
trace("cameraMove.targetID", targetID);
var targetX:int = cameraSphere.geometry.vertices[shufflePositionArr[targetID]].x;
var targetY:int = cameraSphere.geometry.vertices[shufflePositionArr[targetID]].y;
var targetZ:int = cameraSphere.geometry.vertices[shufflePositionArr[targetID]].z;
var cameraTweenJob:KTJob = KTween.to(camera, 2, { x:targetX, y:targetY, z:targetZ }, Quad.easeOut);
}
}
}

32行目、42行目で、Planeのクリックを有効にしています。
43行目で、Planeの裏面を表示できるようにします。
34行目から61行目までで、配置用のPlaneを作って配列に収めています。その際extraにID番号を格納します。
68行目から75行目で、カードの増減に対応しています。
77行目から80行目で、天、底の頂点を除外しています。
83行目、SphereのW,Hの分割数は、計算をシンプルにするためsegで統一しました。頂点の数は、(seg*(seg-1))+2で算出できます。
84行目、カメラの位置決め用に、一回り大きいSphereを作成しました。Plane配置用の球体の半径+(camera.focus*camera.zoom)で、カメラを常に原点(Sphereの中心)に向けておけば、Planeを等倍表示できます。
91行目、lookAtです。

自作アプリに使おうと思ってここまでやってみたのですが、動き見てみたらあまり今回のアプリ向きじゃなかったので^^;これ以上は作らないかなーと思います。もしさらにやるなら、カードの枚数によって球体の半径を変えるように出来たら良いかなと。もしくは重ならないように各Planeのサイズ変えるか…メンドクサソウダナー

sarustar at 15:38|PermalinkComments(0)TrackBack(0)このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote

2011年11月29日

screenshot
↑「それHTML5で出来るよ」とそそのかされた照英が泣きながらFlashで実装し直す様子

GIZMODOの「
もうとっとと世の中からFlashなんて消え去ればいい...の声を上げるキャンペーンが始動中」って記事について。HTML5 vs Flashの争いは、Web技術者、特にFlash使いの間では1年ほど前に語りつくされてるトピックなので、「それぞれ得意、不得意があるので、どっちも必要」でFAだと思っていたのだけどナー、という印象であります。余裕のよっちゃんおならプーです。

…なんてね。虚勢ですよ。実際は戦々恐々。もちろんFlashとHTML5の共存は可能でしょうが、Flashプレイヤーのシェアが仮に70%程度まで落ち込んだら、とたんにFlashの魅力は失われます。そうなってしまえば後はあっという間。かつてFlashがShockwaveを追い落としたように、いつ自分たちが過去の技術認定されるかビクビクしつつも、「でもActionScript3はJavaScriptと似てるから、最悪なんとかなるだろう…」なんて自分を奮い立たせ、ある者はJS,HTML5,CSS3の勉強をし、またある者はAIRに活路を見出したりして、コツコツとFlashのスキルを磨いている。それが、多くのFlash使いの現状ではないでしょうか。少なくとも僕はそうです。AIR楽しいですし。

Flashが今やちょっとした問題性のある技術であることに、異論はありません。僕はChromeをメインブラウザとして利用していますが、Flashが原因でタブがクラッシュすることは割と多いです。月2,3回はあるかな。またActionScript自体、JavaScriptに比べると動作は遅いと言われているようです。またこれまでFlashが担ってきた役割が、HTML5やJSで代替可能になってきたのも事実です。

今Flash不要論が盛り上がるというのは、やはりiPhoneへのFlash非搭載宣言と、Adobeがモバイル向けFlashプレイヤーのサポートを打ち切る発表をしたためだと思います。まぁ後者は、スマホのスペックも今後上がってくるので、普通のFlashプレイヤーで対応できると見越しての事…だと良いなーと思っているのですが。こういった状況の背景に、スマホの隆盛とPCの凋落、つまり「ふつーの人にとってインターネットってこの程度でいいよね」って空気があることも重要です。そんな事ないんだけどなぁ。大画面でのインターネットってめっちゃ楽しいんだけどなぁ。

で。

Flash不要を謳う方たちの殺し文句として、「それ、HTML5でも出来るよ!」ってのがあります。映像だったり、インタラクティブな操作感だったり。また、「Flashに出来てHTML5に出来ないこと、その逆」とかもよく語られます。ただ僕は、そういうのは、Flashの重要性のせいぜい半分じゃないかなーと思ったりもしています。

では、残りの半分は何か。それはFlashプレイヤーです。非常に高い普及率を誇り、下位互換性もバッチリ。OS、ブラウザに依存することもほとんど無く、ActionScriptさえ覚えれば容易に様々な事ができます。(HTML5でも出来るよってのは、実際にはHTML5とCSS3とjQueryとPHPで出来るよ!って意味だったりするのでorz) そしてなにより、Flashプレイヤーは「Adobeがほぼ単独で、仕様を決められる」というメリットがあります。僕はこれが、Flash最大の強みじゃないかなーと思っています。

考えてみてください。Flashプレイヤーがflvを導入したのが2003年。それからHTML5がマルチメディア関連タグを策定するのに、実に5年以上の年月が経っています。なぜなら、ブラウザは様々なデベロッパがリリースしているため、標準化にW3Cという合議制の業界団体が中心とならざるを得ないからです。ココらへん、以前書いたAppleとMicrosoftの関係に似ているかもしれません。たくさんの企業、団体の思惑を汲み取らねばならないW3Cの歩みは、どうしたって遅くなります。汎用的なOSでなければならないWindowsの様なものです。

またそうやってW3Cによって策定された標準仕様も、ブラウザによって挙動がマチマチだったりします。や、動けばまだいい方ですね。ブラウザ開発の手法自体が先進化しているので、IE vs Netscapeのような泥仕合はもう無いだろうと期待はしますが、現に今だって「このタグはChromeとFirefoxでは動くけどIEとSleipnirとOperaでは動きません」みたいな事がザラにあります。自分の作ったWebページがクライアントのPCで正しく表示されずに焦った経験の無いWebデザイナーはいないんじゃないでしょうか。

その点、FlashはAdobe様がサクっと仕様を決定できます。AppleがOSXを発表したように、AdobeがActionScript3を発表した時、泣いたFlash使いは多いでしょう。しかしその恩恵は多大なものでした。暴君がいなければ、新しい未来は開かれません。そしてコンピューター史におけるAppleがまさに暴君であったように、インターネット内でFlashは、強引に次のインターネット体験を提案する暴君だったのです。

暴君が切り開いた荒野を民衆が地ならしし、やがてかつての英雄に対して「クソみたいな王を引きずり下ろせ!」と叫ぶのは、歴史で何度も何度も繰り返されてきたことです。暴君は荒野が無ければ君臨できないのです。アイシールド21でドンは、「王者は定期的に虎を殺してみせねばならない」と言いましたが、まさにアレです。今インターネットでは、W3Cが長い長い合議の果てに、やっと次の数年を支える技術の標準化に漕ぎ着けました。Adobeが開拓した荒野を舗装することに成功したのです。

Flashが死んだ時、では、その次の数年はどうなるのでしょうか?今インターネットは、Appleの功績で「モバイル」分野に、豊かな荒野が発見されました。今から数年はその荒野の開拓がなされるでしょう。でも、その次は?3D、AR、そして今後出てくる新しいテクノロジーは、モバイル端末の狭いウィンドウでしか生きられないのでしょうか。クリエイターは、その作業の半分をブラウザ毎の挙動の調整に費やし続けねばならないのでしょうか。僕はそれは、ちょっと貧しい未来だと思います。

Flashができること。Flashだからできること。それは、映像やリッチなインターフェースではなく、スピーディーにWebの次を模索していくことです。Flashにとって辛い時期が続くかもしれませんが、今後のFlashにも、僕は期待したいと思います。(AIRの勉強もするけどね!)

sarustar at 03:27|PermalinkComments(2)TrackBack(0)このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote

2011年11月07日

airflash

これまで無駄にコードが長くなる気がして使った事なかったんだけど、set/getがやたら便利ということが分かったのでメモ。調べた中ではここが分かりやすかった。

自堕落なぺぇじ Setter/Getterについて
http://d.hatena.ne.jp/corrupt/20110613/1307924410

ここに書いてあること以外だと、「変数の変化をトリガーに出来る」(って言い方でいいのかな?)のが大変便利。「処理をしたらこの変数を入れ替える」だと、うっかり別ルートで変数の中身入れ替えたりしちゃって、「なんでこうなるの?」って事がちょいちょいあったんだけど、setter内に処理を書くことで、「この変数が変化したらこの処理実行」ってことができる。変数の監視が出来るというか。stage.addEventListener(Event.EnterFrame,func)で変数変化を常時監視とかスマートじゃないから、この方法はとても良い気がする。推奨されてなかったりするのかな。当然dispatchEventと組み合わせることも出来るので、子クラスの変数が変化したことを親クラスで感知することも出来る。すばらしい。

もちろんint以外の変数の場合も使えるので、こんな感じでMovieClipにsetter設置することも可。

private var _TARGET_MC:MovieClip;
public function set TARGET_MC(movieclip:MovieClip):void{
_TARGET_MC.visible=false;//現在_TARGET_MCに格納されてるMovieClipを消して
_TARGET_MC=movieclip;//新しく_TARGET_MCにMovieClip格納して
_TARGET_MC.x=stage.stageWidth/2;//移動
_TARGET_MC.y=stage.stageHeight/2;
}

とか。変数は常に一個しか値格納しないので、処理が重複することがない。便利。ただsetterを高機能にすることが推奨されてるかは不明。別に問題ない気はするけどどど。switch文とか入れて、格納された値によって処理振り分けたりしたら、読みやすいコードが書ける気がする。うーむ。

sarustar at 17:48|PermalinkComments(0)TrackBack(0)このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote

2011年11月05日

airflash

ショートカットの作成は、stage.addEventListener(KeyBoardEvent.KEY_DOWN,keyDownFunc)でキーを押した時のイベントを取得できるので、あとは押されたキーによって動作内容を振り分ければOKです。振り分けなのでswitch..caseを使います。

押されたキー内容は、keyCodeで数値として取得できます。aなら65、backspaceなら8、といった具合です。数値をいちいち調べるのは面倒なので、オブジェクトに格納しておくと便利です。


private static const SC:Object = {n0: 48, n1: 49, n2: 50, n3: 51, n4: 52, n5: 53, n6: 54, n7: 55, n8: 56, n9: 57, t0: 96, t1: 97, t2: 98, t3: 99, t4: 100, t5: 101, t6: 102, t7: 103, t8: 104, t9: 105, a: 65, b: 66, c: 67, d: 68, e: 69, f: 70, g: 71, h: 72, i: 73, j: 74, k: 75, l: 76, m: 77, n: 78, o: 79, p: 80, q: 81, r: 82, s: 83, t: 84, u: 85, v: 86, w: 87, x: 88, y: 89, z: 90, tab: 9, enter: 13, backspace: 8, left: 37, up: 38, right: 39, down: 40};

こんな感じで利用します。

stage.addEventListener(KeyBoardEvent.KEY_DOWN,function(e:KeyBoardEvent){if(e.ctrlKey==true){
switch(e.keyCode){
case SC.s:
e.shiftKey?dataExport():dataSave();//shiftKeyの有無で動作を振り分ける
break;
case SC.n1://breakせず、t1と同じ処理をさせる
case SC.t1://テンキーの1を押した場合
trace("1をプッシュしました");
break;
}
}
});


作り直し進行中ですが、車輪の再発明しまくってます。自分で作ったクラスなのに、再利用できるものが少ない… 再利用できたものと出来なかったものを比べて、良いクラスの作り方について考えたりしています。再利用しやすいのはやっぱり、「データを渡せば結果を返してくれるだけのクラス」でした。一方通行のクラスというか。使いにくいのは、ムービークリップと関連付けるような、多機能なクラスですね。ブラックボックス化する事を原則として考えればいいのかなーとか思っています。

理想は、複雑なクラスをなるべく単機能なクラス群として構成する事なんでしょうが、なかなか難しいです。また処理の振り分けのタイミングも、考える必要があるなぁと思います。振り分けてからデータ渡すのがいいのか、データ渡してから振り分けるのが良いのか。これはきっとケースバイケースなので、都度原則に立ち返って、シンプルなソースを書きたいところです。

sarustar at 03:37|PermalinkComments(2)TrackBack(0)このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote

2011年11月01日

airflash

環境
FlashCS5.5 Professional
FlashDevelop 4.0.0 Beta

第一回という事で、AIRアプリ制作をする際にまずしなければいけない事をまとめておこうと思います。FlashDevelopとFlexSDKとか使うとか、この環境でも他に色々やり方あるようですが、とりあえず僕がやってる手順です。

  1. ディレクトリ作成
    アプリ名-バージョン推奨 ex: ./stcBoard/1.0/

  2. FlashDevelopで新規プロジェクト作成
    ActionScript3-AS3 Project (src,lib,binディレクトリ作成)

  3. flaファイル作成 Flash-ファイル-新規-AIR
    クラス Main
    ファイル-ActionScript3.0設定-ソースパスに、上記srcディレクトリ追加
    ファイル-ActionScript3.0設定-ライブラリパスに、上記libディレクトリ追加

  4. libディレクトリにAIR用ライブラリをコピー
    ./Adobe Flash CS5.5/Common/Configuration/ActionScript 3.0/AIR2.6/airglobal.swc
    ※これやらないと、NativeApplicationとかInvokeEventとかFileStreamとかインポートできません
    ※2012.1.12 追記
     TouchEvent、Multitouchもこれでインポートできます

  5. FlashDevelopのプロジェクトウィンドウのlibを開いて、airglobal.swcをライブラリに追加
    プロジェクト-プロジェクト設定-書き出し でプレーヤーをAIRに、コンパイルターゲットを他のIDEにする
    ※こうしておけば、.flaを開いてる状態なら、FlashDevelopからCtrl+Enterでプレビューできます。
    ※ツールバーの「デバッグ」を「リリース」にすると、.airを書き出さないのでコンパイルが早いです

セッティングはこんな感じです。3.でドキュメントクラスをMainにしているので、FlashDevelopでMainをいじくれば機能してくれます。InvokeEventってのは、アプリなら必須の「ファイルをダブルクリックしたら自動でアプリが立ち上がる機能」を実現するイベントで、NativeApplicationとあわせて使います。

import flash.desktop.NativeApplication;
import flash.events.InvokeEvent;

var nativeApp:NativeApplication=NativeApplication.nativeApplication;
nativeApp.addEventListener(InvokeEvent.INVOKE,function(e){
switch(e.arguments.length){
case 0:
//普通にアプリアイコンクリックで開いた場合
break;
case 1:
//関連付けた拡張子のファイルをダブルクリックで開いた場合
trace(e.arguments[0]);//開いたファイルのパス
break;
}
});
って感じです。FileStreamクラスはFileクラスと併せて使うことで、データの保存や読み込みをする事ができます。XMLの書出しなど、FileStreamクラスを使わなくても可能なのですが、FileStreamクラスだと「書出し」ではなく「上書き」が出来るようです。アプリなら欲しい機能です。

つい最近自作した
stcBoardというアプリですが、初AIRでメンテナンスのことを考える余裕がなく、脳汁ダダ漏れでグイグイ作ったので、今後を考えて一から作り直すことにしました。初回作ったときに比べて圧倒的にしんどいですw 頑張って仕上げて、機能追加に移行したいと思います。

sarustar at 18:03|PermalinkComments(0)TrackBack(0)このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote

2011年10月25日

SAVE THE CATの法則 本当に売れる脚本術

みんな大好きフィルムアート社から、ちょうど一年ほど前に「SAVE THE CATの法則」という脚本術の本が出版されました。で、最近読んでみたんですが、第五章の「完璧なボードを作る」で紹介されているアイディアボードの作成方法がだいぶ具体的で良かったので、デスクトップアプリにしてみました。ポストイットを壁にペタペタ貼って、「んーこのシーンはもうちょい後のほうが良いかなー」とかやるのを、デスクトップで行うことができます。なんでもパソコンでやりたい人、デスクトップでもノートでもボードを確認したい人、壁がポスターで埋まってるプヲタ、シネフィル、ビレバン厨の方どうぞ。

stcBoard >>説明ページ
screenshot


やーにしてもAIRアプリ制作楽しいね!swfじゃ出来なかった事が色々出来るし、俺ツエーwwwが味わえる。しかもswf作るのと同じ環境で作れるってのが素晴らしい。これはクセになりそうです。

sarustar at 08:02|PermalinkComments(0)TrackBack(0)このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote