座標の違いと取得方法(絶対・相対・オブジェクト)

      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

「もっと詳しく!」「こうできないの?」この記事に関連する質問や要望があればコメントで聞こう。

 - TIPS , , , , , , , , , , , , , , ,