处理3.3中的矩阵文本降雨效果

时间:2017-03-01 23:27:54

标签: processing

我正在处理3.3中的矩阵文本降雨效果,作为学习处理库和Java的简单入门项目。到目前为止我的代码:

class Symbol {
  int x, y;
  int switchInterval = round(random(2, 50));
  float speed;
  char value;

  Symbol(int x, int y, float speed) {
    this.x = x;
    this.y = y;
    this.speed = speed;
  }

  //Sets to random symbol based on the Katakana Unicode block
  void setToRandomSymbol() {
    if(frameCount % switchInterval == 0) {
      value = char((int) random(0x30A0, 0x3100));
    }
  }

  //rains the characters down the screen and loops them to the top when they
  // reach the bottom of the screen
  void rain() {
    if(y <= height) {
      y += speed;
    }else {
      y = 0;
    }
  }
}

Symbol symbol;

class Stream {
  int totalSymbols = round(random(5, 30));
  Symbol[] symbols = new Symbol[500];
  float speed = random(5, 20);

  //generates the symbols and adds them to the array, each symbol one symbol 
  //height above the one previous
  void generateSymbols() {
    int y = 0;
    int x = width / 2;

    for (int i = 0; i <= totalSymbols; i++) {
      symbols[i] = new Symbol(x, y, speed);
      symbols[i].setToRandomSymbol();
      y -= symbolSize;
    }
  }

  void render() {
    for(Symbol s : symbols) {
      fill(0, 255, 70);
      s.setToRandomSymbol();
      text(s.value, s.x, s.y);
      s.rain();
    }
  }
}

好的,这就是很多代码,让我解释一下我的困境。我遇到的问题是,当我运行代码时,我在render函数中for each循环的s.setToRandomSymbol();方法调用中得到一个NullpointerException。关于这个NullPointerException错误以及我不理解的部分的奇怪部分是它被抛出一个方法,该方法不会接受任何可能返回空的参数,并且该方法本身是无效的,所以它不应该返回任何东西,对吧?为什么这个返回Null,我做错了让它以这种方式返回?

1 个答案:

答案 0 :(得分:2)

首先,你在5和30之间得出一个随机数:

int totalSymbols = round(random(5,30));

然后,您创建一个包含500类的Symbol个实例的数组:

Symbol[] symbols = new Symbol[500];

请注意,此数组此时包含500 null个值。

然后,您的数组最多可添加30个Symbol个实例:

for (int i = 0; i <= totalSymbols; i++) {
  symbols[i] = new Symbol(x, y, speed);

请注意,此时此数组至少包含470 null个值。

然后迭代所有500个索引:

for(Symbol s : symbols) {
  s.setToRandomSymbol();

但请记住,这些索引中至少有470个是null,这就是您获得NullPointerException的原因。

一些基本的调试会告诉你所有这些。我会在你收到错误之前添加一个基本的println()语句开始:

for(Symbol s : symbols) {
  println("s: " + s);
  s.setToRandomSymbol();

这会向您显示您正在重复null个值。

无论如何,为了解决您的问题,您需要停止迭代整个阵列,或者您需要停止为从未使用的索引腾出空间。

将来,尝试在发布前将问题范围缩小到MCVE。请注意,这个小得多的示例程序会显示您的错误:

String[] array = new String[10];
array[0] = "test";
for(String s : array){
  println(s.length());
}