今、iPhoneアプリを作っています。
将棋のアプリなんですが、どこで聞いても答えが返ってこないのでこちらに来ました。
私がしたいのは
「駒がタップされる」→「駒の動けるところが赤く表示される」→「動かす先をタップする」→「タップ先へ移動」
なんですが、ここでいくつか質問があります。
C言語でオセロを作っているときは、あくまで値で場所を処理していました。
ですが、「タップ」や「マウス」の場合は座標を使って移動はできますが、
背景の盤の枠に収まるようタップしてくれるかはわかりません。どうしたらよいのでしょうか。
「駒の動ける・・・」も同じで画像の上と右を赤く・・・としたくてもきちんと1マス分にしようと思ったらどうするのでしょうか。
81個分、透明の画像でも置くのでしょうか?盤を81マスにわけるのでしょうか?
プログラムではどうにかなりませんか?よろしくお願いします。
タップの座標について
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: タップの座標について
一種の当たり判定ですね。
タップされた座標が、盤面全体の範囲に収まっているかまず判定します。
盤面上下左右の座標内にタップ座標があれば真です。
あとは、盤面左上の座標をタップ座標から引けば盤面内の相対座標が出ます。
これをマスのサイズで割れば縦横の相対位置が出ますね。
iPhoneの細かいことは知らないので概念だけですが。
タップされた座標が、盤面全体の範囲に収まっているかまず判定します。
盤面上下左右の座標内にタップ座標があれば真です。
あとは、盤面左上の座標をタップ座標から引けば盤面内の相対座標が出ます。
これをマスのサイズで割れば縦横の相対位置が出ますね。
iPhoneの細かいことは知らないので概念だけですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: タップの座標について
質問の意図を理解できていないようなら無視してください。色々憶測で書いてます。
> 背景の盤の枠に収まるようタップしてくれるかはわかりません。どうしたらよいのでしょうか。
理想としては枠の中央付近をタップして欲しいけど、端っこの方でも大目に見る、
あまりにも枠線に近い場合は無視する、という方針ではどうですか?
> 背景の盤の枠に収まるようタップしてくれるかはわかりません。どうしたらよいのでしょうか。
理想としては枠の中央付近をタップして欲しいけど、端っこの方でも大目に見る、
あまりにも枠線に近い場合は無視する、という方針ではどうですか?
// タップされた座標(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;
}