2016-09-26 1 views
0

안녕하세요 새로운 반지름을 입력하고 버튼을 클릭하면 새로운 서클을 그립니다. 나는 그것을 마우스로 배치해야한다. 그러나 원을 그리면 새 것을 그릴 수 없으며 마우스를 배치 할 수도 없습니다.이전 위치를 저장하면서 클릭 위치에 새로운 서클 그리기

옵션 1 : 당신의 draw() 함수의 background() 함수를 호출 정지

import interfascia.*; 

int numCircles = 500; 
Circle[] circles = new Circle[numCircles]; // define the array 
int k=0; 
GUIController c; 
IFButton b1; 
IFTextField tn; 
float bx; 
float by; 
boolean overBox = false; 
boolean locked = false; 
float xOffset = 0.0; 
float yOffset = 0.0; 
float r; 


void setup() { 
    size(1439,800); 
    smooth(); 
    noStroke(); 

    bx=width/2; 
    by=height/2; 

    c = new GUIController (this); 
    b1 = new IFButton ("Click to draw", 600, 220, 100); 
    tn=new IFTextField("", 100,20,50); 

    c.add(b1); 
    c.add(tn); 

} 

void draw() { 
    background(205); 
    if (mouseX > bx-r && mouseX < bx+r && 
     mouseY > by-r && mouseY < by+r) { 
    overBox = true; 
    if(!locked) {   
    } 
    } else { 

    overBox = false; 
    } 
    circles[k] = new Circle(bx,by,r); 
    circles[k].display(); // display all the circles 

} 

void actionPerformed (GUIEvent e) { 
if (e.getSource() == b1) { 
     r=float(tn.getValue()); 

    } 

} 

class Circle { 
    float x,y,r; // location 

    color c; // color 

    Circle(float x, float y, float r) { 
    this.x = x; 
    this.y = y; 
    this.r = r; 

    c = color(random(255)); 
    } 

    void display() { 

    ellipse(x,y,10,10); // a circle at position xy 
    } 
} 

void mousePressed() { 
    if(overBox) { 
    locked = true; 

    } else { 
    locked = false; 
    } 
    xOffset = mouseX-bx; 
    yOffset = mouseY-by;  
} 

void mouseDragged() { 
    if(locked) { 
    bx = mouseX-xOffset; 
    by = mouseY-yOffset;   
    } 
}  

void mouseReleased() { 
    locked = false; 
    overBox=false;  
} 
+0

D 간단히 화면을 지우지 마십시오. –

+0

유지 보수 가능한 변수 이름으로 코드 스 니펫을 편집 할 수 있습니까? –

+0

힌트 : 변수 이름에 둘 이상의 문자를 사용하는 것을 금지하는 법률은 잘 작성되지 않았습니다. 단순히 그렇게하지 마십시오. – GhostCat

답변

1

당신은 두 가지 옵션이 있습니다. 이것이 오래된 프레임을 비우는 것입니다. 당신이를 제거 (또는 setup()으로 이동하면, 이전 프레임 밖으로 삭제되지 않습니다

옵션 2 :.. 데이터 구조의 집합에 상태 당신은 저장하는 배열을 사용하여 생각할 수 스토어 각 서클의 위치와 반경 (또는 더 나은 방법은 Circle 클래스를 만들고 그 인스턴스를 ArrayList에 저장합니다.) 그런 다음 장면을 그리려면 데이터 구조를 반복하고 모든 서클을 그립니다.

다른 옵션은 오프 스크린 PGraphics 버퍼를 사용하는 것입니다.

+0

내 코드를 편집하고 Circle 클래스를 추가했지만 여전히 작동하지 않습니다. – dummy

+0

@dummy 'k'변수를 변경하지 않은 것 같습니다. 그리고 당신은 여전히 ​​단 하나의 서클을 그리는 중입니다. 모든 서클을 그리려면 배열을 반복해야합니다. 또한 GUI 빌더 항목없이 [mcve]를 게시 한 경우 코드가 더 쉽게 실행될 수 있습니다. –

+0

@dummy'Circle' 객체의'ArrayList'를 사용하는 예제를 보려면이 게시물을보십시오 : http://stackoverflow.com/questions/39691263/how-to-restart-a-sketch-project-in-processing –

관련 문제