在点击位置绘制新圈子,同时保存之前的圈子

时间:2016-09-26 12:04:14

标签: java processing

嗨我想为他们输入新的半径并点击按钮时绘制新的圆圈。我应该用鼠标定位它。然而,在我绘制圆形之后,我要么无法绘制新的,要么也无法定位它。

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;     
}

1 个答案:

答案 0 :(得分:1)

您有两个主要选择:

选项1:停止从background()功能调用draw()功能。这就是清除旧框架的原因。如果您将其删除(或将其移至setup(),则您的旧框架将永远不会被清除。

选项2:存储在一组数据结构中。您可以考虑使用数组来存储每个圆的位置和半径。 (或者更好的是,创建一个Circle类并将其存储在ArrayList中。)然后绘制场景,只需遍历数据结构并绘制所有圆圈。

另一个选择是使用屏幕外PGraphics缓冲区。