2009/06/04

タイマーできた!

またもや初期化が原因でした。。。
辞書を導入する時にも初期化をしないせいでおかしなエラーが起こっていた気が。。。

http://freeek.jp/blog/iphone/117/
ここのページを参考にして作っていった訳だが、初期化ナシでは動く訳がない。
まねっこしようとした自分のミス。

- (void)touchesBegan:の中で、startTime = [[NSDate alloc] init];の1行を追加しただけでうまくいくようになった。

そしてゲームをクリアした瞬間の時刻を計測するためにNSTimeInterval saTime = -[startTime timeIntervalSinceNow];を記述。

すると、このような画面に。



今日の新しく出来た事はこれくらい。
ついに明日、出発。

2009/06/03

昨日は報告書を仕上げていたので報告ナシです。

タイトルの通り、昨日はコードには一切触れなかった。

今日でその分を取り戻そうとしたが、どうもうまくいかない。。。
今回の壁はNSTimer。ゲームをクリアするのにかかった時間を計測するためにNSTimerを実装した。

//タイマーの宣言。0.1秒刻みで計測を行う。
timer = [NSTimer scheduledTimerWithTimeInterval:(0.01)
target:self
selector:@selector(onTimer:)
userInfo:nil
repeats:YES];

//タイマーの実装。チュートリアルを除く2回目以降のゲームで指が触れている時に処理を行う。
- (void)onTimer:(NSTimer*)timer {
if(moveFlg == 1 && gameCount != 0){
storeTime += 0.01;
statLabel.text = [[NSString alloc]initWithFormat:@"%.2f秒経過",storeTime];
}
}

このような記述をすると、とりあえず動作した。
しかし、指の移動するスピードが早くなると正確な時間を刻まなくなった。
そのため、異なるアルゴリズムで時間を計測する事にした。

そこで使ったのが、
NSTimeInterval saTime = [startTime timeIntervalSinceDate:nowTime];
という「startTime」と「nowTime」の差分を求めるメソッド。


ここで使われる引数は
NSDate *startTime;
startTime = [NSDate date]; //画面に触れたときに実行

NSDate *nowTime;
nowTime = [NSDate date]; //ゲームををクリアしたときに実行
というように画面に指を触れた瞬間とゲームをクリアした時の時刻を計測したもの

時間を常に更新し続けるのではなく2回しか時間を計測しない事から、前に作ったタイマーよりも処理の回数が少なくなると思ったのでこれを使おうと思った。

timeIntervalSinceDateで時間の差を求める処理ができていないようだ。。。
デバッギングしてもその時点で処理落ちしてしまう。今日はこの方法を実装するためにかなりの時間を割いてしまった。
だが未だに実装できていない。。。

WWDCまで時間もあまりないので、時間を計る違うアルゴリズムを構築するか、それ以外にも追加する機能を考えてみようと思う。

2009/06/01

外見の変更

今日は主に外見の変更をした。
今まではイライラ棒ゲームそのものの動作に付いてコードを書いてきたが、そろそろそれ以外のジャンルにも手を伸ばす事にした。

まずはdefault.pngの追加。
具体的な構造はどうなっているかまだ分かっていないが、こういった名前の画像ファイルをプロジェクトに追加するとアプリケーションが起動する際にその画像が表示されるようになる。もはやこれはAPIうんぬんとかいう問題ではないのだろうか。


次に、アプリケーションが起動した際の外見も変更した。

- (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];

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"某テレビ番組で有名になったイライラ棒です。\nまずはチュートリアルを行ってから、、、\nゲームスタート♪ "
delegate:self cancelButtonTitle:@"工事中" destructiveButtonTitle:@"Let's★イライラ" otherButtonTitles:nil];
actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
[actionSheet showInView:window];
[actionSheet release];
}

このようにしてapplicationDidFinishLaunchingの中でアラートを起動させると、

このような画面が表示されるようになる。
今後は「工事中」の項目からオプションの機能もつけていきたい。

ここからゲームを開始して、最初のコースはチュートリアルとして使っていこうと思う。
チュートリアルとして使うために、ラベル(statLabel)を追加する事にした。

 statLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 200, 100)];
UIFont *displayFont = [UIFont fontWithName:@"Times New Roman" size:22];
statLabel.font = displayFont;
statLabel.textColor = [UIColor blackColor];
statLabel.backgroundColor = [UIColor redColor];
statLabel.textAlignment = UITextAlignmentLeft;
statLabel.adjustsFontSizeToFitWidth = YES;
statLabel.numberOfLines = 4;
statLabel.text = @"1. Touch the cursor.";

この画像は指定した範囲内でカーソルをタッチした時の状態。
始めは1つ目の画像にもあるように、カーソルをタッチしろという記述がありタッチをすると2つ目の画像のようにラベルが切り替わる。また、画像で背景が赤くなっているのはラベルの範囲を確認するためであり、本来は statLabel.backgroundColor = [UIColor clearColor];というプロパティで透明にすることにしている。

ここで苦労したのが改行についてだ。
今回はstatLabel.numberOfLines = 4;というプロパティの変更によりラベルは4行になり、改行をしてもそのまま文章が表示されるようになっている。しかし、このプロパティを変更しないとラベルは1行のままで、文章が途中で途切れてしまう。

これからはラベルの内容に変更を加えたりアニメーションも付ける事でチュートリアルとして分かりやすいものに仕上げていこうと思う。

他にも前のままだと指の現在位置が把握しづらかったので、移動させるカーソルの画像の変更もした。


また、そろそろErica式のプロジェクトから本来のプロジェクト形式に引っ越す事も視野に入れていくことにする。
コードの量が増えてきた事もあるが、まずはクラスを明確に分ける事でプロジェクトそのものの全体像も見えてくるからだ。


どれだけやっても研究すべきことが出てきて止まない。

空も明るくなってきたので、帰還します。