Проблема с 2d-массивом, чтобы заморозить один объект и дублировать указанный объект на 90 пикселей вправо - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь сделать так, чтобы при нажатии пробела я мог приостановить стек движущихся прямоугольников в одной позиции, продублировать его на 90 пикселей вправо и завершить то же движение. Это должно происходить по столбцам (сеткам) на холсте. Я думаю, что понадобится 2D-массив, но я не могу понять, как это сделать.

Если кто-нибудь знает, как это сделать, я был бы очень признателен за помощь.

 float loc;
 float sizeW;
 float sizeH;
 float dir;
 boolean moving = true;

void setup() {
  size(1280, 720);
  loc = 0;
  dir = (float)height/720;
  sizeW = (float)width/14.2;
  sizeH = (float)height/8;    
}

void draw() {
  background(255);
  Rectangle();
  grid();
}

void Rectangle() {
  fill(255, 147, 79);
  stroke(0);

  int steppedPos = (int)(loc/sizeH+0.5);
  rect(0, steppedPos*sizeH, sizeW, sizeH);

  for (int i =0; i<90*4; i+=90) {
    rect(0, steppedPos*sizeH+i, sizeW, sizeH);
  }
      if (moving) {
       loc = loc + dir;
    if (loc + sizeH + 270 > height || loc < 0) {
      dir = dir * -1;
      loc = loc + dir;
    }
  }
}

void keyPressed() {
  if (key == ' ') {
    moving = !moving;    
  }
}    

void grid() {
  for (int i=0; i<width; i+=90) {
    line(i, 0, i, height);
  }
  for (int j=0; j<height; j+=90) {
    line(0, j, width, j);
  }
}

1 Ответ

0 голосов
/ 15 июня 2020

Итак, вот быстрый способ дублировать столбцы справа. Я добавляю 90 к valueX каждый раз, когда вы нажимаете клавишу пробела. valueX тогда пропадет, вставьте вложенный for-l oop.

Я надеюсь, что это именно тот результат, который вам нужен! (Если нет, оставьте комментарий, и я постараюсь это исправить.)

    float loc;
    float sizeW;
    float sizeH;
    float dir;
    float valueX = 0;
    boolean moving = true;

    void setup() {
      size(1280, 720);
      loc = 0;
      dir = (float)height/720;
      sizeW = (float)width/14.2;
      sizeH = (float)height/8;
    }

    void draw() {
      background(255);
      Rectangle();
      grid();
    }

    void Rectangle() {
      fill(255, 147, 79);
      stroke(0);

      int steppedPos = (int)(loc/sizeH+0.5);
    //  rect(0, steppedPos*sizeH, sizeW, sizeH);

      for (int i =0; i<90*4; i+=90) {
        for(int j = 0; j <= valueX; j+= 90){
        rect(0 + j, steppedPos*sizeH+i, sizeW, sizeH);
        }
      }
      if (moving) {
        loc = loc + dir;
        if (loc + sizeH + 270 > height || loc < 0) {
          dir = dir * -1;
          loc = loc + dir;
        }
      }
    }

    void keyPressed() {
      if (key == ' ') {
        moving = !moving;
        valueX += 90;
      }
    }    

    void grid() {
      for (int i=0; i<width; i+=90) {
        line(i, 0, i, height);
      }
      for (int j=0; j<height; j+=90) {
        line(0, j, width, j);
      }
    }

Ваша идея с 2-мерным массивом неплохая, но проблема в том, что массивы имеют фиксированный размер. Итак, вы хотели бы использовать ArrayList для оси x и массив для оси y (пока он остается фиксированного размера). Это будет выглядеть примерно так:

    ArrayList<int[]> list = new ArrayList<int[]>();

С помощью этого метода вы можете посмотреть на объектную ориентацию, просто чтобы навести порядок. (Если хотите, я могу показать вам, как ваш код будет выглядеть объектно-ориентированным)

Приветствую и удачи!

...