はじめに

前回のTouchMe!を軽く改良します。ボタンをタッチするとボタンの位置がランダムに変更されるように改良して行きましょう。

乱数の実装

"random() % n"と記述することで0~nまでの乱数を得ることが出来ます。これを利用してランダムな座標を取得する関数を作成します。

 
CGPoint getRandomPoint() { 
	NSInteger width = [[UIScreen mainScreen] applicationFrame].size.width;
	NSInteger height = [[UIScreen mainScreen] applicationFrame].size.height;
	return CGPointMake(random() % width, random() % height);
}
 

これでスクリーン内でのランダムな座標を取得することが可能になります。ついでにスクリーンの中央の座標を取得する関数も作成しておきましょう。

 
CGPoint getCenterPosition() {
	CGFloat width = [[UIScreen mainScreen] applicationFrame].size.width;
	CGFloat height = [[UIScreen mainScreen] applicationFrame].size.height;
	return CGPointMake(width/2, height/2);
}
 

座標を効率よく得られる関数が思いついたならそちらを利用して構いません。上記のコードはあくまで一例です。作成した関数は"TouchMeViewController.m"の任意の行に追加しておきましょう。

ボタン座標の変更

ボタンを宣言プロパティで実装します。こうすることによってUIButtonクラスのプロパティを明示的に宣言することが出来るようになります。

TouchMeViewController.hに以下のように書き加えます。

 
#import <UIKit/UIKit.h>
 
@interface TouchMeViewController : UIViewController {
	IBOutlet UIButton *button;
	NSInteger cnt;
}
 
- (IBAction)pushButton:(UIButton *)sender;
 
@property(nonatomic, retain) UIButton *button; // この行を追加
 
@end
 

TouchMeViewController.mに以下のように書き加えます。

 
 
#import "TouchMeViewController.h"
 
@implementation TouchMeViewController
@synthesize button; // この行を追加  
 
- (void)viewDidLoad {
    [super viewDidLoad];
	[button setTitle:@"touch me!" forState:UIControlStateNormal];
	button.center = getCenterPosition(); // この行を追加
}
 
- (IBAction)pushButton:(UIButton *)sender {
	cnt++;
	NSString* str = [NSString stringWithFormat:@"%d",cnt];
	[button setTitle:str forState:UIControlStateNormal];
	button.center = getRandomPoint(); // この行を追加
}
 

@propertyと@synthesizeの宣言でドット演算子によるプロパティへのアクセスが可能になりました。そこで、UIButtonクラスはUIViewクラスを継承しているので、UIViewクラスのcenterプロパティを利用して、関数で手に入れた座標をボタンの中央の座標に代入しているのです。

ボタンの状態

UIButtonクラスでは、setメソッドを使用することでボタンのそれぞれの状態に対応した異なる外観を指定することが出来ます。前回はボタンを押した時、UIControlStateNormal即ち通常状態時のタイトルを変更するように設定していました。ボタンがボタンを押されるまで"touch me!"とユーザを催促するように、ボタンが押されている時だけ、つまりハイライトされているときだけテキストが変更されるようにしてみましょう。

[button setTitle:str forState:UIControlStateNormal];
                   ↓
[button setTitle:str forState:UIControlStateHighlighted];

ちなみに各状態の初期のタイトルはIBで設定可能です。そちらを利用してもよいでしょう。さて今回の改良はここまでです。

実行

早速実行してみましょう。 TouchMe_5.png

画像ではわかりづらいですが、タッチするたびにボタンの位置が変更され、ハイライト時にボタンを押したカウントが表示されるでしょう。次回はタイマー等を実装してこれにゲーム性を付加してみることにします。


添付ファイル: fileTouchMe_5.png 912件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-10-24 (日) 17:14:25 (2526d)