2008年12月10日水曜日

iPhoneメモ - AVFoundation

iphoneOS2.2から追加されたAVFoundationフレームワーク

今日ループ曲を鳴らしてるとループのタイミングで音が一瞬途切れていることに気づいた。
調べてみると、どうやらエンコードによって変わるらしい。

●以下の三つの形式だけチェック
wave - 問題ない
Appleロスレス - 問題ない
aac - おかしい (320kbps, 192kbps, 32kbps)

ロスレスとaacはitunesでエンコード。
上の二つは音もいいんだけどサイズも大きい。ソフトバンクの3G網で落とせる10M以内に抑えるならレートを下げるしかないのかな?
もっとちゃんと調べればもしかしたら大丈夫なのかもしれないけどさ・・・


--
ちなみに音の鳴らし方のメモも

NSString* path = [[NSBundle mainBundle] pathForResource:@"title" ofType:@"wav"];
AVAudioPlayer
* player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[player play];


こんな感じで簡単に音を再生できます。

2008年9月14日日曜日

リーグ戦スケジューラー

個人的に参加している某ゲームの対戦会用に、リーグ戦のスケジューラーを作りました。
メッセとかに貼り付けれるように、リーグ表とか順位表とかも表示するようにしています。
以下がそのイメージ












巷では.Netがはやってそうですが、知らないのでMFCを使用。


デバッグは5~12人まで目視で行いました。
それ以上、以下はしていないのでミスがあるかも。

アルゴリズムとしては
-------------------------------------------------------------
1:まず奇数人数の場合、1人ダミーの人を入れて偶数人数化します。(後でダミーと当った対戦は除外)
2:A vs B で左の人をホスト、右の人をクライアントと呼ぶ
3:各回戦ごとにホスト基準で対戦相手を検索開始する。
4:検索順は A~F の6人の場合 A>B>C>F>E>D となる、 注意するのは(人数/2)を超えた場合最後の人から戻ってくるような検索の仕方に変わること。
5:基準のホストが決まったら次に対戦相手のクライアントを探して行く。
6:この時 クライアント候補は F>E>D>C>B>A>F>E... と 1回戦内でループしていき、対戦相手が決まったら、次に相手を決定するホストは直前のホストの相手-1の位置にいる相手から検索を始める。
7:例えば、最初の試合が A vs Fになった場合、 次にホストとなったBはEから検索を始める。
8:対戦相手が決まらなかった場合、クライアント検索開始位置は変わらず、4に戻る


プログラムソース的には 以下を回戦数分繰り返す。というか試合数が最大になる回戦まで繰り返す
int mMemberNum = x; // グループ人数
int client = mMemberNum- 1; // クライアント候補の人のID
bool roundCache[mMemberNum]; // 各ラウンドごとに対戦相手が決定したかどうかを表すフラグ
int league[mMemberNum * mMemberNum] // 各対戦情報を管理する配列
int roundCount; // N回戦をあらわす
for( int hostCount = 0; hostCount < (mMemberNum); hostCount++ )
{
     int host = hostCount;
    // ホスト位置が半分を超えたら、最後の人から逆方向にホスト位置をずらしはじめる
     if( host >= (mMemberNum)/2 ) host = (mMemberNum-1) - (host-mMemberNum/2);
    // ホスト候補の人が既に対戦が決定している
    if( roundCache[host] ) continue;

    for( int count = 0; count < (mMemberNum); client = (client - 1 + mMemberNum) % mMemberNum, count++ )
    {
        // クライアント候補が自分なら飛ばす
        if( host == client ) continue;
        // その人が対戦相手決定済みなら飛ばす
        if( roundCache[client] ) continue;
        // すでにクライアント候補の人とは対戦している場合は飛ばす
        if( league[(host *mMemberNum) + client] != -1 ) continue;
        // 対戦情報を設定
        league[(host *(mMemberNum+gisou)) + client] = roundCount;
        league[(client *(mMemberNum+gisou)) + host] = roundCount;
        roundCache[host] = true;
        roundCache[client] = true;

        break;
    }
}


--------------------------------------------------------------

無理やりな思いつきのアルゴリズムだからかなり穴があるかもしれない。

2008年5月23日金曜日

続・シャープ端末の罠

またまたシャープ端末のへんてこりんな仕様?が発覚。

Imageデータをそこそこの枚数用意しただけで速度が遅くなるみたい。
量は結構端末によってまちまちみたいだけど、シャープ端末のは酷い。
なんたって最新機種でもおこるし・・

null値のImage配列だけでも影響が出る。
画像を沢山使うアプリだとそれだけでもうPSみたいなローディングがw

今後、そういうことも意識してプログラムしていかないと行けないな。(てかシャープが改善しろよ・・・)

2008年5月12日月曜日

Android Developer Challenge

落ちました。入賞ならずorz

まぁそう簡単には行かないと思ってたけどさ
ありきたりなアイディアだと思ったし、多分Googleが求めている物はもっと違う物なんじゃないか?
とも感じてた。

これから入賞者のアプリを見れる機会があるだろうし、そこで感銘を受けようw
家でも開発したいけど、家のPCだと重くてきついかなぁ。

新しいPC買わないとなぁ

2008年4月24日木曜日

Google デベロッパー交流会

Google主催のデベロッパー交流会に参加してきました。

参加したのは今回のテーマが「Android SDK」だったからw

本当は明日、渋谷でAndroid開発セミナーみたいなのがあるらしいんだけど、
ちょっとヤボ用があるので参加できません。

今日の内容だけど、個人的に収穫があったのはIMEが搭載される的な事を言ってたことくらいかなぁ。
あとは確認事項とか折込済み的なことだったような気がする。

パネラーの人がサンプルアプリ作ってきてたけど、
ケイブの人がデススマイルズ持ってくるとは思わなかったww
めちゃくちゃメンドクサソウに話してたけどねw

あとはオンラインゲームっぽいのを作ってた人のは結構すごかった感じがする。
(あくまでゲーム屋から見た感じでね)

2008年3月30日日曜日

パレット操作

Direct3Dにて読み込んだ画像のパレット操作をしようとしてみたけど

中々資料が出てこない。

いや、

中々というかまったく出てこない。


DirectDraw時代のは出てくる。

しかし!

Direct3Dになった今、そういうことをしている資料が見つからない。


もしかして出来ない?(出来たとしてもメンドクサイ?探し方が悪いだけ?)

2008年2月27日水曜日

シャープ端末の罠?

久しぶりの書き込みw

仕事でシャープ系端末(ソフトバンク)の挙動がおかしかったのでメモ的に書いておこう。


【現象】
ネットから落としてきた画像データをImage.createImage(byte[] data,int ofset, int length)
で生成しようとしたらException吐いて失敗する。

【対策】
Image.createImage(InputStream stream)
を使用したら回避できた模様。

【原因】
詳しくは不明