でらうま倶楽部

バカってゆうか、ゲームを作る事しか能の無いプログラマの、面白おかしな日々を綴ってみる実験。

iphoneアプリ

iPhone『稲川淳二の怪談』シリーズ配信開始

という訳で今日から配信が始まりました!


『稲川淳二の怪談』

app01
樹海~放置車~


樹海の撮影現場へ向かうタクシー。
ドライバーが導かれた謎の場所とは…。
app02
脂ぎった顔
いつも生活している日常が闇に支配された瞬間、非日常的な空間がはじまる。
暗闇には別の何かが存在しているのかも知れませんね…。
app03
軽音楽同好会

夏期合宿の海辺の町での出来事。
皆さんも好奇心まかせの肝試しは、ホドホドにして下さいね。
app04
旧伯爵家の別邸

みなさんもお気をつけ下さい…。
心霊スポットは思わぬところにあるものです…。
app05
赤い半纏

稲川怪談の原点とも言える古典怪談。
某ラジオ局での初披露以来、四半世紀の時を経てiPhoneアプリに登場。

なんと5本同時配信。無事にリリースできました。

いや~こわいですねぇ。ゾッとしますねぇ…専用フォントの縦書きで雰囲気たっぷりです(笑)テキストならでわな怖さがあります。

猛暑(というか残暑)厳しい日が続いておりますがヒヤッ!とするには丁度良いかもしれませんよ。というか夜中に部屋で一人、iPhoneの小さい画面を覗いてると本気で怖い思いができます。いま背後に誰かいる…わけないよね!

開発者的にはAppleに「アプリ内課金にしろ」とか言われなくって内心ホッとしてます。あるいみ心臓に悪かった!


実は怪談好き、だったり興味を持ってくれた人、よければ手に取ってみてください。ではまた次回!

iPhone mp3やAACのループ再生(ストリーミング)に挑戦。

iPhoneアプリの開発に没頭する日々です。

没頭するあまり、危うく電話止められそうになりました。携帯電話の料金振り込みを2カ月続けて忘れてて…。さっきサポートに電話して事無きを得ました…ふぅ。

で、新しいプロジェクトが立ち上がる度に必ず何か新しい事に挑戦しています。もう10年以上続けている日課のようなものですが。今まさに提出しようとしているアプリは独自フォントでの文字表示。で、次回作はオーディオのストリーミングを組み込もうって事で、ネット上にあるサンプルを元に実装してみました。

・ループ再生に対応
・HTTPストリーミングにも対応

まあこんな感じ。参考にしたプログラムの完成度が非常に高く、目標を達成するのにそれほど時間はかからず。この素晴らしいサンプルを公開した人に感謝。

プロジェクトはこっからダウンロードしてちょ。githubとか使った方がいいかしら?

snapshot冗談みたいなスナップショットですが、処理負荷を調べる為にタイマ&CoreAnimationで画像を動かしてます。あとは見たら判る系。

サンプル音源に関しては何もツッコまないでください(笑)

ライブラリのバグなのかどうなのかわかりませんが、AACだとシークが正しく行えないみたいです(デベロッパフォーラムでも同様の書き込みがあった)

ので、ループ時には一旦ファイルを閉じでまた開くという、なんとも前時代的な処理でお茶を濁しています。それゆえシビアなループ再生はまだできません。これを見掛けたあなた!あなたが手を入れてくれると嬉しいです。

mp3とかAACのファイルをそのままハードウェアデーコードで再生できるので、容量にも処理負荷にも優しい…んじゃないかな?


ではまた次回!

iPhone Objective-Cではないコードのメモリリークを特定するには(今回はソース付き)

今回はメモリリークの話です。

f31e239b99d8be3a28_5iPhoneでのメモリ管理ですが、Objective-Cのクラスをフル活用してコードを書いているウチは問題ないと思います。InstrumentsのLeaksを使えばコードのどの場所で確保されたメモリかが一目瞭然だと思うからね。
(きっとC++でもそんな感じに違いない)

なーのーでーすーがー!

問題なのがCのmalloc()とかcalloc()とかrealloc()とか。これ、InstrumentsのLeaksでも「Malloc area 8K」とかって表示されるんで、その表示の中からメモリリークを探し出すのが至難の技….。

まぁメモリ確保時にクラス名の指定も何もないんだから仕方ないのは判ってるんですけど…OpenGLを使ったり自分の昔のCのコードを使ったりしてるとどーしても malloc()系を使うしかない局面もあると思うのよ。あとCで書かれたオープンソース系のコードとか。Objective-Cから離れるほどにメモリリークを調べるのも困難になるという罠。

で、それを「見える化」してみようというのが今回のお話。

知人から教わった理屈をヒントにPS2あたりで書いてたコードが元になってて、その考え方をObjective-Cに持ちこんでみた感じです。その節はお世話になりました。

ま、コードがシンプルなのでここからダウンロードしてみてください。

んで、dbgMemory.hとdbgMemory.mをプロジェクトに加えます。そうそう、デバッグビルド時にプリプロセッサマクロ「DEBUG」が有効になるようにするのを忘れずに。自分で#define してもいいです。

使い方ですが、アプリ起動時に

initDbgMemory();

を実行。メモリデバッグ機能が初期化されます。
続いて、メモリ確保関連の関数を置き換えます。

malloc() → NNMalloc()
calloc() → NNCalloc()
realloc() → NNRealloc()
free() → NNFree()

最後。タイトル画面などのタイミングで

dispDbgMemory();

を実行。コンソールにメモリの確保状況が表示されます。

ゲームだとタイトル画面に戻ってきた時には大抵、ゲーム本編で使ったメモリを全て解放しとる訳なので、この時に解放し忘れメモリがあると、[クラス名 メソッド名]付きでコンソールに表示するという仕組み。どのタイミングでチェックすればいいのかはアプリの仕様次第になるのかな?

ここまで読んで、鋭い人ならだいたいその仕組みに気付いたと思うのですが…きっとその通り。初期化時に空の NSMutableDictionary を確保しておき、malloc()やcalloc()が呼び出される度、必要な情報と共に NSMutableDictionary に格納していきます。で、free()の時にそれを削除。使ったメモリを正しく解放できていれば、しかるべきタイミングで(タイトル画面とか、アプリ終了時とか) dispDbgMemory()を実行した時に NSMutableDictionary は空になっているという寸法です。

これがゲームをプレイする度増えているようなら、まずメモリリークしていると言っていいでしょう。GCCの予約定数 __PRETTY_FUNCTION__ を使ってクラス名とメソッド名を表示するようにしているので、これを元にサクッと特定~。楽になりました。


ずっと昔、先輩が3日間放置しておくと必ずタイトル画面でハングするという不具合で悩まされた話を聞かさせたんだけど、それ、ゲーム本編で毎回2バイトずつメモリリークしていたのが原因だったんだって。2バイトて!

「タイトル画面→デモプレイ→タイトル画面→デモプレイ…」という流れで、徐々にメモリが蝕まれていってた訳だ。それから20年。そんな不具合は一瞬で解決しとかないと先輩も浮かばれませんて。


そんなノスタルジー気分から脱しきれとらん部長のネットTV。小10分程ですので、良ければ観てやってください(^_^; 拙作物理演算による万華鏡アプリ『Kaleidoprojector』もヨロシク。 ではまた次回!

作ったソフトに対して思う事。

いつものよーにAppStoreにログイン。

自分の目を疑ったよ。

photo01拙作Kaleidoprojectorが注目の新作に入っとる!

まさかの写真カテゴリ注目の新作入り。

iPhoneアプリデベロッパとしては新参者な部長。こうして諸先輩方のアプリと肩を並べられるとは…光栄至極。もう次回作に取りかかってるんだけど…ついつい気合も入るよネ!

ユーザーの中には、カレイドプロジェクターで保存した画像を写真共有サイトにアップしてくれている人もいて、それが、作った部長もまったく想像のつかない画像で驚きの連続。そ、それどーゆー具の配分でできとるの?みたいな。

まさに想定外。

自分なりの手法で、制作者の意図を越えた楽しみ方が出来るアプリへの挑戦だったが…完成するまで色々と助言してくれたみんな。アプリを取り上げてくださったWebサイト。そして実際にこのアプリを手に取ってくれたみなさんに対して、感謝の言葉がみつからない。作ったソフトって、自分の子供みたいなもんだからね。どうか皆さんの手元で末永く可愛がられるよう願わずにはいられませぬ。


なんか最終回みたいになったな。

今の世代は知らんよね。

photo1今回はクイズ形式で。

今日のランチ模様!




残念!

お好み焼きじゃないです。
でも惜しい。

アジサンド
です。

パンにマーガリン、アジフライ、ソース、マヨネーズして挟むだけという極めて原始的かつ経済的な食糧なのだ!

ドラマ「俺たちは天使だ」に出てたんだって?レシピは違うって言われたけどさ…そっすか。てかドラマの内容をほとんど覚えとらんて!


こんな感じで、お昼時をゆっくり過ごす時間的空間的経済的ゆとりのない世代なんですが…

photo2こーゆーことして遊ぶのだけ、人並み以上に真剣な世代でもありんす。

そのアジサンドをカレイドプロジェクターに取りこんでみた(笑)

食べ物で遊んじゃいけません!
てか、食べながらiPhone触っちゃダメですって!

でもなんか、レース編みみたいじゃね?


アルゴリズムの仕様上、ちょっと中心を外して写真を撮るのがコツですよ。

iPhone 横画面アプリを作る3つの鉄則。

iPhoneアプリで横画面。

これから取り掛かるiPhoneアプリが横画面なり。

これ、難しく考える必要なくて、InterfaceBuilderでViewのサイズを480x320にすればオッケー

…な訳なくて!

アプリ起動時に自動的にシミュレーターが横画面モードになって欲しいのと、ビューコントローラー・アラートビューを横画面対応にさすために3つ程手を入れる必要がありんす。ので、こんな感じで手を入れた。

  1. info.plistに「UIInterfaceOrientation = UIInterfaceOrientationLandscapeRight」を追加。
  2. UIApplicationDelegate の applicationDidFinishLaunchingメソッドで
    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
    を呼び出す。
  3. UIViewController の shouldAutorotateToInterfaceOrientation メソッドをこんな感じにする
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }

photo01←info.plistをXcodeで眺めるの図。

ちなみに前述の実装だとホームボタンが右側にくるよ。左利き的にはかなり譲歩したんだからね!

photo02と、今度こそオッケィ!とりあえずさっさとサウンドテストモードとか作って実機で動かしてみる。

この件、コチラコチラの記事が詳しいですな。ありがとうございます。いつもお世話になっとります。

iPhoneアプリについてちょっと振り返ってみました。

前作DropOutの産みの親が登場…?!

photo01
サクマ式ドロップスでございます。

ゆうべたまたま最寄りのスーパーで見つけた。100円。

「この缶の中からキャンディーを取り出す感じをiPhoneでできたらいいよね~」
という高濱さんの一言で始まったプロジェクトだったんですが…なにせ初めてのiPhoneアプリ開発。開発言語のObjective-Cも開発環境がMacというのも初めて。そんな状況で試行錯誤を繰り返してやっとゲームとして遊べる形になったDropOut。今プログラムを見返してみると…けっこう冷や汗ものだったりするんだなこれが。

んで、その直後から開発を始めたのが万華鏡アプリ。物理演算エンジンの扱いも慣れていたので、わりと早い段階で万華鏡っぽく動かすことはできてました。描画に関しては最初からOpenGLを使おうと意気込んでいて、主にここのサイトでAPIの振る舞いをチェックしつつ実装を進めました。

photo01これ、カレイドプロジェクターで使われているテクスチャ。実際にはpng形式で用意されていて、黒い部分は半透明で「抜き」指定になってます。OpenGLではコマ切れのテクスチャを用意するとパフォーマンスの低下が著しいので、パフォーマンスが要求される場合こういうローテクな手法で乗り切ります。ゲームならでは感があるね。右下の豆腐の部分がどうやって使われてるかはまだ内緒。

でもUIが気に入らなくて、実は一回作り直してます。

なんかね、初期バージョンは最初にアプリを立ち上げた瞬間の挙動とか、万華鏡の具をユーザーに選ばせたりする画面とメイン画面の行き来、ヘルプ画面との行き来などがイマイチだったのよ。んで、一旦バラして組み直して、今の振る舞いになりましたと…さ。

ユーザーの慣れとメニュー配置がいい感じにリンクしとると自負しておりますが…是非実際に触ってみた人の意見を聞いてみたいところです。部長的にはスナップショットの時の挙動と、設定を初期化した時にスライダーがアニメーションして動く所がお気に入り!何も説明しなくても、何が起こったのかユーザーが理解できるような設計って素敵よね。

そんな感じで完成したアプリですが、アプリが有料でためらってるアナタ!iPhone持ってないアナタ!PV観るのはタダですんでひとつお時間のある時にでも宜しくです。ちなみに、カレイドプロジェクターのPVの再生回数が千回越えてくれるとかなり夏はやる気全開モードで乗り越えられるような気がするなぁ…。

iPhoneアプリ紹介PVがYouTubeに登場。

title
iPhoneアプリ
『Kaleidoprojector -万華鏡が紡ぐ無限の世界-』
アプリの内容を紹介するPVをYouTubeに上げた。

時間のある時にでも観てみてちょ。
ケータイのひとはこっから


Ready for Sale! 『Kaleidoprojector -万華鏡が紡ぎ出す無限の世界-』

photo1申請中のアプリが「Ready for Sale」になったどー!とのメールが、さっきAppleから届きました。


という訳で…この場を借りて告知させて下さい。




『Kaleidoprojector -万華鏡が紡ぎ出す無限の世界-』
前作DropOutで培った物理演算処理をさらに発展さして、万華鏡をiPhone上でシミュレートしてみました。もちろんレンダリングはOpenGL。

…とまぁここまでは他の万華鏡アプリと大差ないと思うのですが(^^;

photo1
実は部長的にスッゲー欲しかったんだよね。具が自由自在な万華鏡が。なのでこのアプリ、中に入っている「具」を、自分で選べるようになってます。用意した具は40種類以上。


photo2
こんな感じに、編集画面でスライダーをちょいちょい…っと触るだけで、自分オリジナルな万華鏡の出来あがり!くるくる回して千差万別な模様を楽しむもよし、スナップショットに取って保存するもよし。


photo3
もちろん、カメラのついとるiPhoneなら、その場で撮影した画像をハメ込めます。これがまた意外で不思議な模様になるのよ。何気ない人の顔が時にホラーに見えたりもする。iPod touchの人は写真ライブラリからの画像が使えるぜ。


photo4
まあこんな感じですが、手に取って貰えたら嬉しい限り。感想お待ちしとります。

詳しくはAppStoreにて~。

iPhone みんな考える事か…。アプリ側でフォントを用意したいな、と。

iPhone、テキストのレンダリングがばつぐんにキレイだと思います。
Safari使っててもウットリですよ。

なのに、日本語は「ヒラギノ角ゴ」だけってのはねぇ。
英文フォントはわりと色々あるのに…勿体ない。

という訳で、こちらこちらのサイトを参考に手持ちのTrueTypeフォントを表示させてみる実験。

と、その前に。

フォントのファイル名が .ttc のバヤイ、breakttc.exe を使って.ttfにするのを忘れずに。


まずは、こちらのページから頂いたフォントのグリフを取得するプログラムを少々修正してXcodeに追加する →ダウンロード

そして、TrueTypeフォントを1つ、testfont.ttf というファイル名でXcodeに追加する。

で、こんな感じにプログラムを書く。


fontdraw.h

#import <UIKit/UIKit.h>
#import "GlyphTable.h"

@interface FontDraw : UIView
{
    CGFontRef cgFont;
    fontTable *cgFontTbl;
}

@end


fontdraw.m

#import "fontdraw.h"

@implementation FontDraw

-(id)initWithCoder:(NSCoder *)decoder
{
    if(self = [super initWithCoder:decoder])
    {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"testfont" ofType:@"ttf"];
        CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([path UTF8String]);
        cgFont = CGFontCreateWithDataProvider(fontDataProvider);
        CGDataProviderRelease(fontDataProvider);

        cgFontTbl = readFontTableFromCGFont(cgFont);
    }
    return self;
}

- (void)dealloc
{
    CGFontRelease(cgFont);
    freeFontTable(cgFontTbl);
    [super dealloc];
}

-(void)drawFont:(CGContextRef)context text:(NSString *)str x:(float)x y:(float)y
{
    int length = [str length];
    CGGlyph _glyphs[length];
    unichar _chars[length];
    for(int i = 0; i < length; i++)
    {
        _chars[i] = [str characterAtIndex:i];
    }

    size_t griphLen = 0;
    mapCharactersToGlyphsInFont(cgFontTbl, _chars, length, _glyphs, &griphLen);
    CGContextShowGlyphsAtPoint(context, x, y, _glyphs, griphLen);
}

-(void)drawRect:(CGRect)rect
{
    CGContextRef myContext = UIGraphicsGetCurrentContext();

    CGContextSetFont (myContext, cgFont);
    CGContextSetFontSize(myContext, 20);
    CGContextSetTextDrawingMode (myContext, kCGTextFill);
    CGContextSetRGBFillColor(myContext, 1.0, 1.0, 1.0, 1.0);

    CGAffineTransform myTextTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix (myContext, myTextTransform);
    
    [self drawFont:myContext text:@"ほげほげ" x:0.0 y:20.0];
}

@end


さてプログラムが書けたらIBでUIViewを配置(プログラムでUIViewを作るのがメンドイ)。そのClassを FontDraw に変更。

んで、UIViewController側にアウトレットを1つ用意してIB上でFontDrawと連結。こーすると、必要な初期化と描画メソッドの呼び出しはフレームワーク側で処理されるので、UIViewControllerにプログラムを追加する必要が無いので楽。

手抜きプログラムの常套手段です:)

さて、うまくできたかな?

photo1部長のiPhoneでは、こんな感じで無事日本語フォントが表示されました。

これは「CRC&G半古印」というフォント。なかなか趣深いフォントだよね。

ただ…メモリを7MB弱消費するのがイタい。使いどころをよく考える必要がありそうですわ。


こうしてテストは無事終わったので、本格的なテキスト表示を行うクラスの実装を始める事にしますかね!

iPhone セーブデータに潜む罠をかいくぐれ!

photo1iPhoneって便利。

インストールされたアプリがバージョンアップされると、勝手にHome画面にちっちゃい数字が表示されて催促される。

WinやMacだと、個別にチェックせにゃならんのが多くて操作もバラバラ。こなへんiPhoneはスッキリ統一されとって便利で楽。

最初は「へ?」と思ってたんだけど、気づけばバージョンアップが待ち遠しくなってるという…。もうすっかりAppleの掌で踊らされとる訳ですわ。


んで、ここに一個大きな罠が!

バージョンアップした直後に起動しなくなっちゃうアプリがチラホラ。
内部的に、かなり初期段階でコケてる感じ。

でも、アプリを削除して再インストールすると問題なく動く。
これ、恐らくセーブデータが原因なんじゃないかと思う。

iPhoneだとセーブデータは.plistファイルをNSMutableDictionaryとして扱うのが一般的かな?書き出しもメソッドが用意されてるし、Xcodeで編集もできるし(部長はJSONだけどね)

んで、バージョンアップのコードを書いてる時に新しい要素を追加したりして、さらにそれが初期値を持ってたりすると、後々の悲劇を生む訳です。

これ、開発時は気づき難いですが、ユーザーがアプリをバージョンアップしてもセーブデータは書き換えられません。んで、新しいプログラムが古いセーブデータを読み込んだ時、新しいバージョンで追加された値が見つからなくてアウト…!と。


なので、あらかじめセーブデータ内にバージョン番号を入れておく事をオススメします。んで、起動時にバージョンをチェックして、古いバージョンだった場合に帳尻を合わせる処理を行う…と。

float varsion = [[dic objectForKey:@"version"] floatValue];
バージョン番号は、1.01とか1.02とかの表記だから、float型だと都合がよい感じ。

これでアプリをバージョンアップした時のトラブルが激減する事でしょう。

目に見えない地味な作業ですが…ユーザーが育てたセーブデータを自分のせいで無駄にするわけにはいかんからね。何事も最後まで責任を持つのが男の甲斐性!

iPhone 追加はよくても削除は禁止?UIToolbarのボタン

都内は桜が満開!
週末はさぞ…花見で盛り上がるに…違いない…!

うわーん!(つまりそういうよていがない)

そんで、部長一押しなのが『マッコリ』photo1

お隣韓国の発酵酒で、ちょっと薄めのヨーグルト飲料みたいな見た目&味。ついつい飲みすぎちゃうよ。

でもさいきん合成甘味料が入ってる…
これ、飲みやすくするために入ってるんだと思う。

部長、無添加な方が味的に好きなんで、探してはいるんだけど見つからない…もう国内じゃダメなんかのぅ。

うわーん!!(さがすのがめんどう)


さてさて。

いま作ってるiPhoneアプリはUIにToolbarを多用してます。これ便利だねえ。

で、状況によって表示されてるボタンを変更する必要が出てきたのでドキュメントを調べてみたら…追加のAPIはあっても削除のAPIが見あたらん!?

どーゆー事?

あれこれ調べてみたら、UIToolbarのitemsというプロパティにボタンの配列が格納されている事が判明。ただしNSArray。

NSArrayは静的配列だから削除や追加が出来ないんだよね…。

だったら、それを取り出してNSMutableArrayに変換、再定義したらいいんじゃね?と実装したのが下のコード。

UIToolbar *myToolbar;

NSMutableArray *items = [[NSMutableArray alloc] initWithArray:[myToolbar items]];
[items removeObjectAtIndex:0];
[myToolbar setItems:items];

ばっちし。イェイ!


これで半日潰れましたが…結果としていい仕事したった!

「舞台」と「つみねこ」の話。

photo1
桜もそろそろいい感じ。
でも寒い!

今日はお昼どきに日暮里に出現していた部長です。

人生初日暮里!(おおげさ)

東京で暮らし始めて十年くらいですが、
せ めて山手線の全駅くらい制覇してみたい気持ちはあります。
東名高速と中央道の東京~名古屋のS.A.は全制覇したった!(笑)

で。

MGSのメンバーMamiが舞台に出演するという話なので観てきました。

今回の舞台は本人の好きなミュージカル仕立て。
ただ主要登場人物の心の内面を描く内容は、部長的にはちょっと難解…。

でも本人の成長っぷりが観られた一幕でした。

メンバーはMGSの活動以外に色々諸々活動しとりまして、
都合がつけばなるべく観に行くようにしてます。
ちょっとした親の心境?


でも途中立ち寄ったSoftBankショップで「つみねこ」を触って…
左利きの人に全然優しくない操作性でガックシ…!
ま、「つみねこ 2」で解消されとるので結果オーライなのですがー。

左利きの居ない環境だと気づかないもんなんでしょうかね。

耳が聴こえない人でもプ レイできるように、
音だけのヒント演出はNG。
(画面をフラッシュさせて教える)

色覚障害を持った人は判別し辛い色味が あるので、それを並べて配色しない。
(たとえば体力ゲージで赤地に緑系を乗せて表現しない)

家庭用ゲームに携わっていた時は、
そ れはもう細かいレギュレーションがありました。
会社によって違いはあれど、特に大手は厳しいでしょう。

iPhoneアプリ開発者 だって、そろそろそういう事に配慮する時期が来てるんじゃないかな?家庭用ゲームより簡単に、全世界に向けて配信できるからね。

そんで、 ゲーム開発系の専門学校でもちゃんと教えるべきだと思う。


photo2
中野の桜もいい感じ。

DropOut ついにPVが完成!だがisearchの謎は深まるばかり。

iPhoneアプリ DropOut のPVが、YouTubeで配信中なのです。



キャワユイ

携帯の人は⇒コッチから


そしてそしてー!

女の子目線でiPhoneアプリを紹介するサイト
『iPhone女史』
が、DropOutを取り上げてくれました。

iPhoneが色鮮やかなドロップ達の詰まった缶に☆つい夢中になっちゃいます

まさに女の子目線の素敵な記事につい部長までウットリ…(笑)
嬉しい限りだね。なんとお礼を言ってよいのやら。


で(話題はすっ飛びます)、Emacsのisearchで、検索履歴を遡ったりするコマンドのキーバインドが M-p と M-n とゆう、部長的にはちょい入力し辛いキーだったんですが、これを変更するのにえらい手間取りました。

(define-key isearch-mode-map "\C-n" 'isearch-ring-advance)
(define-key isearch-mode-map "\C-p" 'isearch-ring-retreat)
(define-key minibuffer-local-isearch-map "\C-n" 'next-history-element)
(define-key minibuffer-local-isearch-map "\C-p" 'previous-history-element)
(define-key isearch-mode-map [\C-up] 'isearch-complete)
(global-unset-key (kbd "C-n"))
(global-unset-key (kbd "C-p"))

要するに、isearch中の文字列をミニバッファ内で編集中の場合は、コマンド自体が違っていたとゆう罠。これはなかなか気づかんて。

あと、isearchの文字列入力中にC-upで文字列補完。これも便利機能。でもグーグルではあんまし引っ掛からない。何故?

iPhone アプリ審査をリジェクトされた翌日に配信を開始できた理由。

photo1色々諸々準備が終わって一段落。

おやつの時間です。

熱いコーヒーと、先日のライブで頂いたお菓子達…。
なんつーか、当時の記憶が蘇りますな。
まだ一週間だけど:)

ライブに足を運んで頂いた人達に
「また来よう!」
って思って貰う為に、スタッフとして何が出来るんだろう?
と試行錯誤を続ける日々でもあります。

伝わってるといいな。

これがゲームの企画・制作だったらまだ得意なんだけど!
根っこの部分は同じだと考えてるんで、まだまだ頑張ります。


さて、iPhoneアプリ第一弾、DropOut反省会(笑)
第一回は、アプリ審査について~。

予備知識として、「Appleの審査には三週間くらいかかる?」ってのがありました。んで、アプリ発売日が3月5日なので、2月中旬くらいに提出?と思われてるかと思いますが…

なんと提出したのは3月2日!

そして、一回リジェクト喰らった翌日に「Ready for Sale」になってしまったというスピード審査でした。未だ信じらんない(汗)

ちなみにリジェクト理由ですが、「ランキングデータをサーバーにアップロードする時は、必ずユーザーの許可を得てね」という内容。
え?ランキングデータをサーバーにアップロードしてませんけど…?

photo2DropOutのランキング画面、初期データにスタッフの名前を入れておいたんです。
部長、昔のアーケードゲーム好きなもんで。
それがレビュワーに、オンラインランキングのデータと勘違いされたみたいです。
なので、初期データの名前を全て「DropOut」に変更しつつ、「ランキング画面には初期データが入ってるだけで、記録をサーバーにアップロードする事はしてません」とメールを送ったら…翌日「Ready for Sale」となっとったという訳。

最初リジェクトのメールが来た時には体温が二度くらい下がった気がしたけど…冷静に対処した結果、おもいがけない速さでアプリを配信する事ができました。

そうそう、Appleとのやり取りですが、時差がある事を忘れずに。
部長はDashboardの時計の設定を「地域:北アメリカ」「都市:クパティーノ(Apple本社のある都市)」にしてます。
慌てて対応しても、相手が起きてなきゃ意味無いからね。むしろ時差を味方にして切り抜けよう!

後続の方々の参考になればよいですわ。

久々自宅でまったりんぐ。でも今月はライブが三本。三月だけに!

photo4月刊Audition4月号にもちょこっと載っとるね…。
ミステリーガールズのMamiが舞台に出演します。

『Virginity ~amber moon~』
3月26(金)~28(日)@d-倉庫
前 売:3000円 当日:3500円(全席自由)

26日 19:00
27日 14:00 19:00
28日 13:00 17:00

詳細は⇒こちら


photo3んで、ご存知ブリザードのギタリストでもあったタカさん。
いつもお世話になっとります。
彼のバンド「Kulie-Alor」も3月にライブがあるのです。

『四角い空 25話』
3月27日(土)@下北沢CaveBe
Kulie-Alor / あぶく¥ / 東亜優 / incense
Dreamer's Source / スカイラブハリケーン

open / start 18:00 / 18:30
adv / door 2000 / 2500



photo2そんで、iPhoneアプリDropOutの楽曲でも大活躍!
ご存知マーボーさんが参加する「球掟の創」もライブがあるんだよ。
只今絶賛レコーディングらしい。

『草木も揺れる音楽。』
3月22日(月)@下北沢CaveBe
CICADA / cellresound / 球掟の創
Chair / and more!!!

open / start 18:00 / 18:30
adv / door 2000 / 2500



部長と会場でバッタリ…会えるのかな?
会えるといーね。


photo1自宅に24時間滞在できるのって、
今年初めて…って訳じゃないけどほんと久しぶり…(涙)

お昼過ぎから、得意の鶏肉の塩蒸し焼きをこさえて、
お酒片手にまったりしとります。

たまには自堕落に過ごしててもいいよね。
でも結局はプログラム書いたりしてるケド(汗)


かっこいく言えばワーカホリック(笑)
かっこわるく言ったら…??

思わず食べてしまいそう?iPhoneアプリ『DropOut』の配信開始なのです。

photo
とうとうこの日がやってきた!

本日、iPhoneアプリ第一弾『DropOut』の配信が始まりましたよ~。

超嬉しいんですけど。

AppStoreで確認した瞬間、思わずガッツポーズしてもうた(笑)

ohotoiPhoneをなんと「ドロップ缶」に見立て、中に入ってるドロップから1個、ドロップを取り出すという、なんともまぁ単純かつ明快なゲーム。もうね、ガッシャガッシャと本体を振っちゃったりしてください。

なーのーでーすーがー!

ドロップの挙動にはiPhone向けにカスタマイズされた物理演算処理を使っているので、ドロップの動きは超リアル。ドロップ同士の複雑な動きに、2度と同じシチュエーションというのは存在しません。

さっきは簡単にクリアできたのに、今度は超ムズくね?と、プレイヤーには臨機応変な対応力が求められる事でしょう。

もちろんiPad touchにも対応。

ゲームの詳細はオフィシャルサイトか、AppStoreから。


何年ゲーム作ってても、この瞬間の高揚する感覚はたまらんなー。
これがあるからゲーム製作はやめられない。
この1点だけはマクロスFと共感できるわ。


そんで…約束通り、なんとこのアプリのソースコードを公開しまっす。

4か月振りに振り返ってみれば、かなりギリギリ…アウトかもしれない内容ですが、簡易タスク処理やJSONによるセーブ/ロード処理、iPhone実機上でのバランス調整機能など、みなさんの参考になれば幸いです。過去の自分がObjective-Cでおっかなびっくりコードを書いとるのが初々しい。

まだDropOutで遊んでない人、LITE版も用意したので、この機会にプレイしてみてちょ。あ、拙作『Kaleidoprojector』も押し売っとこう(笑)

という訳で、ソースコードをダウンロード
※部長判断での公開なので、何かの弾みに公開を取りやめるかもです。お早めに。

iPhone OpenGLのレンダリング結果をUIImageに変換する時の注意点。

つい先ほどiPhoneアプリ第一弾をAppStoreに提出しました…アワワ。
今月中に吉報をお届けできる…のか?

photo1さて、先週末のイベント。今回も色々と差し入れを頂いてしまいました。
本当にありがとうございます。

部長が手伝っとるイベントは演者への差し入れとは別に、スタッフさんへ、とわざわざ差し入れてくれる人が多くて、なんというか、お客さんに大事にされてるイベントなんだな…といつも実感します。

いちゲームプログラマのままでは経験する事の無かったことだがね。


そんで、実はなにげに、ちょっとだけ楽しみにしてたりもして:)


さて、イベントの感動も覚めやらぬ間に、さっそく次のアプリ製作を始めてます。
今回はOpenGLをフル活用したアプリになりそうです。

んで、OpenGLのレンダリング結果をUIImageにできへんかいな、と試行錯誤した結果をば。


    int backingWidth;   // OpenGLのバッファの幅
    int backingHeight;   // OpenGLのバッファの高さ

    NSInteger myDataLength = backingWidth * backingHeight * 4;
    GLubyte *buffer = (GLubyte *) malloc(myDataLength);
    glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    // FIXME:上下をひっくり返す。この処理が勿体ない。
    GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
    for(int y = 0; y <backingHeight; y++)
    {
        memcpy(&buffer2[((backingHeight-1) - y) * backingWidth * 4], &buffer[y * 4 * backingWidth], sizeof(GLubyte) * backingWidth * 4);
    }
    free(buffer);

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL);
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGImageRef imageRef = CGImageCreate(backingWidth, backingHeight, 8, 32, 4 * backingWidth, colorSpaceRef, kCGBitmapByteOrderDefault, provider, NULL, NO, kCGRenderingIntentDefault);
    UIImage *image = [UIImage imageWithCGImage:imageRef];

はい。これでサクッとOpenGLのレンダリング結果がUIImageになります。
呼び出すタイミングはテキトーで良い。


    CGImageRelease(imageRef);
    CGColorSpaceRelease(colorSpaceRef);
    CGDataProviderRelease(provider);
    free(buffer2);

そんで、あまり触れられてませんが、使った後はちゃんとリソースを解放しましょう。あらかじめこのへんをちゃんと作っとけば、後々メモリリークで苦しめられる事も無し。
ただし imageWithCGImage で作ったUIImageはautorelease属性なのでスルー。

仕様上、画像の上下をひっくり返す必要があるんだけど、これが無駄に感じるんだよなぁ。なにかいい手はないものかしらん。
記事検索
電子書籍発売中

「チュートリアル形式で始めるOpenAL」
サウンド怖くない。C++による8つのチュートリアルで始めるOpenALプログラミング。さああなたも、自作アプリに魅力的な音効を添えてみませんか??
⇒Kindle版 ⇒iBooks版


「iPhoneアプリ『ういろう』のレシピ」
ゲームってどうやって作ってるの?? 拙アプリ『ういろう』の製作過程を本にまとめました。もちろんソースコードつき
⇒Kindle版 ⇒iBooks版


『チュートリアル形式で始めるOpenGL[2D編]』
OpenGL怖くない。C++による16のチュートリアルで始めるOpenGLプログラミング[2D編]。さああなたも、ゲーム作りを始めてみませんか?
⇒Kindle版 ⇒iBooks版
自作ゲーム配信中

『Puzzle & Monarch』
「君主候補となって国作り!! ただし制限時間は90秒。」森を作って道をつないで...あなただけの国を作ってみませんか??
⇒AppStore


『BRICK & TRIP』
咄嗟の判断に、あなたの指先はついてこれるか?! 爽快フリックアクション!! 様々な難関をくぐり抜けて旅の終着点を目指そう!!
⇒AppStore


『ういろう』
名古屋土産ういろうがiPhoneで大活躍?! 白ういろうを守れるのはあなただけ。ひゅーん、ぼよよーん!!
⇒AppStore ⇒LITE版


『こなへん』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒AppStore ⇒LITE版


『GEOSPOT』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒Windows ⇒Mac


『TieGunner』
マウス片手に大宇宙へ飛び立とう!『しっぽシューティング』というジャンルを作って頂きました^^; WinでもMacでも動きます。ソースもあるでよw
⇒Windows ⇒Mac
QRコード
QRコード
  • ライブドアブログ