2009/05/31

cocos2d-iphone-0.7.3

http://code.google.com/p/cocos2d-iphone/

今日はViewを変更するための情報収集をしていた。
その中で、こんなものを発見。通常のXcodeprojと変わらないような気がするが。





なんだこれは。
どうやらオープンソースで公開しているフレームワークらしいが、とても複雑怪奇な形式をしている。

その中のアクティブターゲットをそれぞれ実行すると、Viewやwindowに対して様々なエフェクトを付けている事が分かった。
YouTubeにも動画があったので載せておこう。



AtlasTest
画像を拡大し、傾きで移動させる

AtlasTest
Atlas: LabelAtlas(ストップウォッチ)

ChipmunkAccelTouchTest
タッチして画像追加+傾きで移動

ClickAndMoveTest
タッチした場所に画像が移動。背景アニメーション気になる。

EaseActionTest
画像を横方向にあらゆる速度で移動。

EffectsTest, EffectsAdvancedTest
View全てにエフェクトをつける。

IntervalTest
ゲーム中のポーズ機能

MenuTest
ゲーム中のメニュー画面

ParalleaxTest
コース画面を移動。

ParticleTest
指でなぞった軌道上にエフェクトをかける

PerformanceSpriteTest
iPhoneOS3.0では起動せず。それ以前のバージョンでは動作するが何を表すか不明。

RotateWorldTest
4枚のViewに対して同時にアニメーションをつけ、画面内で同時に動かす。

SpritesTest
画像をジャンプなどのアクション付きで移動させる。

StreakTest
左右に移動する画像に対して常に等間隔で回転するもう一つの画像

Texture2dTest
文字列:配置、フォント
画像:拡大方法、縮小方法、形式ごとの表示 それぞれの違いを比較。

TransitionTest
Viewが変わる際の効果


こういったものを実行できた。
そのなかでAtlasTestというターゲットに指定して実行した際にAtlas: LabelAtlasというストップウォッチのようなものがあったので、コードを解析する事にした。

しかし、複雑すぎて意味が分からない。
コードそのものも複雑だが、まずファイルの構造が理解できなかった。


これをじっくり時間をかけて解析していけばかなりの技術が身に付くと思うのだが、今はあまり時間がない。
アメリカに行くまでに少しでも多くの機能をイライラ棒に付けていかなくては。

明日はcocos2dの解析をしたいところだが、ストップウォッチのサンプルを入手したのでそれの解析を行い、イライラ棒のクリア時間の計測に使えるようにしたい。

それが終わってからcocos2dの解析に入ろうと思う。

2009/05/30

違うディクショナリ

今日は、昨日完成させたディクショナリを違う形式に改善する作業から開始した。



NSNumber *number数字 = [NSNumber numberWithInt:2];
NSNumber *startXmax数字 = [NSNumber numberWithInt:252];
NSNumber *startXmin数字 = [NSNumber numberWithInt:195];
NSNumber *startYmax数字 = [NSNumber numberWithInt:45];
NSNumber *startYmin数字 = [NSNumber numberWithInt:0];
NSMutableDictionary *dict数字 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
number数字, @"number",
startXmax数字, @"startXmax",
startXmin数字, @"startXmin",
startYmax数字, @"startYmax",
startYmin数字, @"startYmin", nil];

昨日のおさらいのになるが、他にもdict3, 4, 5,,,のように辞書オブジェクトを生成し、その中に同様のキー値に対してstartXmax3, 4, 5,,,といった値を代入していく。「数字」の部分がそれぞれ変わっていく。

そこで登録した辞書を以下の方法で読み込む。
NSMutableDictionary *dicto = [roadArray objectAtIndex:index+1]; //indexの中身はランダムで生成されたint型の数
startXmax = [[dicto objectForKey:@"startXmax"] intValue];
startXmin = [[dicto objectForKey:@"startXmin"] intValue];
startYmax = [[dicto objectForKey:@"startYmax"] intValue];
startYmin = [[dicto objectForKey:@"startYmin"] intValue];

こうすることでroadArrayに含まれるindex + 1番目の辞書オブジェクトを呼び出し、startXmaxなどをキーとして値を読み出せていた。
しかし、これら辞書に登録するキー値は違うものなので異なる辞書オブジェクトを作る必要はなく、1つの辞書にまとめて代入したほうがいいと判断。
そこで、このような辞書オブジェクトを作る事にした。

NSNumber *startXmax数字 = [NSNumber numberWithInt:252];
NSNumber *startXmin数字 = [NSNumber numberWithInt:195];
NSNumber *startYmax数字 = [NSNumber numberWithInt:45]; //この処理を画像の枚数分繰り返す

dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
startXmax数字, @"startXmax数字",
startXmin数字, @"startXmin数字",
startYmax数字, @"startYmax数字", //この処理を画像の枚数分繰り返す


ここまでは難なくこなせたが、辞書を呼び出す際に問題が発生した。

NSString *imageNumber = [[NSString alloc] initWithFormat:@"road%d.jpg", index+2]; //indexにはint型の値が含まれる
[contentView setImage:[UIImage imageNamed:(imageNumber)]];

NSString *Xmax = [[NSString alloc] initWithFormat:@"startXmax%d", index+2];
NSString *Xmin = [[NSString alloc] initWithFormat:@"startXmin%d", index+2];
NSString *Ymax = [[NSString alloc] initWithFormat:@"startYmax%d", index+2];
NSString *Ymin = [[NSString alloc] initWithFormat:@"startYmin%d", index+2];

startXmax = [[dict objectForKey:Xmax] intValue];
startXmin = [[dict objectForKey:Xmin] intValue];
startYmax = [[dict objectForKey:Ymax] intValue];
startYmin = [[dict objectForKey:Ymin] intValue];

やはり青で宣言した文字列で辞書に含まれるキーを指定したのがマズかったのだろうか。。。


…………ごめんなさい。
ココは省略して次に進みたいと思います。

次はゲーム時間を計るタイマーと、メニュー画面の設置に取りかかろうと思う。

2009/05/29

でぃくしょなり!!

ついに完成。
コードは前回の通りで合っていたのだが、初期化をしないせいでエラー(配列roadArrayに読み込まれない)が発生していたらしい。

roadArray =[[NSMutableArray alloc] init];

このコードを忘れていたせいでどれだけの時間を無駄にした事か。。。

しかし、これでコースの変更とスタート位置の設定を完了させる事ができた。
これからはコースが変わった時にスタートできる位置とカーソルの位置も変わるようになった。


そして、先生と話をした結果doctionaryの構造を変えた方が良いという事が分かった。

今は画像ごとに1つのdictionaryを以下のように作っている。

NSNumber *number2 = [NSNumber numberWithInt:2];
NSNumber *startXmax2 = [NSNumber numberWithInt:252];
NSNumber *startXmin2 = [NSNumber numberWithInt:195];
NSNumber *startYmax2 = [NSNumber numberWithInt:45];
NSNumber *startYmin2 = [NSNumber numberWithInt:0];
NSMutableDictionary *dict2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
number2, @"number",
startXmax2, @"startXmax",
startXmin2, @"startXmin",
startYmax2, @"startYmax",
startYmin2, @"startYmin", nil];
[roadArray addObject:dict2];

しかし、これは画像ごとに辞書を変えなくても緑の部分(キー)の値のみを追加していけば問題ない事が分かる。
明日はまず始めにこの変更作業から開始し、視点を切り替えてメニュー画面の制作に取りかかろうと思う。

2009/05/27

で、でぃくしょなり。

今日はスタート地点とゴール地点を定義するアルゴリズムの変更から開始。
カーソルを配置するために、スタート地点は座標で指定した方が楽だがゴール地点に関してはそうでなくても問題ないと判断。

そこで、ゴール地点もゲーム中の動作と同様に色で識別する事にした。



赤い丸で囲まれた範囲に触れるとゴール。
コードは以下の通り。

if (bitmap[startByte+1] > 40 && bitmap[startByte+2] == 0 && bitmap[startByte+3] == 0){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ゲームクリア!"
message:nil
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"次のステージへ" ,nil];
[alert show];
[alert release];
arertFlg = 1;
gameState = 1;


基本的にはゲーム中の動作と同じ。
ただ、黒のようにRGB全ての要素が変化した時ではなく、bitmap[startByte+1](=RGBのR)が40よりも大きくなった場合に適用される。


そして肝心の辞書作成。やはりうまくできない。。。
サンプルコードを読みなおして、このようにはできた。

NSMumatbeArray = *roadArray;

NSNumber *number2 = [NSNumber numberWithInt:2];
NSNumber *startXmax2 = [NSNumber numberWithInt:320];
NSNumber *startXmin2 = [NSNumber numberWithInt:195];
NSNumber *startYmax2 = [NSNumber numberWithInt:45];
NSNumber *startYmin2 = [NSNumber numberWithInt:0];
NSMutableDictionary *dict2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
number2, @"number",
startXmax2, @"startXmax",
startXmin2, @"startXmin",
startYmax2, @"startYmax",
startYmin2, @"startYmin", nil];
[roadArray addObject:dict2];

これはroad2.jpgに関する項目だが、プログラム本体には画像の枚数分の内容を記述してある。
それぞれの項目をNSNumber型で宣言し、dict2というNSMutableDictionary型の辞書に登録。

その辞書オブジェクトをNSMutableArray型の配列roadArrayに加える、、、ハズ。
しかしうまくいかない。

デバッガで見てもオブジェクトが登録されていない事になっている。



前回に比べてそんなに変わった箇所はないはずなのだが。。。

やはり外部的要因が考えられる。他にガシガシ記述したコードに不備があったのかもしれない。
明日以降は他のコードを見比べながらやって、、、いくよりも、前回残しておいたファイルから同じコードを記述していこうと思う。



この辞書作成によってスタート地点の定義が出来上がったら今度は見た目の要素も強化していきたい。

具体的にはトップメニューの作成をしたい。
大抵のゲームは急にゲームが開始するのではなく、メニュー画面からゲームをスタートさせる。
その画面でゲームの説明を記述したりと、今やるべき事は山積みだ。。。

WWDCまでにいかに完成度の高いアプリケーションを作れるか、正念場だ。

2009/05/26

でぃくしょなり。

やはり難しい。
dictionaryへの登録は簡単に出来たが、それ以降の読み出しがうまくいかない。

NSNumber *number2 = [NSNumber numberWithInt:2];
NSString *startArea2 = [[NSString alloc] initWithFormat:@"pt.x > 195 || pt.x < 252 || pt.y < 45"];
NSString *goalArea2 = [[NSString alloc] initWithFormat:@"pt.x > 195 || pt.x < 252 || pt.y < 45"];
NSMutableDictionary *dict2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
number2, @"number",
startArea2, @"startArea",
goalArea2, @"goalArea", nil];
[roadArray addObject:dict2];


NSNumber *number3 = [NSNumber numberWithInt:3];
NSString *startArea3 = [[NSString alloc] initWithFormat:@"pt.x > 253 || pt.x < 286 || pt.y < 50"];
NSString *goalArea3 = [[NSString alloc] initWithFormat:@"pt.x <> 440"];
NSMutableDictionary *dict3 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
number3, @"number",
startArea3, @"startArea",
goalArea3, @"goalArea", nil];
[roadArray addObject:dict3];


NSNumber *number4 = [NSNumber numberWithInt:4];
NSString *startArea4 = [[NSString alloc] initWithFormat:@"pt.x > 122 || pt.x < 154 || pt.y < 40"];
NSString *goalArea4 = [[NSString alloc] initWithFormat:@"pt.y < 460"];
NSMutableDictionary *dict4 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
number4, @"number",
startArea4, @"startArea",
goalArea4, @"goalArea", nil];
[roadArray addObject:dict4];






そして実際にdictionaryの値をif文に実装するテストを行った。
まだdictionaryの値を読み出す事には成功していないので、NSString型の変数に既にdictionaryから値が読み込まれたと想定してテストをした。

NSString *startAreaaaa = [[NSString alloc] initWithFormat:@"pt.x > 224 && pt.y < 100"];
if( startAreaaaa ){
NSLog(@"通過。" );
startImageView.center = CGPointMake(pt.x, pt.y);
moveFlg = 1;
}

しかし、if文の条件式を読み込んでくれない。。。
NSLogでは「通過」と表示されるので確実にif文は通っているのだが、どうやら条件をスルーしてしまうようだ。
あらゆる対策をしてみたが、効果はなかった。

アルゴリズムを変えていく必要があるかもしれない。


明日はそのアルゴリズムの構想からしていこうと思う。

2009/05/24

コースを追加

今日できたこと
・1つ目のコースをクリアした時に次のステージをランダムで選択して表示。

昨日の報告にも書いたアラートのボタンを押した時の命令に変更を加えた。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (gameState == 1){
NSLog(@"成功して押されたよー(・∀・)");
//T-Note Go to next stage's "startImagePoint".

srandom( abs( time( nil ) ) );
int i;
NSString *imageNumber;
for (i = 0; i < 12; i++){
int index = random() % 12 + 1; //ランダムで1〜13の値を割り出す
imageNumber = [[NSString alloc] initWithFormat:@"road%d.jpg", index]; //割り出した値から画像名を生成
}
[contentView setImage:[UIImage imageNamed:(imageNumber)]]; //画像を読み込む
startImageView.center = CGPointMake(280,50);
}

if (gameState == 2){
NSLog(@"失敗して押されたよー(・∀・)");
startImageView.center = CGPointMake(280,50); //go to road1's "startImagePoint"
}
}

昨日の報告でいう1と2の内容を達成した。

始めのうちは元々あったビューと新しい画像を含んだビューを入れ替えようと思っていたが、画像そのものを入れ替えた方が手っ取り早いことが発覚し、その方法を選択する事にした。

外見的にはたいした変化は起こっていないが、確実に前進している。スクリーンショットを撮っても変化は分かりにくいと思うので、今回は載せないでおく。。。


その他の時間はサンプルコードを見てdictionaryの使い方を研究したが、具体的な実装まではほど遠い。
あまり時間もないので、早く仕上げねば。
今回のコードでいう startImageView.centerに代入する値をdictionaryで管理しようと思っているので、それさえ出来ればイライラ棒のゲームとしてはほぼ完成品と言えるのではないかと思う。

これからはコードも増えてきたので、メモリ管理も視野に入れながら研究を進めていきたい。
ObjectAllocの項目を見ると、コースが変わるたびに使用メモリも増えているようだ。画像を入れ替えているだけなのに。。。
まだまだ解放すべきメモリはたくさんあるはずだ。課題がまた一つ増えた。

Touches canceledの謎は、、何でもないです。

これより帰還します。

2009/05/23

成立。

今日は書く事があまり多くないが、少しでも報告しておこうと思う。


今日できたこと
・ゴール地点に到達した時にアラート表示(=ゲームの流れ完成!!!)
・ゴールした時と失敗した時のアラートで、ボタンをタッチした時の処理を違うものに。

ようやくイライラ棒がゲームをしての流れを持つようになった。
スタート地点をタッチ→決められた範囲内を進む→ゴール地点に到達



ここからはコースの画像を変更して、次のステージに進められるようにしていこうと思う。

今日の大きな変更点は、アラートのボタンを押した時の処理を変えるしたことだ。
ただし、このメソッドは「アラートのボタンを押した時の処理」として認識されるので、どのタイミングで表示されたアラートでボタンを押しても同じ命令をしてしまうというのが欠点だ。

そこでgameStateというint型の変数をフラグとして作成し、デフォルトでは「0」を、成功した時は「1」を、失敗した時は「2」を代入するようにした。
そうすることにより、同じメソッド内でも違う処理ができるようになった。



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (gameState == 1){
NSLog(@"成功して押されたよー(・∀・)");
// うんとか。 //go to next stage's "start position".

}

if (gameState == 2){
NSLog(@"失敗して押されたよー(・∀・)");
startImageView.center = CGPointMake(280,50); //go to road1's "start position"
}
}



他のメソッドを使えばボタンごとに命令を変える事はできたかもしれないが、今は自分に使えるものを最大限に活用していこうと思う。

明日以降こそはdictionaryやArrayを使って画像の読み込みやスタート・ゴール地点の座標を簡単に指定できるようにしたい。今考えているアルゴリズムは次の通りだ。

1、ランダム変数で値を1つ決める(画像の枚数)
2、画像はすべて「roadX.jpg」として保存してあるのでXの値で画像を決めて読み込む(Xは1〜10)
3、さらにその値をキーとして保存しているdictionaryからスタート地点とゴール地点の座標を読み込む

今は座標を具体的な値で設定しているが、その部分を変数にすれば可能だ。

明日以降はこのサンプルでdictionaryの使い方を学び、イライラ棒にも反映できるようにしたい。

2009/05/22

いよいよ

今日は約10時間後にAppleからお客さんを迎えてのプレゼンテーション。
ここ最近でプレゼンは2回目なので内容としては大丈夫そうだが、やはり緊張してしまう。

今すぐにでも帰りたいところだが、まずはいつも通り報告をしておこうと思う。


今日できたこと
・リセットボタンの実装(アラートのボタンからゲーム状態をリセット)
・カーソルの追加(指の位置がわかりやすいように、スタート位置に設定した画像をそのままカーソルとして使うことにした)
・スタート位置の固定(最初のタッチ時にカーソル以外にタッチしても何も動作しないようにした)
・アラート出現の条件の追加(コースアウトに加えてクリアしない状態で指を離してもアラートを表示して失敗にするようにした)


今日は基本的なゲーム構成を考えるほかにも、実際にプレイヤーがやりやすように見た目にも配慮した。
また、友人に依頼してイライラ棒のコースマップとなる画像も作ってもらった。

これでコースの数はそろったので、これからはコースに応じてスタート地点とゴール地点の設定をしていきたい。
今現在、スタート地点のみを具体的な座標で指定しているのだが、すべての画像に対してそうしてしまうとコードの量が膨大になてしまう。
なので、「画像番号、スタート地点の座標、ゴール地点の座標」をキーとしたdictionaryを作ってみようと思う。

最初にコースの座標を読み込むときにランダム関数を用い、それから出た値をもとに画像やその座標も一気に指定する仕様にしていく。

dictionaryの構成はしたことがないが、今までに見てきたPDFやサンプルコードでは何度もみてきているのでその知識を活かしていきたい。

最後に、今日完了した作業のスクリーンショットを投稿してさっさと帰宅しようと思う。




初期画面。右上のカーソルをタッチしてゲームが開始する。
今の状態では「指を離す、黒い線をはみ出る」という時に失敗のアラートが表示されるようになっている。




失敗時に表示される2つのアラート。
「リトライする」を選択するとカーソルが右上の元の位置に戻る。

2009/05/21

リセット!!!

今日は追加した画像に対してアルファ値を下げて点滅させるアニメーションを付けることにした。

アニメーションは以前にBeginning Cocoa Programming for Mac and iPhoneで勉強したことが合ったので、簡単に付けられると思ったが苦戦してしまった。

遠藤さんのアドバイスによりアニメーションを付けたい箇所(Placard)は、[UIView beginAnimations:nil context:nil];と[UIView commitAnimations];で直接囲む必要があると分かった。
サンプルで見てきてこの命令を使うことは知っていたが、使い方はまだマスターしきれていなかった。
使い方を間違っていたせいでアラートにまでアニメーション効果が付いてしまった。。。

画像だけでこの暴れっぷりを表現しきれないのは非常に残念。。。


ゲーム開始前は左上。(タッチをしていない)


ゲームを開始する(タッチして道を進み始める)と左下に移動。



こういった事もあり、今日の進み具合は大きいものではなかった。
Appleからのお客さんに発表まで(するかどうか確かではないが)あと2日。
いや、1日?そこら辺はご愛嬌で。

とにかく金曜日にはアプリケーションを形にしなければいけない。




次のステップは、ゲームとしての流れを付けたい。
そこでアラートのメッセージからゲームをリセットできる機能をつけていこうと思う。
左下にある画像を右上に戻したり、選択肢によってはアプリケーションを終了させることをしたい。
他にも前回の報告で述べた機能を1つでも多く実装していきたい。



このアラートに機能を追加したいと思う。

2009/05/20

そういえば

具体的にイライラ棒がどこまで出来ているかを報告していなかったような気がする。
なので、一括で報告しようと思う。



今日できたこと
まだ基礎的な機能しか付いていないが、Erica Sadun方式のプロジェクトにイライラ棒を完全移行することに成功した。
黒い線をなぞっていき、線から指が外れるとアラートが表示される。今の状態だと「黒い線を含み、縦480×横320ピクセル、jpg形式」という要素さえそろっていれば万能に使えるので、拡張性はとても高いと思う。
また、ようやくViewに画像を加えることができた。座標も指定しているので使い方はいろいろあるはずだ。(画像左上の赤い丸ポチ。)



明日以降の作業
基礎的なシステムは出来上がったので、これからは見た目の良さやゲーム性を持たせていこうと思う。

具体的には以下の点が上げられる。
☆見た目の要素
・スタート位置にアニメーション付きの画像を配置してスタート地点をアピール
・失敗時にViewを変色させるエフェクトを付ける
・指がはみ出た地点に画像を配置して爆発のエフェクトを付ける


☆ゲーム的要素
・スタート地点に指を置くまではそれ以外の場所にタッチしても無効にする
・タイマーにより時間を計測し、スコア計算や制限時間の設定に使う
・指がある位置を分かりやすくする
・アラートに表示されるないように従ったメソッドの追加(ゲーム終了 or 継続)



このように今日の研究時間でたくさんのアイディアが思い浮かんだのは朗報だが、問題はそれらをどれだけ実現させるかだ。。。


※研究方法について
これからは「イライラ派生表」というものを作り、これまでに作ってきた過程すべてのバージョンを管理、保存することにした。「イライラ派生表」の内容はプロジェクト名とその概要、完成した日付。
Xcodeに付いているスナップショットを使えばいいのだが、以前うまく復元できなかったことがあったのでこういった古典的かつ確実な方法でバックアップを残すことにした。


明日からはnewira3.0からの開発になる。
iPhone OSと同様、良い意味で大きな改変があればと思う。

2009/05/19

今日の変更

Erica SadunのHelloWorldにMoveMeの要素を追加していくことにした訳だが、まずは- (void) drawRect: (CGRect) aRectの内容をコメントアウトしてCrossHairを表示しないようにした。


そのうえでMoveMeのようにPlacard.pngを表示させようとして、

-(id)init
{
UIImage *image = [UIImage imageNamed:@"Placard.png"];
CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);
if (self = [self initWithFrame:frame]) {
self.opaque = NO;
placardImage = image;
}
}

という内容を書き加えたが、まだ画像は表示されない。まだPlacard.pngをViewに追加していないのが原因と思われる。
MoveMeの解析が不十分なため、それに関するの解析を進めていくべきだが渡米まで時間がない。

なので、まずは基本的な完成形態を目指すためにPlacardを表示させない状態でイライラ棒を作っていこうと思う。

すると、今の状態で最低限必要な項目は以下の通りになる。

・道からはみ出した時に表示させるアラートとその後の処理
・アラートと同様に失敗を告げる何らかの見た目の変化


まずはこれさえ達成すればイライラ棒として形にはなる。
明日はゼミなので、先生にこのことを報告したうえでアラートの実装をしたいと思う。

2009/05/18

この2日間の動向

16日
昨日は荒木先生とHelloWorldとMoveMeの融合について6時間近く話し合った。


先生と話しながら、決めたことがいくつかある。
1、開発をするにあたって複数の変更を同時に行わない
今回の先生への相談でハッキリしたことだが、変更をあまり多くしすぎるとどこで間違ってしまったのかを把握できなくなってしまう。当然のようなことだが、言われるまで気がつかなかった。クラス1つをコピーするだけでも相当大きな変更だと教えられた。

2、発想の転換
初めはMoveMeに対してHelloWorldの要素を取り込むつもりでいたが、結局自分が行った作業を復元できずにMoveMeに対してHelloWorldの要素を取り込んでいくことにした。
今回は時間もないので、今現在で可能性が少しでも高い方にシフトしていくことにした。
将来的にアプリケーションを拡張していくにあたってコードの量が増えてくるとmain.mだけに記述することは困難になってくるだろうが、それまでには完全にクラス別に記述できるようにしたい。


そういった訳で、これからはMoveMeの内容を出来る限りHelloWorldに移植していきたい。
まずは新規プロジェクトを作成して無の状態からエリカサドゥーンのサンプルに近づけていくことにした。

初めに新規プロジェクトを作成し、main.mにHelloWorldの内容を書き加える。
そして他のクラスやnibファイルは必要がないので参照を削除し、必要な画像を取り込む。
そういった作業をすることでエリカサドゥーンのHelloWorldを復元することが出来た。

基礎は出来上がったので、次のステップとしてMoveMeで使われている画像(Placard.png)を表示できるようにしていこうと思う。




17日
前日の時点では画像を表示させることを目標として掲げたが、今日はXcode、iPhoneOS、iTunesをアップデートすることにした。

WWDC2009のホームページで公開されているセッションとラボを確認するとかなりの数になっていて、その中で自分が受けたいものをチョイスした際に「ピアツーピア」などの最新OSに関する項目が多かった。
そこで自分でもOSをアップデートしておき、少しでもその情報に対応できるようにと思ったためだOSのアップデートを行った。

本来はSDKやiTunesのアップデートを行ってからでないとiPhone OSのアップデートは出来ないのだが、手順を間違ってしまいiPhone OSのアップデートからしてしまった。そのためOSのインストール中にエラーが発生してしまい、iPod touchをリセットしなければいけなくなった。
アプリケーションや曲のデータが消えてしまったが、それほど大きな問題でもないのでそれに関しては気にしないでおく。

iPod touchを復旧させ、無事にすべてのインストールが完了したので実際にコードを走らせることにした。

所持するすべてのプロジェクトを実行した訳ではないが、ほとんどのプロジェクトは問題なく実行できた。
しかし、元々改造を加えていた「衣良衣良」のみエラーが発生して実行できない。


このようなエラーが発生した。
どうやらプロジェクトフォルダに作成されるbuildというフォルダに含まれる実行ファイルに問題があるようだ。
Xcodeでクリーンアップをしたり、プロジェクトをコピーしてファイルの名称を日本語から英語表記に変更したり、参考にしている本家のMoveMeからinfo।plistをコピーしてきたりしても問題は解決しなかった。

そして、不意に「アクティブなビルド構成を設定」という項目をDebugからReleaseに変更したところ、なぜか他のプロジェクトと同様に起動するようになってしまった。


一体これはどういうことなのだろうか。。。
これに関して詳細な研究をしてみたいが、今はアプリケーション「イライラ棒」の完成を急ぐ必要がある。

明日以降は研究に対して今日以上に時間を割いていきたい。

2009/05/16

報告 15日分

研究目的

ネイティブアプリケーション「イライラ棒」の開発



これまでの作業内容

サンプルコード「MoveMe」「HelloWorld」の解析。
MoveMeからはアイコンの画像をタッチしている指に追尾させるメソッド、HelloWorldからはタッチしている場所の色情報(RGB)のを取得する方法を勉強。

HelloWorldのコードはmain.mのみで構成され、nibファイルを用いていない。
そこで、複数の.hファイルと.mファイル、そしてnibファイルから成るMoveMeにHelloWorldの内容を移植する作業の途中で今日の作業を終了とする。

Helloworldのmain.mは下の4つのクラス(SampleAppDelegate、HelloControllr、BitMapView、CrossHairView)と2つの宣言(unsigned char *RequestImagePixelData、CGContextRef CreateARGBBitmapContext (CGImageRef inImage, CGSize size) )で構成されていることが分かった。

SampleAppDelegateの内容をMoveMeAppDelagate.mに、残りのクラスと宣言をMoveMeView.mに書き込んだ。

ビルドと実行まではうまくいったが、コンソールで読み取る値がおかしい。
なおかつ画面上で一定以上のY座標の高さに指をなぞらせるとどの値も0しか表示しなくなり、何らかエラーでデバギングも終了してしまい事態が発生した。

きっと読み取るべきViewを間違っているのだと思う。

そこで、明日はこの2つの違いについて解析していくことから始める。

MoveMeAppDelegate.m
- (void)applicationDidFinishLaunching:(UIApplication *)application {
UIViewController *aViewController = [[UIViewController alloc] initWithNibName:@"MoveMeView" bundle:[NSBundle mainBundle]];
self.viewController = aViewController;
[aViewController release];
UIView *controllersView = [viewController view];
[window addSubview:controllersView];
[window makeKeyAndVisible];
[application setStatusBarHidden:YES];
}



HelloWorld内のmain.m
@implementation SampleAppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {
UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
HelloController *hello = [[HelloController alloc] init];
[window addSubview:hello.view];
[window makeKeyAndVisible];
[application setStatusBarHidden:YES];
}

他にも移植した際に不手際があったかもしれないので、それに付いても1から検討し直していきたい。

これから

WWDCに参加するにあたり、昨年と同様にブログを書いていくことにした。

内容はその日に行った研究の内容。
まずは、次の記事で今まで行った研究内容と現状について書いて以降と思う。