2016-03-31 7 views
0

私の質問は動くオブジェクトの配列の作成に関係しています。目標は、作成されたときに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); 
} 
} 
} 

答えて

0

奇妙に見える最初の部分は、あなたがシンボルインスタンスにではなく、メインの範囲に関連するように見えるこれらの性質を持っていることです:

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. 異なる位置を使用するため、シンボルインスタンスは重複しません。

Daniel Shiffman's Objects tutorialを必ずチェックしてください。オブジェクト指向プログラミングの素敵で簡単な紹介を提供します

関連する問題