如何在处理中改变省略号的速度

时间:2016-02-08 15:31:58

标签: processing

我正在尝试创建一个圆圈阵列,所有圆圈都以不同的速度移动并使用我已经完成的类别使用不同的颜色但是由于某种原因运行它大约5秒后椭圆全部到达窗口的边缘并且代码无法正常工作。下面我提供了我的代码,包括课程和设置:

circle circles = new circle(1, 8);

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

void draw() {
  background(255);
  circles.display();
  circles.bounce();
}

class circle {
  int[] posX = new int [10];
  int[] posY = new int [10];
  float[] speedX = new float[10];
  float[] speedY = new float[10];
  int[] red = new int [10];
  int[] green = new int [10];
  int[] blue = new int [10];
  circle(float start, float end) {
    for (int i = 0; i < 10; i++) {
      speedX[i] = random(start, end);
      speedY[i] = random(start, end);
      posX[i] = int(random(500, 800));
      posY[i] = int(random(500, 600));
      red[i] = int(random(0, 255));
      green[i] = int(random(0, 255));
      blue[i] = int(random(0, 255));
    }
  }
  void display() {
    for (int i = 0; i < 10; i++) {
      fill(red[i], green[i], blue[i]);
      ellipse(posX[i], posY[i], 50, 50);
    }
  }
  void bounce() {

    for (int i = 0; i < 10; i++) {
      posX[i] += speedX[i];
      posY[i] += speedY[i];
      if (posX[i] - 50 < 0 || posX[i] + 50 > width) {
        speedX[i] = -speedX[i];
      }
      if (posY[i] - 50 < 0 || posY[i] + 50 > height) {
        speedY[i] = -speedY[i];
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

主要问题是你没有再将球设置在屏幕内!这是一个非常常见的问题,Dan Shiffman将其用于show the new Processing 3 Debugger

但是因为我发现了许多关于你的代码的东西,我还会评论其​​他可能对你有帮助的东西。

但首先让我告诉你工作代码:

int n_of_circles = 10;
Circle[] circles = new Circle[n_of_circles];

void setup() {
  size(800, 600);
  for (int i = 0; i < n_of_circles; i++) {
    circles[i] = new Circle(1, 8);
  }
}

void draw() {
  background(255);
  for (int i = 0; i < n_of_circles; i++) {
    circles[i].display();
    circles[i].move();
  }
}

class Circle {
  float posX = random(0, width); //no need to set these value in constructor
  float posY = random(0, height); //we can set it here
  float speedX = 666; //we will change these on constructor
  float speedY = 666; //666 is just a personal convention that i use to indicate that :p

  //Similarly, no need to set the color variable in the constructor
  //also, lets use a color variable instead of 3 separate variables
  color circ_color = color(
      (int) random(0, 255), 
      (int) random(0, 255),
      (int) random(0, 255)
    );
  //defining circle diameter instead of using a literal ("50", in our case)
  int diameter = 50;
  int radius = diameter/2;


  Circle(float min_speed, float max_speed) {
      // The purpose of "min_speed" and "max_speed" are clearer than "start" and "end"
      speedX = random(min_speed, max_speed);
      speedY = random(min_speed, max_speed);
  }

  void display() {
      //this push an pop commands ensure that this fill command won't 
      //interfere with any other stuff, if you ever reuse this code
      pushStyle();
        fill( circ_color );
        ellipse(posX, posY, diameter, diameter);    
      popStyle();
  }

  //notice how i separated the move declartions form the bounce. It's good programming practice
  //to keep stuff simpler. Functions should always have one single responsibility.
  //In this case it won't help´much, but we're yoru move function more complex, it would!

  void move(){    
    posX += speedX;
    posY += speedY;
    bounce();

  }

  void bounce() {
      //note that you were using the diameter, but you should really use the radius!

      //if it's touching left or side edges
      if (posX - radius < 0 || posX + radius > width) {
        speedX *= -1; //inverts the sign

        //Here's the actual missing bits!
        if (posX - radius < 0 ){ posX = radius; }
        if (posX + radius > width ){ posX = width-radius; }
      }

      //if it's touching top or bottom edges
      if (posY - radius < 0 || posY + radius > height) {
        speedY *= -1; //inverts the sign

        //Here's the actual missing bits!
        if (posY - radius < 0 ){ posY = radius; }
        if (posY + radius > height ){ posY = height-radius; }
      }

  }

} //end of class Circle

我只是一些建议:

  • 惯例是类名是大写的。这个你有Circle circle = new Circle(1,5);这更清楚。
  • 避免使用文字! (编写硬编码的数字)例如,你我们使用“ellipse(posX [i],posY [i],50,50);”。通过使用直径变量,您的代码变得更加模块化。如果你改变圆直径,你只需改变一行代码!
  • 使用对象数组而不是包含其他内容的类。这是一个很好的编程实践,因为它使您的代码更容易理解。现在,如果您需要将大量圆圈分组,则可以使用数组,或者您可以为ex创建另一个类“Group_of_circles”。
  • 我知道我已经提出了一些新的概念/语法,并且对你的代码做了很多改变,但我试图对所有内容进行评论,以使其清晰明确并具有指导意义
  • 由于我已经改变了很多东西,我没有使用任何Vector,但在处理位置时,你真的应该使用PVectors! This free book有一个很好的章节!

尝试找到有关软件开发的好教程。他们将教授像Godo编程实践,例如尽可能保持代码模块化等等。但不要担心,随着时间的推移它会随便出现!

尝试learncpp.com,教程1-10a和1-4b。这两个是c ++教程的一部分,但它是一个很好的起点,并且通常指的是编程。