[AS][?]画像のEmbedは1回しか使えない?

よくわからんけど、他のクラスでEmbed済みの画像を別のクラスでEmbedしても表示もされなかった。
エラーも出ないから、かなりはまった。
とりあえず、あとで検証する。

[Android]Androidアプリ「RealCircle」リリース

以前wonderflに投稿した一筆書きで描いた真円度を競うゲームをAndroidアプリとしてリリースされました。

RealCircle
OS2.2以上です。

FlashからAndroidへの移植&リリース作業をしてくれたのはボクではなく、 daoki2 さん。
daoki2さんのTwitter
daoki2さんのBlog
移植の際に、スコア共有機能も実装してくれたので全世界で誰が一番正円をかけるかを競えます!

OS2.2以上のアンドロイド持ってるかたは試してみてくださいませ。(有料ですが)
ちなみにボクはAndroidの端末持ってないため遊べず・・・、端末欲しいなぁ。

[iPhone]Packager for iPhoneで書き出したipaファイルを実機転送すると署名が有効ではないと怒られる場合

FlashCS5の目玉機能iPhoneアプリの書き出し。
これの実機転送ができずに半年くらい途方にくれてましたが本日ようやく解決。

Windowsじゃできないんじゃないとの疑惑さえ沸いてましたがなんてことはなく、手順が悪かっただけでした。
ちなみに実機への転送は、Appleのデベロッパー登録が必要です。
(年間10800円 )

やり方はAdobeの提供してるPDFファイルを読めばできるはずなのだけども、ボクのケースでは一箇所だけ書いてある手順でできなくて、そこで勘違いしてずーっとハマってました。

ハマった項目、それは開発証明書ファイル( 拡張子 .p12 ) の設定です。
上記PDFには、

Mac OS での iPhone 開発用証明書の P12 ファイルへの変換
Apple iPhone 証明書を Apple からダウンロードしたら、P12 証明書形式に書き出します。Mac® OS でこれを行う手順は次
のとおりです。
1 アプリケーション/ ユーティリティフォルダー内にあるキーチェーンアクセスアプリケーションを開きます。
2 証明書をキーチェーンにまだ追加していない場合は、ファイル/読み込みを選択します。次に、Apple から取得した証
明書ファイル(.cer ファイル)に移動します。
3 キーチェーンアクセスの「分類」で「鍵」を選択します。
4 使用している iPhone 開発用証明書に関連付けられている秘密鍵を選択します。
秘密鍵は、ペアになっている iPhone Developer: [ 名] [ 姓] 公開証明書によって識別されます。
5 ファイル/書き出すを選択します。

6 .p12(Personal Information Exchange)ファイル形式で鍵を保存します。
7 この鍵を別のコンピューターに読み込むときに使用するパスワードを作成するよう指示があります。

とありますが、僕のmacの環境にはこれがありませんでした。
( iPhone Distribution しかない。。)

仕方ないので、 iPhone Distributionの証明書を書き出して、それを使ってFlashCS5でiPhoneアプリ形式での書き出しを行ったわけです。
これはエラーもなく、ipa形式のファイルを作ってくれます。
が、正規の手順どおりにiTunesから実機に同期しようとすると、つぎのようなエラーがでるのです。
署名者が有効でないため ~ インストールできませんでした。

わけわからんですよ。
そこでAdobeの指示は無視して、keychainの分類で、ではなく、証明書の項目を見てみます。
するとiPhone Developperというそれっぽい項目がありました。

結論としては、ここでの証明書の項目(上記画像で選択されている部分)を.p12形式で書き出せば上手くいきます。

・・・ここでは罠があります。
秘密鍵の項目(上記画像で選択されている部分の一つしたの部分 )を.p12形式で書き出すこともできるのです。
この.p12ファイルを使っても、FlashCS5からはipa形式のファイルを書き出すことができます。
が、iTunesの同期で上に書いたようなエラーがでるのです。
(これでずーっとはまってた)

結論としては、書き出すファイルは、秘密鍵ではなく、証明書なんですよね。
AdobeのPDFではそのへんが明確に書いてないのでよくわからんのですよ。

でも、ググっても困ってる人の情報はぜんぜんないのですよね・・・
皆一発でできてるのかしら・・・
単に私がアンポンタンなだけなのかしら・・・
とにかく、この記事が同じ悩みがある人の助けになれれば幸いです。

P.S.
そして、書き出したアプリは予想以上に重かったw

[ETC]ビデオコーデック:CUVCのaviファイルをAdobeMediaEncorderでエンコードしようとするとファイルが壊れていると怒られるときの対処方法

30分くらいはまってTwitterで偉い人から教えてもらえたのでメモメモ

まずそもそもaviファイル(動画ファイル)が再生できないことが多々ある。
VLCでは全く再生できず、WindowsMediaPlayerだと音は流れるけど絵がでない。
これは録画されたときのビデオコーデックが自分のPCに対応してないからだそうです。
というわけで、該当のファイルにあったビデオコーデックをインストールすればいいのですけど、世の中にはコーデックはたくさんあるようで、わけがわからんのです、はい。

まず対象のファイルのコーデックを知る必要があるのですけど、そこで役にたったのがこの記事。
ぶっ壊れて再生できないAVIファイルを修復して再生可能にするフリーソフト「DivFix++」

再生できない状態のままでもAdobeMediaEncorderでエンコードできればいいや、と試してみたら、「ファイルが壊れています」と怒られたのでまずはこれを試したのでした。
(これを試しても再生できないのは変わらずで、ファイルが壊れていますといわれる)
ただし、これを使うと途中でコーデックの識別情報が表示されます。
これでコーデックの種類がわかるので、なにをインストールすればいいのかがわかる。
(このソフトはDLしてzip解凍するだけで使えるからレジストリ汚さないっぽい)

で、今回の場合は、CUVCというコーデックでした。
このコーデックはTwitterできいた情報だとなんか多いらしい。
そしてこれに対応するには、これをPCにインストールすればOK。
Canopus Codec Option(無償版

DLしたファイルをダブルクリックすると、Cドライブ直下にセットアップ用のファイルの入ったフォルダが作られるので、その中の、setup.exeを実行すればインストールされます。
インストール後は再起動を促されるので、再起動してから、再生できなかったaviファイルをWindowsMediaPlayerで再生してみると、ちゃんと絵が表示されます。
(VLCではこれいれてもダメっぽいです)
そして、Adobe Media Encorderでも怒られずに開くことができるようになります。
ありがたやありがたや

[Event][AS] Airアプリ「Twittenorion」

先日、東京てらこ 9に参加してきました。
Twitterで何かつくろうってテーマだったのAirアプリを作ってみました。

「Twittenorion」

タイトルどおりTweetのテキストでテノリオンするという感じです。
SEARCH WORDを入力しSEARCHボタンを押すと、入力してワードでのTwitterで検索を行い結果の20件をランダムで順番に表示さいていきます。
DRUM KITのON/OFFの際にはドラムパターンがランダムに変更されます。
BPMにあわせて流れる文字の速度が変化します。
集中したいときの作業用BGMになるかなってつもりで作りました。
 
以下からDLできますので、気になった人は試してみてくださいませ。
DownLoad : Twittenorion
 
 

またてらこでの発表資料のスライドもアップしておきます。
東京てらこ vol.9 発表資料
(キーボードのカーソルキーでスライドの操作ができます)
 
 

・キーボードから任意の文字を入力できるようにしたものをwonderflにアップしました。

Twittenorion – wonderfl build flash online

 
 

[AS]FocusManagerインスタンスを生成した状態で、InteractiveObjectのtabEnabledをfalse > trueに切り替えると、focusRectが利かなくなる

タイトルどおりの挙動に出くわした。

以下、再現する環境
メインタイムラインには、ボタンインスタンスとテキストフィールド(Input状態)が配置してあるとする。
ボタンインスタンスのインスタンス名:_btn

import fl.managers.FocusManager;
var focusManager:FocusManager = new FocusManager(this);
_btn.tabEnabled = false;
_btn.tabEnabled = true;

これで、パブリッシュし、Tabキーを押すと、テキストフィールドのカーソルからフォーカスは移動していることがわかるが、ボタンにフォーカスがあたっている状態で、黄色の枠が表示されない。
ちなみに、
var focusManager:FocusManager = new FocusManager(this);
この一文がなければ、黄色の枠は表示される。

黄色枠を表示させたい場合は明示的にfocusRectをtrueにしてあげればOK。
なんか面倒だ。

import fl.managers.FocusManager;
var focusManager:FocusManager = new FocusManager(this);
_btn.tabEnabled = false;
_btn.tabEnabled = true;
//これで_btnがフォーカス時に黄色枠が表示される
_btn.focusRect = true;

[AS]コンテンツ内のTabキーでのフォーカス移動を無効にする。

Tabキー対応は本気でやると結構面倒なので、いっそ全部無効にしてしまった方がいいかも.
素敵サイトもTabキーでバグること多々あり・・・

//これでひとまず全部無効(多分)
stage.stageFocusRect = false;

ただし個別のオブジェクトでfocusRectをtrueしてる場合は個別対応が必要

以下、InteractiveObject.focusRectプロパティ引用

このオブジェクトがフォーカス矩形を表示するかどうかを指定します。true、false または null の 3 つの値のいずれかを指定できます。true および false の値は、予想されるとおり、フォーカス矩形を表示するかどうかが指定されます。null 値は、このオブジェクトが Stage の stageFocusRect プロパティに従うことを示します。

[AS]内部にムービークリップを持つMCをgoAndStop()でMCが存在しないフレームへ移動したあとMCが存在するフレームに戻しても内部MCはnull参照になるみたい

タイトルが何言ってるかよくわからないと思うので、以下のフレームアクションを参照ください。

前提条件
//メインタイムラインにMovieClipインスタンス(インスタンス名:_mc1)を配置
//_mcの内部は全2フレームで、1フレーム目にフレームアクションstop();を記載
//_mcは内部の1フレーム目にのみ、MovieClipインスタンス(インスタンス名:_mc2)を持つ
//_mcの2フレーム目は何もない状態。

//ステージにMovieClipインスタンス(インスタンス名:_mc1)を配置
//_mcの内部は全2フレームで、1フレーム目にフレームアクションstop();を記載
//_mcは内部の1フレーム目にのみ、MovieClipインスタンス(インスタンス名:_mc2)を持つ
//_mcの2フレーム目は何もない状態。

trace("before _mc1:"+_mc1);
//出力:before _mc:[object Timeline_1]
trace("before _mc1._mc2:"+_mc1._mc2);
//出力:before _mc._btn:[object SimpleButton]

var mc:MovieClip = _mc1._mc2;
mc.buttonMode = true;

trace("before numChildren:"+_mc1.numChildren);
//出力:before numChildren:1
trace("before getChildAt:"+_mc1.getChildAt(_mc1.numChildren-1));
//出力:before getChildAt:[object MovieClip]

//_mcの2フレーム目に移動(_btnがないフレーム)
_mc1.gotoAndStop(2);
//_mcの1フレーム目に移動(_btnがあるフレーム)
_mc1.gotoAndStop(1);

trace("after _mc1:"+_mc1);
//出力:after _mc1:[object Timeline_1]
trace("after _mc1._mc2:"+_mc1._mc2);
//出力:after _mc1._mc2:null
trace("after mc:"+mc);
//出力:after mc:[object MovieClip]

trace("after numChildren:"+_mc1.numChildren);
//出力:after numChildren:1
trace("after getChildAt:"+_mc1.getChildAt(_mc1.numChildren-1));
//出力:after getChildAt:null

//nullでないmcが_mc2と同じと思いきや、そうでもない様子
mc.buttonMode = true;//マウスカーソルにならない

ちなみにこれはFlashPlayer9での書き出しの場合。
FlashPlayer10での書き出しの場合は、上記スクリプトのnullの部分が全部Mcとなる。
・・・が、元のMcを挿しているわけでは無いようで、最後のbuttonModeは適応されない。

だいぶAS3と戯れてきたと思ったはずなのに今始めてしった挙動。。。

Flash-JPに似たような内容の記事がありました。
http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=8525&forum=20

[AS]ステージに配置したRadioButtonコンポーネントをRadioButtonGroupに反映させる方法

ちょっとだけハマってしまったのでメモ。

FlashIDE上でRadioButtonをステージに配置して、プロパティのパラメータからgroupNameを設定。
groupNameからRadioButtonGroupインスタンスを作りたい。

◆前提条件
ステージにラジオボタンを配置
プロパティgroupNameには、hogeという名前を設定

◆失敗例

var radioButtonGroup:RadioButtonGroup = new RadioButtonGroup("hoge");
trace(radioButtonGroup.numRadioButtons) //出力:0 (1と出て欲しい)

◆成功例

var radioButtonGroup:RadioButtonGroup = RadioButtonGroup.getGroup("hoge"); 
trace(radioButtonGroup.numRadioButtons) //出力:1 (想定どおり)

ステージに配置してあるRadioButtonのグループ名を取得するにはRadioButtonGroup.getGroup(“グループ名”)メソッドを使うってこと。
new RadioButtonGroup(“hoge”);は動的に生成したRadioButtonを紐付けたいときとかに使う、多分。

[iPhone]allocしてない変数はreleaseに注意

あるクラスでインスタンス変数でNSArrayを定義して、そのクラスインスタンスからNSArrayの変数にアクセスしようとするとKILLされるということがあった。
何がだめかといったら、allocしてないのに、releaseしてしまったということ。

以下、ダメだったコード。
UIViewを継承したHogeクラス

@synthesize hogeArray;
-(id)initWithFrame:(CGRect) frame {
    if ((self = [super initWithFrame:frame])) {
    }
    NSMutableArray* array = [NSMutableArray array];//←allocしてないから保持カウント増えてない
    [array addObject:@"hoge"];
   self.hogeArray = array;
    [array release];//←これがダメ
}

Hogeクラスを呼ぶUIViewを継承したFooクラス。

@synthesize hogehoge;
-(void)awakeFromNib{
   Hoge* hoge = [[Hoge alloc] initWithFrame:CGRectMake(0,0,10,10)];
   self.hogehoge = hoge;
    [hoge release];
    NSLog(@"hoge.arary : %@",hoge.hogeArray);//ここでは参照できる
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     NSLog(@"hoge.arary : %@",hoge.hogeArray);//ここでは参照できない
}

書籍のサンプルコードを眺めていた感じは、ローカル変数を作ってから、インスタンス変数に代入という流れが多かった。
ローカル変数をallocして初期化したときは、すぐにreleaseしてあげる流れだけど、allocしないで初期化するような場合は注意が必要なのね。