iPhoneaboutmemo.393個人的メモです。間違いなどありましたらご指摘ください。iOSにて、スクリーンショットをカメラロールに保存するANEを作ってみた、への追加メモです。結論から、iOS6では「スクリーンショットをカメラロールに保存するANE」は正常に機能しなくなりました。iOS(AIR3.4SDK)ではANE内でスクリーンショット(UIImageとして取得)することは無理じゃね?という結論に達しました。以下、無理じゃね?と思う理由が続きマス。(解決策わかる方がいました教えてください。)■Objective-Cでのスクリーンショットを取るコードをiOS6上で動かしてみる上記aneで使ったこちらのコード。Gameテンプレートを使用)でOpenGLで描画したもののキャプチャを取ってみようとしましたが、iOS6実機ではキャプチャが正常に取れません。(Xcodeのシミュレーター上では正常にキャプチャできるんですが、iOS6実機ではキャプチャ画像は真っ白になってしまう)※iOS5実機ではなんら問題なくキャプチャできます。あら、そもそもiOS6ではOpenGL描画のキャプチャができなくなったの?と思いましたが、そういうわけでもありません。■Apple公式のキャプチャ手順こちらにOpenGLの描画についてのキャプチャの取り方について記載されているのですが、やり方としては2種類あるようす。necessary.上記2通りのやり方を、まずはObjective-Cプロジェクトを使って実装してみると、どちらを使ってもではOpenGL描画のキャプチャは取れました。その2通りのどちらかをANE使って実装したらいいじゃん、ってことなんだけどこれがどうやっていいかわからず。以下、それぞれの無理じゃねって理由です。EAGLContext/-presentRenderbufferこれはglReadPixels()は、presentRenderbufferする前に呼んでね、ってことなんだと思います。glReadPixelsはスクリーンショットを取るときに呼ぶメソッドなので、presentRenderbuffer()を実行する前のタイミングでスクリーンショットを取る処理を実行するようにしたいわけですが、presentRenderbuffer()はOpenGL描画の更新毎に呼ぶメソッドっぽい。iOSでは描画更新処理というコアな部分の処理が具体的にどうなっているのかわからんのです。(LLVMが具体的にどのようにコンパイル(AS3→ObjC)してるのかわからんので)描画処理のコアな部分の処理をANEからオーバーライドなりして、修正することができればいけそうなんですけどね。いう実装になってるのかわからんのでできません。いうわけで1)の案はANEで実装する方法がわからず。necessary.これは、CAEAGLLayer.drawablePropertiesにkEAGLDrawablePropertyRetainedBacking:YESを突っ込め、と。するとパフォーマンス落ちるかもしれないから必要なときにだけYESにしてね、ということみたい。CAEAGLLayerはANEからでも取得できました。//UIWindowの下にCALayerがあってその下にCAEAGLLayerがありました。uv2.layer;CAEAGLLayerが取得できればdrawablePropertiesにkEAGLDrawablePropertyRetainedBacking:YESを上書きするところまではできるのだけど、drawablePropertiesを変更した際にはEAGLContext.renderbufferStorage:fromDrawableを実行しないと反映されない。これにはEAGLContextのインスタンスを取得しないとなのだけど、ここが無理っぽい。先ほどと同様でLLVM後のコアな部分の処理が具体的にどうなっているのかわからんのです。CAEAGLLayerをもつUIViewにEAGLContextは使われてると思うけど変数名がわからず、そもそも外部からアクセスできる変数かどうかもわからずです。iOSでは実装できないんじゃないかと思っているわけです。いうか、なんでiOS5ではできていたのかも謎です。buffer.iOS6のベータが出回ったころに追記されたとかなら、iOS6で仕様が変わったのだと納得がいくんですけども。これができないとiOSのTwitterAPIとかfacebookAPIのAPI使ってもアプリのキャプチャ画像添付ができないと思うんですよね。Flash側で画面をBitmapDataでキャプチャしてそれをaneに送ってane側でBitmapDataをUIViewに変換することができればなんとかなりそうな気もするんですけども、Alternativa3Dで描画してる部分をBitmapDataにキャプチャしようとしたら(Web上ならできたのに)iOS上だとキャプチャとれず。なんとかなる方法ないかなぁ・・・p.siOS5以上から追加されたDLKViewクラス(CAEAGLLayerをもつUIView系クラス)にはsnapshotってメソッドがあって、これを実行するとUIImageがさくっととれちゃうんですよね。iOSはiOS4もサポートしてるからDLKViewは使われてないんでしょうけど。iOSではCAEAGLLayerをもつUIView系クラスはCTStageViewというクラスで定義されてるっぽい)CTStageViewにもsnapshotみたいなAPI仕込まれていないかなぁ。iOSでシンプルな3Dゲームをリリースしました。Commentsメモ記事を書いてましたが先週やっとiPhoneアプリとしてリリースしました。iOS(AIR3.3SDK)で作ってみたよ。3DエンジンにはAlternativa3D(8.17.0)を使用したよ。苦戦したことは以前公開したStage3D勉強会#2の資料に書いたので興味ある方は読んでみてください。上昇気流だけを取り続けて飛ばれるとゲームオーバーになりにくいが緊張感なくなりゲームが単調になる追い風も取らせて緊張感のあるゲーム展開にしたい→上昇気流だけを取りつづけた場合は無理ゲーになるような設定に。(風車の背がどんどん伸びていく)→2種類のコンボ要素の追加(コンボを続けると風車の背が伸びにくくなるようにしている)※「上昇気流を取る→風車がのびる」という部分がルール的には判りにくくなってしまったのでヒントの項目に記載したけど理解できてない人も多いかも。▼操作性についてiPhoneアプリというと傾きセンサーだけど今回は無しで。プレイヤーが学習してやりこみ性あるゲームにしたかった。傾きセンサーでは細かいコントロールができないので運要素が増えてしまう個人的に思うようにコントロールできないのは嫌い、というのが一番の理由あと電車でプレイしてる姿も少し恥かしくなるしね。8月中は無料で9月から170円になりますので是非試してみてくださいまし。※Flash製なので簡単にWEBおためしプレイ版も用意できますよ。iOS(AIR3.3SDK)でスクリーンショットを撮るお話。ありそうでなかった、というかあったけどもうまく動かなかったので作ってみたらちょっとハマりました。タイトルどおりのaneのコードが公開されてました。ScreenShotが、実装してみても想定通りに動作しない。Objective-C部分のコードを見てみると、UIGetScreenImage()というapple非公開APIを使用してる。非公開APIを使うとリジェクト対象だそうでこれは使えないと。下の記事を参考にスタンダードな実装に変更してみる。iPhoneアプリから画面のキャプチャー画像を取得する2つの方法aneファイルをビルドしなおして再テスト。画像はカメラロールに保存されたのは真っ白の画像。ちなみにObjective-CでiOSプロジェクトを作って、Xib上に適当にボタンとか画像とか配置した状態で上記の方法を実行すればスクリーンショットは問題なく取れるから根本的に間違ってるわけではなさげ。肝はFlashの描画領域がどこにあるのか、ということ。renderInContext:UIGraphicsGetCurrentContext()];UIWindowのkeyWindowのレイヤーをキャプチャしてるのだからFlashで言えばStage上のメインタイムラインをキャプチャしてるようなものなはずだから良さげな感じだけども結果は前述したとおりに真っ白。上記の方法は使えないみたい。app.xmlでのrenderMode要素をdirectを指定する場合はObjective-C側ではOpenGLESでのスクリーンショットを撮るような処理をしないといけないっぽい。具体的なコードはここに書かれてるものを参考にしました。imageこのコードで取得したUIImageをキャプチャすることでとスクリーンショットを撮ることができました。renderModeをcpu指定にすれば最初のコードでもスクリーンショットは撮れるのではないか?と思いましたが結果は否。renderMode:cpuでは、上述のどちらのコードでもスクリーンショットを撮ることはできませんでした。renderModeをcpuにする理由なんてない気もするのでまぁいいか。各コードの詳細はQuiitaにあげてあります。iOSでスクリーンショットをカメラロールに保存するANEを作ってみたけど真っ白な画面しか取れない(コメント欄で自己解決してます)p.s.ちなみに今回スクリーンショットを撮るのが最終目的ではなく、iOS5からのネイティブなTwitterAPIを使ってのスクリーンショットつきのTweet機能を実装したかったのでした。これも無事にうまく実装できたので、また後で記事を書きます。AIR)ファイルを含んでのipaファイルが書き出せたので手順をメモしておきます。aneファイルはSTICKSPORTSさんが公開されてるANE-Silent-SwitchとANE-Game-Centerの二つを使ってみます。どちらもDLしたサンプル一式の中にテスト用のドキュメントクラスが入っていますので、それを組み合わせてふたつの機能を持ったipaを作ってみます。SilentSwitchはいわゆるマナーモードスイッチのこと。ハードウェアスイッチのオンオフでサウンドのオンオフをする機能です。iOSだけではこの機能を使えない)GameCenterはオンラインランキング等の機能が使えます。この二つでとりあえずユーザーフレンドリーな簡単なゲームが作れますよね。end以上で準備完了です。Eneterでコマンドプロンプトが立ち上がり、大量のwarningが出ますが、distフォルダにipaファイルが書き出されます。ipaの実機に転送がうまくいけばこんな画面が確認できます。画面中央より上がGameCenter、下がSilentSwitchの操作となります。動作確認の例として、[playSound1]を押すと音が鳴り始めます。そのままiPhoneのサイレントスイッチ(いわゆるマナーモードのスイッチ)をオンオフしても音は鳴り続けますが、[silentSwitch]ボタンを押すとiPhoneのサイレントスイッチを切り替えることで音のオンオフが制御できるようになります。Connect側での設定も必要です。IDと紐付けられますとなります。これでFlashを使ってランキング機能付きのゲームも簡単に作れそうですね。SDKの指定をせずともビルドできる場合があります。SDKのバージョンに依存するみたい。SDKを指定しなくてよいみたいです。SDKを指定しておけば下位互換があるかは試してません。SDKの指定ができないっぽいので上記2つのaneを実装したipaを作ることってできないんですよね。SDK指定が可能になったのはAIR3.3SDKからだからみたいです。CommentiPhone(3GS)を契約して丸2年になったこともあり、softbaknkの窓口でタイトルどおりの質問をしてきたのでメモしとく。「2年契約(キャンペーン)」とはたぶん最初にsoftbankに契約したときに入ることになるいわゆる2年縛りの契約。この2年がたたないうちに契約を解除すると違約金を1万円くらい払わなきゃいけない。これは、どこの携帯電話会社でもあるよね。このまま何もしないと3年目からも「2年契約(キャンペーン)」に加入することになり、また2年縛りが始まり途中解約では違約金が発生する、ということ。これが「2年契約(キャンペーン)」を更新したときのデメリットとなります。「2年契約(キャンペーン)」に加入してるときは、2年契約(キャンペーン)の更新可能月以外はsoftbank解約時に違約金を払う必要があるので好きなときに解約しずらいということ。ちなみに「2年契約(キャンペーン)」の更新可能月は、契約月+12,13,14の3ヶ月間。ボクの場合は2009年8月にiPhone持ったので、更新可能月は2011年の8,9,10月ということ。「2年契約(キャンペーン)」のメリットパケットの上限が4410円になります。下限はいずれも1029円なので、具体的には2年契約(キャンペーン)アリ:1029~4410円2年契約(キャンペーン)ナシ:1029~5980円という料金形態になります。なると毎月パケット上限まで使い切ってる人(つまりボク)は「2年契約(キャンペーン)」をナシにすると毎月の支払い額が増えてしまって微妙だなぁと思ったら、「パケットし放題フラット」というサービスもあると。こちらに加入するとパケット使っても使わなくても毎月定額4410円のパケット代になると。毎月パケットを上限まで使い切ってる人は、契約2年を迎えたときに迷わず「2年契約(キャンペーン)」の更新をとめる。これで、3年目以降はsoftbank解約時に違約金を払わなくてすむので安心。「パケットし放題フラット」に加入すれば月々の支払いは今までどおり。毎月パケットを上限まで使い切ったり使い切らなかったりとムラが激しい人で、softbankから解約することはないって人は「2年契約(キャンペーン)」を更新してもいいんじゃないかな。softbankの前はau使ってたのだけど、auは何年使っても契約月以外での解約は違約金払わされるシステムだった気がする。考えると、softbankは良心的なんじゃないかと思った。>2011.10.6追記どうやらsoftbankの2年縛りには2種類あるらしい。■もうひとつは、2010年4月27日から改定された「ホワイトプラン」(基本料金のプラン)ボクの場合は2010年4月27日以前(「2年契約(キャンペーン)」に加入してる人はこうなるはず)にホワイトプランを契約してるので、上記に書いたとおり、「2年契約(キャンペーン)」を解除すれば2年縛りの呪縛から解除されて、いつ解約してもよくなるのだけど、2010年4月27日以降に契約した人は「ホワイトプラン」(iPhoneの基本料金プランなので必ず入ってるはず)に2年縛りの条項が追加されたので、2年縛りからの呪縛からは逃れる方法はないみたい。あとよくよく考えたらauのときは端末代無料で2年縛り的なことがまかりとおってた時代だった。端末代一括で払ったとしても2年縛りがつきまとう、依然よりも環境悪化した気がする。[iPhone]UISliderにてvalue値固定でmaximumValueを変更した際にはUISliderの見た目が変化しないみたい。そんなときの無理やりな対処の仕方。CommentsUISliderの挙動に悩みました。sliderA.value;}sliderBはmaximumValueは変化するがvalueは変化しない。この状態でsliderBの見た目(つまみの位置)が相対的に変化して欲しい。sliderBのvalueを変数で保持しておいて、明示的にsilderB.valueに代入してみてもだめ。sliderB.value;}どうも挙動を確認してみるとslider.valueには現在地と同じ値を明示的に代入しても見た目の変化は起きないようだった。現在地と違う値を入れてあげれば、maximumValueに対応した見た目の変化も発生する。sliderB.value;}もっといい方法がありましたら、教えてくださいませ。Comments前の記事の続き、FlashBuilder4.5のActionScriptモバイルプロジェクトでの設定のお話。これでデバッグプレビューすると確かに横向きでプレビューされる。stage.stageWidthは320、stage.stageHeightは480と変更されていない。//出力:480,320解せないのが、なぜPORTRAITなのか。通常はPORTRAITは縦、LANDSCAPEは横をあらわすので、stage.setAspectRatio(StageAspectRatio.LANDSCAPE);と設定すればいいと思ったのだけど、これだとstage.stageWidthは320、stage.stageHeightは480のままとなった。//出力:320,480解せぬ。上記設定だと実機転送した際に横方向にはならない様子。setAspectRatio()にはStageAspectRatio.LANDSCAPEを設定しないと横向き固定にはなりませんでした。//出力:320,480となっているようで実機起動上では特に問題なさげ。ステージサイズがちゃんと取れないのはデバッグプレビューだけでのバグってことなのか!?※2011.8.18追記コメント欄にて教えていただきました。stage.setOrientation(StageOrientation.DEFAULT)を設定することで想定したstageサイズを取得することができました。Commentsだいぶはまってネットに情報が見当たらなかったのでメモ。FlashBuilder4.5でiPhone、Androind等のアプリを作るため、以下2つのプロジェクトが用意されました。FlexモバイルプロジェクトActionScriptモバイルプロジェクト1.はMXMLベースのプロジェクトで2はASだけで作れるプロジェクト。ボクはMXMLはさっぱりなのでASだけで作れる2.を選択。普通のFlashコンテンツを作ると同様にドキュメントクラスからゴリゴリ書いていけばOKですが、iOS用の書き出しをした際にステージサイズの参照値おかしなことになりました。375なんぞこれ、と思えどステージサイズの設定する箇所は見当たらず。480)を入れてみるも変化無し。ドキュメントクラスにSWFのembedタグを書いてみるも変化無し。FlashBuilderのHelpを観てみるとこんなページに行き着きました。http://www.randytroppmann.com/2011/04/12/pure-as3-workflow-with-flex-builder-4-5/そこに書かれていた見慣れぬ1行を追加してみると。StageDisplayState.FULL_SCREEN_INTERACTIVE;これを入れることでstage.stageWidth,stageHeightが想定通りの値となりました。(シミュレートデバイスを変えることにより値も変化する)とりあえず、よくわからんけど、上記一行は必須らしい。P.S.Retina対応もできるらしいけど、3G/3GSとRetinaの混合設定がよくわからん。highを書くだけで、Objective-Cみたいに自動でいい感じに変換してくれるのか、それとも2種類の画角を分けて作らないのいけないのか。Retinaの実機がないから検証できんのよね。Comment簡単にできたようで出来てなくてちょっとはまったのでメモ基本的にはメソッドが用意されます。forState:UIControlStateHighlighted];これだけで指定した画像につまみが変更される。UISliderをInterfaceBuilderで配置した場合にはこれだけではうまくいかない場合がある。デフォルトのUISliderのheightは23になるのだけど、自分で用意したつまみ画像の高さが23を超える場合は、はみ出した部分はタッチ領域にならない。上記の例だとつまみの高さは100pxなので見た目はでかいつまみになっているけど、実機でタッチできる領域は中心の23px分しか反応しないことになる。InterfaceBuilder上からheightを修正してあげればいいかと思うと、Hの領域だけグレイアウトされていて修正ができない.なのでframeプロパティを修正して描画領域を書き換えてあげないといけないのでした。100);/////////////////////////////////////////////////////////////////////////////////////////////////////////というようなことが下記のブログには、しっかり書かれていましたのですが、、スライダーバー(UISlider)のカスタマイズ的:いまログ細かいところが理解できずに結構はまってしまった。CommentsFlashCS5の目玉機能iPhoneアプリの書き出し。これの実機転送ができずに半年くらい途方にくれてましたが本日ようやく解決。Windowsじゃできないんじゃないとの疑惑さえ沸いてましたがなんてことはなく、手順が悪かっただけでした。ちなみに実機への転送は、Appleのデベロッパー登録が必要です。)やり方はAdobeの提供してるPDFファイルを読めばできるはずなのだけども、ボクのケースでは一箇所だけ書いてある手順でできなくて、そこで勘違いしてずーっとハマってました。証明書形式に書き出します。これを行う手順は次のとおりです。ユーティリティフォルダー内にあるキーチェーンアクセスアプリケーションを開きます。証明書をキーチェーンにまだ追加していない場合は、ファイル/読み込みを選択します。ファイル)に移動します。キーチェーンアクセスの「分類」で「鍵」を選択します。開発用証明書に関連付けられている秘密鍵を選択します。公開証明書によって識別されます。ファイル/書き出すを選択します。Exchange)ファイル形式で鍵を保存します。この鍵を別のコンピューターに読み込むときに使用するパスワードを作成するよう指示があります。ありますが、僕のmacの環境にはこれがありませんでした。Distributionの証明書を書き出して、それを使ってFlashCS5でiPhoneアプリ形式での書き出しを行ったわけです。これはエラーもなく、ipa形式のファイルを作ってくれます。正規の手順どおりにiTunesから実機に同期しようとすると、つぎのようなエラーがでるのです。インストールできませんでした。そこでAdobeの指示は無視して、keychainの分類で、鍵ではなく、証明書の項目を見てみます。Developperというそれっぽい項目がありました。結論としては、ここでの証明書の項目(上記画像で選択されている部分)を.p12形式で書き出せば上手くいきます。・・・ここでは罠があります。)を.p12形式で書き出すこともできるのです。この.p12ファイルを使っても、FlashCS5からはipa形式のファイルを書き出すことができます。iTunesの同期で上に書いたようなエラーがでるのです。(これでずーっとはまってた)結論としては、書き出すファイルは、秘密鍵ではなく、証明書なんですよね。AdobeのPDFではそのへんが明確に書いてないのでよくわからんのですよ。私がアンポンタンなだけなのかしら・・・とにかく、この記事が同じ悩みがある人の助けになれれば幸いです。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。memo.393about。