0

ボックスのドラッグに関するこのスケッチをプロジェクトに実装したいと思います。

1 つのボックスの代わりに、フォーム内に異なる座標で描かれた複数の円があります。

  ellipse(lemma23.x, lemma23.y, diameterLemma23, diameterLemma23);

  ellipse(law3.x, law3.y, diameterLaw3, diameterLaw3);

  ellipse(law2.x, law2.y, diameterLaw2, diameterLaw2);

カーソルがいずれかの円の上にあるかどうかをテストするにはどうすればよいですか?

これが私のプロジェクトのスクリーンショットです:

ここに画像の説明を入力

カーソルが円の上 (または近く) にあることをテストして、ドラッグして位置を変更できるようにしたいと考えています。

スケッチ全体は Pastebin にあります。

4

2 に答える 2

1

私はあなたの質問の例から始めました。複数の図形を描画する場合、いくつかの主な違いがあります。

  1. カーソルが各形状内にあるかどうかを確認する必要があります。
  2. それぞれの形を描く必要があります。
  3. 重なりを気にしたくなるかもしれませんが、私は気にしませんでした。

次のコードでは、例に直接基づいていますが、クリックするとボックスの色が変わる数行を削除し、MovingEllipse複数の楕円を簡単に描画できるようにコードをクラスに再編成しました。(このコードは 2 つの楕円を描画します。)

のコードはdraw()各楕円のマウスの位置をチェックすることに注意してください。ただし、これは改善できると思います (つまり、楕円位置の配列を作成し、配列をループすることで)。また、このコードが正しく機能するためにはmousePressed、メソッドをmouseReleasedメソッドのようにコピーする必要がありますmouseDragged。(例を簡潔にしようとしました。)

とにかく、これは複数の楕円を描画し、どれを移動する必要があるかを検出する 1 つの方法です。それが役に立てば幸い!

int esize = 75;

MovingEllipse e1 = new MovingEllipse(0.0, 0.0, esize, 0.0, 0.0);
MovingEllipse e2 = new MovingEllipse(0.0, 0.0, esize, 0.0, 0.0);

void setup() 
{
  size(640, 360);
  e1.eX = width/2.0;    // Center of ellipse 1.
  e1.eY = height/2.0;

  e2.eX = width/4.0;    // Center of ellipse 2.
  e2.eY = height/4.0;
}

void draw() 
{ 
  background(0);

  // Test if the cursor is over the ellipse. 
  if (mouseX > e1.eX-esize && mouseX < e1.eX+esize && 
      mouseY > e1.eY-esize && mouseY < e1.eY+esize) {
    e1.overBox = true;  
    e2.overBox = false;
  } else if (mouseX > e2.eX-esize && mouseX < e2.eX+esize && 
      mouseY > e2.eY-esize && mouseY < e2.eY+esize) {
    e2.overBox = true;
    e1.overBox = false;
  } else {
    e1.overBox = false;
    e2.overBox = false;
  }

  // Draw the ellipse(s).
  e1.update(e1.eX, e1.eY, e1.overBox);
  e2.update(e2.eX, e2.eY, e2.overBox);
}

void mouseDragged() {
  e1.mouseDragged();
  e2.mouseDragged();
}
// Don't forget to repeat this for mousePressed and mouseReleased!
// ...

class MovingEllipse {
  float eX, eY;             // Position of ellipse.
  int eSize;                // Radius. For a circle use eSize for both x and y radii.
  float xOffset, yOffset;   // Where user clicked minus center of ellipse. 
  boolean locked, overBox;  // Flags used for determining if the ellipse should move.

  MovingEllipse (float ex, float ey, int esize, float xoff, float yoff) {
    eX = ex;
    eY = ey;
    eSize = esize;
    xOffset = xoff;
    yOffset = yoff;
  }

  void update(float ex, float ey, boolean over) {
    eX = ex;
    eY = ey;
    overBox = over;
    // Draw the ellipse. By default, (eX, eY) represents the center of the ellipse.
    ellipse(eX, eY, eSize, eSize);
  }

  void mousePressed() {
    if(overBox) { 
      locked = true; 
    } else {
      locked = false;
    }
    xOffset = mouseX-eX; 
    yOffset = mouseY-eY; 
  } 
  void mouseDragged() {
    if(locked) {
      eX = mouseX-xOffset; 
      eY = mouseY-yOffset; 
    } 
  }
  void mouseReleased(){
    locked = false;
  }
}
于 2012-12-24T05:45:26.847 に答える
0

カーソルと円の中心の間の距離がヒット半径内にあるかどうかを確認するだけです。ヒット半径を円の半径よりも大きくして、近いヒットをキャッチすることができます。

于 2012-12-23T13:47:05.280 に答える