2016-05-17 8 views
0

マウスを左クリックしてオブジェクトを作成し、右クリックしてオブジェクトを1つずつ削除します。以前の質問を見てオブジェクトの追加、保存、削除に関する以前の問題を解決できましたが、ユーザーがクリックした場所にオブジェクトを正確に表示し、正しい座標で各オブジェクトを表示するソリューションを見つけることができませんでした。現在、最初のオブジェクトは(0、0)に表示されていますが、残りは表示されませんが、オブジェクトが正常に作成されたことをコンソールから確認できます。ここに私のコードは次のとおりです。処理3 - ArrayListからオブジェクトを表示する

ArrayList dots; 

void setup() { 
size(500, 500); 
background(255); 
dots = new ArrayList(); 
colorMode(HSB); 
strokeWeight(2); 
} 

void mousePressed() { 
if(mouseButton==LEFT) { 
    dots.add(new Dot(mouseX, mouseY)); 
    Dot temp1 = (Dot)dots.get(dots.size()-1); 
    temp1.create(dotX, dotY); 
} 
if(mouseButton==RIGHT && dots.size()>0) { 
    dots.remove(dots.size()-1); 
} 
} 

void draw() { 
    background(255); 
    for (int i = 0; i < dots.size(); i++) { 
    Dot temp2 = (Dot)dots.get(i); 
    temp2.display(coord[0], coord[1]); 
    } 
    println("Object count: " + dots.size()); 
} 

int dotX; 
int dotY; 
int[] coord = {dotX, dotY}; 

class Dot{ 
    int id; 
    Dot(int dotX, int dotY) { 
    id = dots.size(); 
    dotX = mouseX; 
    dotY = mouseY; 
    } 

    int[] create(int dotX, int dotY) { 
    int[] coord = {dotX, dotY}; 
    display(dotX, dotY); 
    return coord; 
    } 

    void display(int dotX, int dotY) { 
    float c1 = map(dotX, 0, width, 0, 255); 
    noStroke(); 
    fill(c1, 255, 255); 
    ellipse(dotX, dotY, 20, 20); 
    } 
} 

私は(作成製)の配列を返し、それ以外の場合を表示しながら、私は、各オブジェクトの座標を参照することができないようにそれがようだが、私は主な問題は、それについて何かあると思うので。提案?

答えて

0

あなたの主な問題は、クラスレベルdotX,dotY、およびcoordの変数を持つことによって発生します。つまり、すべてのDotインスタンスが同じ位置を共有していることを意味します。それらの変数を取り除く。

代わりにDotクラスの中に変数を使用する必要があります。つまり、各Dotは独自の位置を持つことができます。

あなたは、あなたが取り除く必要がある余分なジャンクの束を持っています。あなたのcreate()関数は何も役に立たないようで、display()関数は引数を取る必要はありません。すでに使用しているDotクラス内の変数があるからです。

すべて一緒にそれを置く、それは次のようになります。

ArrayList<Dot> dots = new ArrayList<Dot>(); 

void setup() { 
size(500, 500); 
background(255); 
} 

void mousePressed() { 
if(mouseButton==LEFT) { 
    dots.add(new Dot(mouseX, mouseY)); 

} 
if(mouseButton==RIGHT && dots.size()>0) { 
    dots.remove(dots.size()-1); 
} 
} 

void draw() { 
    background(255); 
    for(Dot dot : dots){ 
    dot.display(); 
    } 
} 



class Dot{ 

    float dotX; 
    float dotY; 

    int id; 
    Dot(int dotX, int dotY) { 
    id = dots.size(); 
    this.dotX = dotX; 
    this.dotY = dotY; 
    } 

    void display() { 
    float c1 = map(dotX, 0, width, 0, 255); 
    noStroke(); 
    fill(c1, 255, 255); 
    ellipse(dotX, dotY, 20, 20); 
    } 
} 

また、私はあなたのArrayListにジェネリックを追加したことに気づきます。これに代えて

ArrayList dots = new ArrayList(); 

は、この操作を行います。

ArrayListのドット=新しいArrayListのを();

これはArrayListが保持するオブジェクトのタイプを処理するので、キャストする必要がなくなり、拡張forループを使用することができます。

+0

ありがとうございました!私が最初に作ったばかげたミスを指摘してくれてありがとう。 – ezekeel

関連する問題