Как не переписать существующий список объектов? - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу рисовать линии, нажимая на холст, поэтому, если я щелкнул один раз, сохраните точку, а если я щелкнул второй раз, то нарисуйте линию за этими двумя точками. Но я хочу сделать это несколько раз, поэтому, если я нажму третий раз, то эта точка будет отправной точкой новой линии. Я создал так: Это в main:

ArrayList<Shape> shapes = new ArrayList<Shape>();
Shape selected_shape = null;

Boolean drawmode = true;


    void setup() {
      size(1000, 600);
    }

    void draw() {
      //update();
      background(224, 224, 224);

      //draw the existing
      for(Shape s: shapes){
        pushMatrix();
        //list all
        s.Draw();
        s.Log();
        popMatrix();
      }
      println("shape size: "+shapes.size());
    }

    //menu
    int value = 0;
    void keyPressed() {
      if(key == '0'){
          System.out.println("Draw mode OFF"); // exit from draw mode
          value = 0;
      }
      if(key == '1'){ 
          println("Draw a line: select the start point of the line and the end point!");  // line
          value = 1;
      }
      //System.out.println("key: " + key);
    }

    Line l = new Line();
    void mousePressed() {
      if(value == 1){
        if(l.centerIsSet){
          if (mouseButton == LEFT) {
            l.x2 = mouseX;
            l.y2 = mouseY;
            println("end point added");
            l.centerIsSet = false;
          }
          shapes.add(l);
          l.Log();
        } else {
          if (mouseButton == LEFT) {
            l.x1 = mouseX;
            l.y1 = mouseY;
            l.centerIsSet = true;
            println("start point added");
          }
        }
      }
    }

И я использую класс shape, и этот класс расширяется до line:

abstract class Shape {

  PVector position = new PVector();  
  PVector fill_color = new PVector(0, 0, 0);
  PVector stroke_color = new PVector(0, 0, 0);  
  PVector select_fill_color = new PVector(255, 0, 0);
  PVector select_stroke_color = new PVector(255, 0, 0);

  Boolean selected = false;

  int shape_color_r;
  int shape_color_g;
  int shape_color_b;
  int shape_rotation_angle = 0;

  int detailness = 10;

  abstract void Draw();
  abstract void Log();
}

и

class Line extends Shape {
    int x1, x2, y1, y2;
    Boolean centerIsSet = false;

    Line(){}
    Line(int x1, int y1){
      this.x1 = x1;
      this.y1 = y1;
    }
    Line(int x1, int y1, int x2, int y2){
      this.x1 = x1;
      this.x2 = x2;
      this.y1 = y1;
      this.y2 = y2;
    }

    void Draw(){
      line(x1, y1, x2, y2);
    }

    void Log(){
      System.out.println("x1: "+x1+" x2: "+x2+" y1: "+y1+" y2: "+y2);
    }
}

Но всегда последняя созданная строка перезаписывает старые, как я могу решить эту проблему? Я думаю, что мне нужен новый экземпляр для каждой строки, но я не знаю, как я могу это сделать.

1 Ответ

0 голосов
/ 08 ноября 2018

Переменная l относится к объекту Line, который содержит координаты линии, которая рисуется в данный момент.

Если вы завершили строку, то ссылка на объект строки l добавляется в контейнер shapes. Теперь вам нужно создать новый объект строки для следующей строки и присвоить его l:

shapes.add(l);
l = new Line(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...