私はあなたの質問の例から始めました。複数の図形を描画する場合、いくつかの主な違いがあります。
- カーソルが各形状内にあるかどうかを確認する必要があります。
- それぞれの形を描く必要があります。
- 重なりを気にしたくなるかもしれませんが、私は気にしませんでした。
次のコードでは、例に直接基づいていますが、クリックするとボックスの色が変わる数行を削除し、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;
}
}