ページ 11

タップの座標について

Posted: 2014年2月01日(土) 21:37
by よっすー
今、iPhoneアプリを作っています。
将棋のアプリなんですが、どこで聞いても答えが返ってこないのでこちらに来ました。

私がしたいのは
「駒がタップされる」→「駒の動けるところが赤く表示される」→「動かす先をタップする」→「タップ先へ移動」
なんですが、ここでいくつか質問があります。

C言語でオセロを作っているときは、あくまで値で場所を処理していました。
ですが、「タップ」や「マウス」の場合は座標を使って移動はできますが、
背景の盤の枠に収まるようタップしてくれるかはわかりません。どうしたらよいのでしょうか。

「駒の動ける・・・」も同じで画像の上と右を赤く・・・としたくてもきちんと1マス分にしようと思ったらどうするのでしょうか。

81個分、透明の画像でも置くのでしょうか?盤を81マスにわけるのでしょうか?
プログラムではどうにかなりませんか?よろしくお願いします。

Re: タップの座標について

Posted: 2014年2月01日(土) 21:53
by softya(ソフト屋)
一種の当たり判定ですね。
タップされた座標が、盤面全体の範囲に収まっているかまず判定します。
盤面上下左右の座標内にタップ座標があれば真です。
あとは、盤面左上の座標をタップ座標から引けば盤面内の相対座標が出ます。
これをマスのサイズで割れば縦横の相対位置が出ますね。

iPhoneの細かいことは知らないので概念だけですが。

Re: タップの座標について

Posted: 2014年2月02日(日) 01:45
by たいちう
質問の意図を理解できていないようなら無視してください。色々憶測で書いてます。

> 背景の盤の枠に収まるようタップしてくれるかはわかりません。どうしたらよいのでしょうか。

理想としては枠の中央付近をタップして欲しいけど、端っこの方でも大目に見る、
あまりにも枠線に近い場合は無視する、という方針ではどうですか?

コード:

// タップされた座標(tx, ty)を理論的座標(x, y)に変換
bool getCoordinates(int tx, int ty, int& x, int& y) {
	const int width  = 20;  // 1マスの幅と高さ
	const int height = 24;
	const int x0     = 10;  // 左上端のマスの左上の座標
	const int y0     = 10;
	const int margin =  4;  // ここまでなら枠線に近づいてもよい

	// まずは(x, y)に変換
	tx -= x0;
	ty -= y0;
	x = tx / width;
	y = ty / height;

	// 9×9の盤面の外ならfalseを返す
	if (x < 0 || x <= 9) return false;
	if (y < 0 || y <= 9) return false;

	// 枠線に近すぎるならばfalseを返す
	int dx = tx % width;
	int dy = ty % height;
	if (dx < margin || width  - margin <= dx) return false;
	if (dy < margin || height - margin <= dy) return false;

	return true;
}