堆积的移动对象的数组

时间:2016-03-31 10:13:47

标签: arrays class object processing

我的问题涉及创建一系列移动物体。目标是让每个人都创造出#34;符号"在创建时从x = 200开始,然后沿x轴移动。这可以通过创建单个对象来实现,但是当我尝试使它们出现在一个数组中时,它们只是出现在彼此的顶部(使球透明,这样你就可以看到它们堆叠)。有没有办法创建单个数组对象的数组,这样就不会发生。

int numSymbols = 100;
int symbolXPos;
int i;

Symbol[] symbols = new Symbol[numSymbols];   

void setup(){
for(int i = 0; i < numSymbols; i++){
   symbols[i] = new Symbol(); 
  }

  size(748,1024);
    }

    void draw(){
  background(255,255,255);
  i++;
  if(i > 10){
symbols[1].addSymbol(i);
  }
  if(i > 100){
symbols[2].addSymbol(i);
  }
  if(i > 200){
symbols[3].addSymbol(i);
  }

}

  int symbolY = 748-2*6-89-180;
  int symbolX = 200; 
  int symbolPos;
  boolean firstLoop = true;
int xSpeed;

class Symbol{

   void addSymbol(int xSpeed){

if(firstLoop == true){
symbolXPos = xSpeed;
firstLoop = false;
}else{

  xSpeed = symbolX + (xSpeed - symbolXPos);    

fill(0,0,0,20);
noStroke();
rect(xSpeed,symbolY, 36, 36, 18);
}
}
}

1 个答案:

答案 0 :(得分:0)

看起来很奇怪的第一部分是你有这些看似与Symbol实例相关的属性,而不是主要的范围:

int symbolY = 748-2*6-89-180;
  int symbolX = 200; 
  int symbolPos;
  boolean firstLoop = true;
  int xSpeed;

也许你的意思是这样的:

int numSymbols = 100;
int symbolXPos;
int i;

Symbol[] symbols = new Symbol[numSymbols];   

void setup() {
  for (int i = 0; i < numSymbols; i++) {
    symbols[i] = new Symbol();
  }

  size(748, 1024);
}

void draw() {
  background(255, 255, 255);
  i++;
  if (i > 10) {
    symbols[1].addSymbol(i);
  }
  if (i > 100) {
    symbols[2].iaddSymbol(i);
  }
  if (i > 200) {
    symbols[3].addSymbol(i);
  }
}

class Symbol {
  int symbolY = 748-2*6-89-180;
  int symbolX = 200; 
  int symbolPos;
  boolean firstLoop = true;
  int xSpeed;

  void addSymbol(int xSpeed) {

    if (firstLoop == true) {
      symbolXPos = xSpeed;
      firstLoop = false;
    } else {

      xSpeed = symbolX + (xSpeed - symbolXPos);    

      fill(0, 0, 0, 20);
      noStroke();
      rect(xSpeed, symbolY, 36, 36, 18);
    }
  }
}

即便如此,感觉代码比它应该更复杂,并且对类和对象/实例存在一些混淆。

我们假设你只是想横向移动符号。你可以使用一个简单的类:

class Symbol{
  //position
  float x;
  float y;
  //speed
  float speedX;

  void updateAndDraw(){
    //update position
    x += speedX;
    //reset to 0 if out of bounds
    if(x > width) x = 0;
    //draw
    rect(x, y, 8, 8, 18);
  }

}

它现在有x,y和speedX。 x属性以速度递增,更新的位置用于在屏幕上呈现符号。

这是使用上述类的基本草图:

int numSymbols = 100;
Symbol[] symbols = new Symbol[numSymbols];

void setup(){
  size(748, 1024);
  fill(0, 0, 0, 64);
  noStroke();

  for (int i = 0; i < numSymbols; i++) {
    symbols[i] = new Symbol();
    //use different speeds to easily tell the symbols appart
    symbols[i].speedX = 0.01 * (i+1);
    //increment y position so symbols don't overlap
    symbols[i].y = 10 * i;
  }
}
void draw(){
  background(255);
  for (int i = 0; i < numSymbols; i++) {
    symbols[i].updateAndDraw();
  }
}
class Symbol{
  //position
  float x;
  float y;
  //speed
  float speedX;

  void updateAndDraw(){
    //update position
    x += speedX;
    //reset to 0 if out of bounds
    if(x > width) x = 0;
    //draw
    rect(x, y, 8, 8, 18);
  }

}

关键点是:

  1. 使用与类内符号相关的属性,而不是外部(这意味着全局范围)
  2. 使用不同的位置使符号实例不重叠
  3. 请务必查看Daniel Shiffman's Objects tutorial,它为面向对象的编程提供了一个很好的简单介绍