1

処理中、x 量の形状を示すビジュアライゼーションを作成しようとしています。量が非常に大きくなる可能性があり、不確実であるため、プログラムで(ループを使用して)作成したいと考えています。これは次のようになります。

First firstDot1;
float offset;
float radius = 0;
float endRad = 100;
float speed = 0.1;
String[] lines,colors;

void setup(){
    size(800,600);
    smooth();
    background(255); 
    firstDot1 = new First(5);
}

void draw(){
    background(255);
    for(int z=0; z<36; z++){
        offset = z * 10;
        firstDot1.display();
        firstDot1.start(offset);
    }
}    

class First{
    float angle;
    int id;
    float eRad = 5;
    float xpos, ypos, rad, i;
    Boolean start = true;

    First(float tempAngle){
        angle = tempAngle;
    } 

    void display(){
        noStroke();
        fill(247,147,30); 
        ellipseMode(CENTER);
        ellipse(xpos, ypos, eRad, eRad);
    }

    void start(float offset){
        if(i<endRad){
            i = i+speed/2;
            xpos = width/2 + cos(radians(-angle+offset))*(radius+i);
            ypos = height/2 + sin(radians(-angle+offset))*(radius+i);
        }
        else{
            turn(offset);
        }
    }

    void turn(float offset){
        angle = angle-speed/50;
        xpos = width/2 + cos(radians(-angle+offset))*(endRad);
        ypos = height/2 + sin(radians(-angle+offset))*(endRad);  
    }
}

これは、36 個の楕円を表示することで正常に機能します。簡単にするために、1 つの円をクリックしてその色を変更したいとします。

現在のコードでこれを達成するにはどうすればよいですか? または、これらのオブジェクトを個別に操作できるように、これらのオブジェクトをプログラムで (すべて手動で定義せずに) どのように作成できますか?

4

1 に答える 1

3

First オブジェクトの配列を作成する必要があります。

First[] dots = new First[36];//declare and initialize an array of First object with size/length 36

次に、配列内の初期化オブジェクトが必要になります。

for(int i = 0 ; i < dots.length; i++) dots[i] = new First(5);

その後、array notation( []) を使用して、配列内のオブジェクトに名前でアクセスできます。Examples > Basics > Arrays > ArrayObjectsも確認してください。それはまさにあなたが探しているものです。

オブジェクトとの相互作用に関しては、各オブジェクトからのマウスの位置とマウスの状態 (押されているかどうか) を追跡して、それに基づいてオブジェクトの状態を更新できます。ホバーの基本的なアプローチは、マウスからオブジェクトまでの距離がオブジェクトの半径よりも小さいかどうかを確認することです (これはオブジェクトに適しています)。マウスが十分に近く、押されている場合は、オブジェクトの状態を更新して、押されたことを示すことができます。

試すコードは次のとおりです。

First[] dots;
float offset;
float radius = 0;
float endRad = 100;
float speed = 0.1;
String[] lines,colors;

void setup(){
    size(800,600);
    smooth();
    background(255); 
    dots = new First[36];
    for(int i = 0 ; i < dots.length; i++) dots[i] = new First(5);
}

void draw(){
    background(255);
    for(int z=0; z<36; z++){
        offset = z * 10;
        dots[z].update(mouseX,mouseY,mousePressed);
        dots[z].display();
        dots[z].start(offset);
    }
}    

class First{
    float angle;
    int id;
    float eRad = 5;
    float xpos, ypos, rad, i;
    Boolean start = true;

    color up = color(247,147,30);
    color over = color(0);
    color down = color(217,117,0);
    boolean isOver,isDown;

    First(float tempAngle){
        angle = tempAngle;
    } 
    void update(int mx,int my,boolean pressed){
      isOver = (dist(mx,my,xpos,ypos) < eRad);
      isDown = pressed;
    }

    void display(){
        noStroke();
        fill(up);//default
        if(isOver) fill(over);
        if(isOver && isDown) fill(down);
        ellipseMode(CENTER);
        ellipse(xpos, ypos, eRad, eRad);
    }

    void start(float offset){
        if(i<endRad){
            i = i+speed/2;
            xpos = width/2 + cos(radians(-angle+offset))*(radius+i);
            ypos = height/2 + sin(radians(-angle+offset))*(radius+i);
        }
        else{
            turn(offset);
        }
    }

    void turn(float offset){
        angle = angle-speed/50;
        xpos = width/2 + cos(radians(-angle+offset))*(endRad);
        ypos = height/2 + sin(radians(-angle+offset))*(endRad);  
    }
}

また、例>トピック> GUI>ボタンもチェックしてください

于 2012-07-31T19:27:12.913 に答える