2017-03-01 4 views
0

Processing 3.3では、処理ライブラリとJavaを学習するための簡単なスタータープロジェクトとして、マトリックステキストレインエフェクトを作成しています。これまでの私のコードは:それは多くのコードだったのでMatrix Text Processingでの雨の影響3.3

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(); 
    } 
    } 
} 

[OK]を、私は私のジレンマを説明しましょう。私が抱えている問題は、コードを実行すると、レンダリング関数の各ループに対してs.setToRandomSymbol();メソッド呼び出しでNullpointerExceptionが発生するということです。このNullPointerExceptionエラーに関する不思議な部分と私が理解していない部分は、空に戻ってくる可能性のある引数を取らないメソッドにスローされ、メソッド自体が無効なので、何かを返すだろうか?これがなぜNullを返すのですか?そして、それをこのように戻すのに間違ったことは何ですか?

+0

「幅」とは何ですか、それはどこに設定しますか? – Fodder

+0

'width'はウィンドウの幅に等しい処理ライブラリの組み込み変数です。 – TKDefender

+0

[mcve]を投稿してください。あなたのコードを実行しようとすると、 'symbolSize'が定義されていないので、私はエラーに遭遇します。私がそのエラーを修正しても、 'setup()'や 'draw()'関数を含めていないので、空白のスケッチを得るだけです。すべてのコードを掲載するのではなく、実行可能な小さなサンプルを作成してみましょう。 –

答えて

2

まず、あなたは5と30 betwen乱数を思い付く:

int型totalSymbols =ラウンド(ランダム(5、30));この配列は、この時点で500のnull値を保持していること

Symbol[] symbols = new Symbol[500]; 

注:

は、次に、あなたの Symbolクラスの 500インスタンスを保持する配列を作成します。

次に、あなたの配列にSymbolの30個のインスタンスの最大を追加します。

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

(注)この配列は、今、この時点で少なくとも470のnull値を保持していること。

その後、あなたはすべての500個のインデックス反復処理:

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

をしかし、これらの指標の少なくとも470あなたはNullPointerExceptionを取得している理由である、nullであることを覚えておいてください。

いくつかの基本的なデバッグでは、このすべてを教えてくれました。あなたはnull値を反復していること。これはあなたを示しているだろう

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

:あなたがエラーを取得する直前に、私は基本的なprintln()ステートメントを追加することにより開始しただろう。

とにかく、問題を解決するには、配列全体を反復処理する必要があります。また、決して使用しないインデックスの作成をやめなければなりません。

将来的にはをご連絡ください投稿する前に問題をMCVEに絞り込んでください。この小さなサンプルプログラムでは、エラーが表示されます:

String[] array = new String[10]; 
array[0] = "test"; 
for(String s : array){ 
    println(s.length()); 
} 
関連する問題