座標の違いと取得方法(絶対・相対・オブジェクト)
2016/05/15
UWSCでマクロを組む際に初心者が陥り易い罠の1つが「座標」です。
座標の取得方法、絶対座標・相対座標の違いなど。
絶対座標
絶対座標とは、横をx軸、縦をy軸とした画面全体の座標です。
今このサイトを見ているモニタの極限まで左上の地点がx0,y0になります。
図の黄色の点が0,0であり、右に行くほどxが増え、下に行くほどyが増えます。
相対座標
相対座標とは、判りやすく言うとウィンドウから見た座標です。
このサイトを見ているウェブブラウザの極限まで左上の地点が、ウェブブラウザのx0,y0になります。
図のオレンジの点がウィンドウの0,0であり、右に行くほどxが増え、下に行くほどyが増えます。
オブジェクトの座標
相対座標と違い、オブジェクト座標はオブジェクト毎の座標を表します。
例えばゲームを起動していたとすると、タイトルバーとゲームが描写されている部分は別となります。
図の例ではピンクの点を0,0とした範囲がオブジェクトの座標になります。
また、タイトルバーの部分も左上を0,0としたオブジェクトです。
ちなみに、この斜線の範囲の事(ゲームが描写されている部分)をクライアント領域と言います。
今どの座標になっているか理解する
絶対座標はその名の通りいかなる時も絶対的な座標です。
対して相対座標はウィンドウがある場所の左上が0,0となります。
例えばウィンドウモードでゲームを起動していて、絶対座標で700,600の位置に対して PEEKCOLOR をかけて上手くいっても、ウィンドウを動かした瞬間絶対座標としてはズレが生じる為想定どおりの動作をしなくなります。
これが相対座標であればウィンドウをどこに動かしても不変です。
自分が入力した座標はどの座標なのかを理解することが大事です。
相対座標を計算しているのに縦にズレる
間違いなく相対座標を割り出して指定しているのに想定より縦にズレる場合、座標の基準がクライアント領域になっている可能性大です。
こんな関数使ってませんか?
MOUSEORG関数
mouseorg
絶対座標、相対座標を取得する
拾い物ですが、マウスカーソル下の絶対座標と相対座標を表示します。
// CTRLボタンでPRINT表示するスレッド THREAD PRINTSTATE() WHILE True s = GETSTATE() Fukidasi(s, 10, 10, 0) Sleep(0.1) WEND // 情報取得 FUNCTION GETSTATE // カーソル下のウィンドウが対象 ID = GETID(GET_FROMPOINT_WIN) // 絶対座標 x1 = G_MOUSE_X y1 = G_MOUSE_Y // 相対座標 x2 = x1 - STATUS(ID, ST_X) y2 = y1 - STATUS(ID, ST_Y) s = "絶対座標 x:" + x1 + " y:" + y1 + "<#cr>" s = s + "相対座標 x:" + x2 + " y:" + y2 + "" RESULT = s FEND // PRINT表示 PROCEDURE PRINTSTATE WHILE TRUE // CTRLが押されたら IFB GETKEYSTATE(VK_CTRL) PRINT GETSTATE() SLEEP(1.5) ELSE SLEEP(0.1) ENDIF WEND FEND
オブジェクトの座標を取得する
同じく拾い物です。
While True x = G_MOUSE_X; y = G_MOUSE_Y id = GETID(GET_FROMPOINT_OBJ) ofx = x - STATUS(id, ST_X) ofy = y - STATUS(id, ST_Y) moji = "x="+ofx + ", y="+ofy Fukidasi(moji, x, y, 3) Sleep(0.5) Wend