EAGLViewの画面キャプチャ

作っているゲームの画面キャプチャをアプリ内でする必要があり、いろいろ調べて実装してテストしたのですが、なかなか上手くいかず困っていましたが、なんとか行きました、という内容です。

@interface EAGLView : UIView
{
@private
    EAGLContext *context;
    
    // The pixel dimensions of the CAEAGLLayer.
    GLint framebufferWidth;
    GLint framebufferHeight;
    
    // The OpenGL ES names for the framebuffer and renderbuffer used to render to this view.
    GLuint defaultFramebuffer, colorRenderbuffer;
}

@property (nonatomic, retain) EAGLContext *context;

- (void)setFramebuffer;
- (BOOL)presentFramebuffer;
- (UIImage *) capture;

@end


- (UIImage *) capture
{
	int pixelCount = 4 * framebufferWidth * framebufferHeight;
	GLubyte* data = malloc(pixelCount * sizeof(GLubyte));
	glReadPixels(0, 0, framebufferWidth, framebufferHeight, GL_RGBA, GL_UNSIGNED_BYTE, data);
	
	CGColorSpaceRef space =  CGColorSpaceCreateDeviceRGB();
	CGContextRef ctx = CGBitmapContextCreate(data, framebufferWidth, framebufferHeight, 8, framebufferWidth * 4, space, kCGImageAlphaPremultipliedLast);
	CGImageRef img = CGBitmapContextCreateImage(ctx);
	UIGraphicsBeginImageContext(CGSizeMake(framebufferWidth, framebufferHeight)); 
	CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, framebufferWidth, framebufferHeight), img);
	CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0f, -1.0f);

	UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
	CGContextRelease(ctx);
	CGColorSpaceRelease(space);
	CGImageRelease(img);
	UIGraphicsEndImageContext();
	free(data);
	return capturedImage;
}


で、重要なのが、ViewControllerでの呼び出し方の方。

- (void)drawFrame
{
// 略
	if (_captureFlag)
	{
    [(EAGLView *)self.view capture];
		_captureFlag = NO;
	}

	[(EAGLView *)self.view presentFramebuffer];
}

と、[(EAGLView *)self.view presentFramebuffer]; の前で呼び出さないと、上手くキャプチャ出来ないのでした。

アプリ内課金の公開への長い道のり

先程、ようやくアプリ内課金を実装したアプリをリリースしました。


「安寧の巫女」〔無料)
https://itunes.apple.com/jp/app/an-ningno-wu-nu/id804127600?l=ja&ls=1&mt=8


占いミニゲームとその占いのベースとなる世界観の物語も収録しています。
無料で遊べます。


さて、今回のアプリ内課金で手こずった事。
プログラムの実装などは、下のサイトを参考にしつつ、テスト環境では上手く動く所まで来ました。


失敗しない iOS In-App Purchase プログラミング
hhttp://d.hatena.ne.jp/glass-_-onion/20111201/1322697417


非常に参考になりました。
さて、問題はその後。

  • NO In-App Purchases という理由でのリジェクト


 Resolution Center でやりとりしたり、お電話頂いたりして判りました。
 つまり、アプリは提出されているけれど、In-App Purchases 自体が提出されていない、という事でした。
 かなりトホホです。


 それで、Manage In-App Purchases で、提出しようとすると、提出出来ない。
 どうも、初回提出時は先にアプリの方でIn-App Purchasesを設定しないといけないのですが、コレ、アプリ提出前に設定しないと、設定出来ないんですよね。
 そう英語で書いてあるんですが、ハマりました。


 なんとか、初回版をリリースした所・・・・・

  • 課金が出来ない!


 販売版をDLし、課金しようとすると、プロダクトIDが無い、というエラーが発生し、購入出来ないという事態に。
 調べてみると、Manage In-App Purchases で作成はしたものの、まだ、提出していないプロダクトIDをプログラム内で呼んでいたのが原因でした。


 この事から判ったのは、Manage In-App Purchasesで作成しただけものでも、テスト環境では上手く動く。
 しかし、セールス対象となると、Manage In-App Purchases で提出していないものは、無いものとして扱われる。


 という事でした。


 セール中のアプリを販売停止にして、問題のコードを修正し、バージョンアップ。
 そして、ようやく先程リリースとなりました。

iOS7対応で行ったことなど

Xcodeを5にアプデしたら、ワーニングやらいろいろトラブル噴出。
って程ではありませんが、なんとか解決しました。

  • ワーニング1

Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGBitmapInfo' (aka 'enum CGBitmapInfo')

kCGImageAlphaPremultipliedLast → (CGBitmapInfo)kCGImageAlphaPremultipliedLast
とキャストして解決。

  • ワーニング2

Conflicting parameter types in implementation of 'initWithColorText:fontColor:fontAlignment:fontName:fontSize:antiAlias:': 'NSTextAlignment' (aka 'enum NSTextAlignment') vs 'UITextAlignment' (aka 'enum UITextAlignment')

UITextAlignment → NSTextAlignment
と使うクラスを変更して解決。

  • ワーニング3

Implicit conversion from enumeration type 'enum UILineBreakMode' to different enumeration type 'NSLineBreakMode' (aka 'enum NSLineBreakMode')

NSLineBreakModeWordWrap → NSLineBreakByWordWrapping
と使う定数を変更して解決。

 Info.plist に View controller-based status bar appearance = NO を設定して解決。

  • NSStringで描画する時のフォントサイズが正確になった。

 良い事なんですが、今までは行間に相当する分も含まれていたのが、含まれなくなったようです。
 複数行を描画する時は、自前で行間を調整する必要が出てきました。

とまあ、ざっくりとですがこんな感じです。

auのiPoneでwifi切ってるのに「wifi通信ではご利用いただけません」と出る症状

auiPhoneezwebのメール設定を行おうとすると、ショートメール送って、帰ってきたショートメールに貼ってあるURLにアクセスして行うのですが、wifiでつないでいると「wifi通信ではご利用いただけません」というエラーになります。


で、wifi切って3GやLTEで繋いで行うと、たいてい上手く行くのですが、運悪く、wifi切ってるのに「wifi通信ではご利用いただけません」と出る症状に陥ってしまいました。


アレコレ、ググってもtwitterで質問しても、症例が少ないのか分からずじまい。
結局auのお店に行って教えてもらったところ、無事解決出来ました。

解決方法
設定>一般>リセット>すべての設定をリセット


でした。壁紙とかサウンドとかが買った時の状態に戻りますから、念のためバックアップしてから行う方が良いと思います。

俺のドリルで台所の配管目詰まり水漏れ解決編

先週から台所の配管が詰まり気味で、洗浄剤などいろいろ試みるも、まったく効果なし。
以前お風呂で、カッポンで上手く行ったので、やってみたら、酷い事になってしまいました。
初めは、おお、水が流れると思っていたら、下から漏れて台所が水浸し。
orz


どうやら流しの下のジャバラ配管と下水のパイプをつないでいるパッキンが外れて、そこから漏れてしまったようです。
そう言えばこのパッキン、数年前にも水漏れを起し、接着剤やガムテープで止めていたのを思い出しました。


カッポンで、無理な水圧をかけたら、チェーンは弱い所から切れるの原則通り、ココが外れたというコトだったのでした。


これでわが家の台所、詰まりAND水漏れという2重苦になってしまいました。
水漏れも、詰まりが解消すればと、以前使った、本格的な主原料が苛性ソーダの洗浄剤を使ったのですが、ダメ。


そこで、以前買っていたパイプクリーナー(長いワイヤで詰まりに物理的に穴を空けていく器具)で流しの配管からワイヤを挿入したのですが、こんどは、流しとジャバラホースが外れ、被害は更に深刻な状況に。


良く考えたら、外れたジャバラホースの所からも少しでしたが水漏れしていたのを思いだし、これはもう寿命だと。
ジャバラホースを取り外し、これはホームセンターで買えるな、などと思いつつ、目詰まりなどでググっていると、こちらのページを発見!



パイプクリーナー PR80−5は優れもの


こちらで紹介していたパイプクリーナー PR80−5と同じものを使っていたのでしたが、使い方が悪かったみたいです。


重要なのは、戦端のドリルで詰まりにグリグリ入り込んでいく、というコト。
それを上手く行うには、回転させる人と、押し込む人の二人組が理想、というコト。


早速、娘に手伝ってもらう事にしました。
ジャバラホースを外したので、流しの下の配管から直接クリーナーを挿入して、私が押し込む係。
私の後ろでワイヤをグリグリ時計回りに回すのを娘が担当。


こうして1時間ほど少しずつ少しずつ掘り進んでいき、最後の壁を越えると、5mのワイヤのほとんどが配管に入りました!
たぶん貫通!


その後ホームセンターで買ってきたジャバラホースと、パッキンを流しに装着して水を流してテスト。


おお!かなり流れるし、水漏れもない!


まだ完全に流れるという状態ではないものの、詰まりは解消されました!
後は、日々のメンテナンスでなんとかなりそう!


こうして、詰まりと水漏れの悪夢から解放され、爽やかな気分になりました。
当たり前の日常に復帰しただけなのですが、311の事を思いだし、当たり前の日常が貴重な事を再発見したのでした。

フォトストリームに画像を入れる方法、読み出す方法

明けまして、おめでとうございます。
久しぶりのブログになってしまいました。(汗


さて、macで作成した画像などをiPhoneに送るのに、フォトストリームが使えないかと調べてみたら、こんなノウハウを見つけました。


iCloudのフォトストリーム画像が自動更新されるフォルダをデスクトップに作成する方法


詳しい方法は、リンク先の英文に記載されていました。


The Easy Way to Get iOS Screenshots On Your Mac


簡単に説明すると、
ファインダーでライブラリを開き、Application Support > iLifeAssetManagement > assets > sub と開いていきます。


もし、OSがMountain Lion で、ライブラリフォルダが非表示になっていたら、こちらをご覧ください。
「Mac OS X Lion」ユーザライブラリのフォルダを表示する方法


さて、話しを戻すと、subフォルダで、jpgで検索します。
プルダウンがでたら、種類をJPEGイメージを指定します。
「保存」ボタンをクリックして、この検索結果をスマートフォルダとして、ファインダーのサイドバーに登録します。
そのスマートフォルダを右クリックすると、「Docに追加」を選ぶとDocに追加出来ます。


このフォルダに画像をドラッグアンドドロップすれば、フォトストリームに入れられるのでは、と試してみましたが、出来ません。当たり前ですね。スマートフォルダですもの。


そこで、iPhotoを起動して、画像をアルバムにドラッグアンドドロップ
ちゃんとフォトストリームに入り、スマートフォルダの方にも入りました。


iPhoneで見てみると、こちらにも。^^


フォトストリームのスマートフォルダ方は、スマートフォルダから画像をコピーする時、便利な方法ですね。

Mountain Lion 10.8.2 の Mail文字化け

少し前に、10.8.2にアップデートした所、mailで文字化けするようになってしまいました。
特定の人からのメールが文字化け。
調べてみたら、〓(崎の右側の大が立)があるメールが文字化けするんです。
(もしかしたら、このブログでも文字化けしてるかも)
こんな感じ。
$B!!3+H (一部です)
しかも、mailで自分宛に〓(崎の右側の大が立)で送っても文字化けしないですが、
どうも他(MLとか)から送られてくると、バケてしまう。。


調べたら、〓(崎の右側の大が立)って機種異存文字とかで、文字化けの原因らしいです。
とほほですよ。虐げられる日本語って感じ。


文字化け、正直、かなり困りました。
Appleのwebのサポートにアクセスしたんですが、OS絡みのは、mac本体の方に紐付いてて、
mac本体の方のサポート期限が切れてると、切れてるからダメです、とか言われちゃう。


山猫は後から買ったんだから、その扱いは無いだろうと、仕方なく、iTunes Storeの方でその他かな、を選んで、メールした所、お返事メールにアクセス先が書いてありました。
そこで、症状を書くと、Appleからお電話してくれるか、Appleに電話するか、という選択。
電話する方をポチ。
サポートのメールが届き、電話番号と問い合わせ番号を教えてくれました。


その後、あれこれ忙しく、先日サポートの所にお電話。
で、伺うと、文字化けの問題はAppleも知っていて、解決するアップデートアドレスを教えてくれました。


それがこちら。
http://support.apple.com/kb/DL1600


これをインストールしたら、文字化けがきれいに直りました〜♪


できれば、電話しなくてもこのアドレスのメールが届くと、もっと良かったんですけどね〜。
解決出来て良かったです。
メール読めないのは致命的ですもの。


それと、App Storeで買うのはアプリだけじゃなくて、OSもあるんだから、サポートサイトの方にそのカテゴリをいれておいて頂けると、迷わなくて良いと思います。
http://www.apple.com/jp/support/mail/
ココの右上の「こちらからスタート」で行けます。