2013-04-30 77 views
4

我試圖爲每件新作品(由4個瓷磚組成)設置一個新的隨機顏色。爲了繪製完整的一塊板子,我在董事會類塗料成分:Java俄羅斯方塊 - 爲每件設置新顏色

public void paintComponent(Graphics g) { 
    g.setColor(Color.black); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    for(int row = 0; row < grid.length; row++) { 
     for(int col = 0; col < grid[row].length; col++) { 
      if(grid[row][col] != null) { 
       //if there is a non-null space, that is a Tetris piece.. fill it red 
        g.setColor(color); 
        g.fillRect(row * tilesize, col * tilesize, tilesize, tilesize); 
        g.setColor(Color.WHITE); 
        g.drawString("(" + row + ", " + col + ")", row * tilesize, col * tilesize+10); 
       }   
      } 
     } 
    } 

你可以看到,g.setColor()被賦予作爲董事會構造函數中定義一個全局變量color

color = setColor();

的setColor():

public Color setColor() { 

    Random rand = new Random(); 

    float r = rand.nextFloat(); 
    float g = rand.nextFloat(); 
    float b = rand.nextFloat(); 
    Color randomColor = new Color(r, g, b); 

    return randomColor; 
} 

當有碰撞,產生新的一塊,它會覆蓋一個新的隨機顏色的color全局變量...

public void collisionCheck() { 
    if (newPiece.isCollision()){ 
     newPiece = new Piece(this, randomPiece()); 
     color = setColor(); 
    }  
} 

這給了我這樣的結果:

所有形狀被設置爲相同的顏色...不是我想要的 enter image description here

然後,如果生成一個新的作品,它們的顏色將改變...再次,而不是我想要的。 enter image description here

我知道什麼的問題是......那就是我不應該覆蓋全球色彩變量...但如果我不分配由董事會類顏色...而是您可以通過瓷磚類的顏色,因爲這樣的:

g.setColor(grid[row][col].getColor());

public void paintComponent(Graphics g) { 
     g.setColor(Color.black); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     for(int row = 0; row < grid.length; row++) { 
      for(int col = 0; col < grid[row].length; col++) { 
       if(grid[row][col] != null) { 
        //if there is a non-null space, that is a Tetris piece.. fill it red 
         g.setColor(grid[row][col].getColor()); 
         g.fillRect(row * tilesize, col * tilesize, tilesize, tilesize); 
         g.setColor(Color.WHITE); 
         g.drawString("(" + row + ", " + col + ")", row * tilesize, col * tilesize+10); 
        }   
       } 
      } 
     } 

然後每個拼貼都會有各自的瓦片被重新粉刷一次產生了新的色彩......

enter image description here

我的目標是給一塊(由4個瓷磚組成)隨機顏色...然後當一個新的作品生成時,第一個作品保留其顏色......並且新作品保留其顏色...

有什麼想法?

謝謝!

+2

遊戲開發,你應該有一個遊戲循環,而不是在運行的paintComponent一切() – Jimmt 2013-04-30 16:28:33

+0

@Jimmt我是新來這。你能給個例子嗎? – Growler 2013-04-30 16:31:30

+1

http://www.gameprogblog.com/generic-game-loop/#headingWhatIsGameLoop - 基本上,遊戲循環應該規定遊戲的運行速度,以便在更快的機器上運行速度不會更快,或者在速度較慢的機器上速度較慢,並且fps不會太高,以最大限度地提高性能並且不會最大限度地減少cpu的使用。 – Jimmt 2013-04-30 17:10:47

回答

4

我只是想出瞭如何做到這一點?在Board類中,通過randomColor()作爲一個參數,當我創建newPiece:

public Color randomColor() { 

    Random rand = new Random(); 

    float r = rand.nextFloat(); 
    float g = rand.nextFloat(); 
    float b = rand.nextFloat(); 
    Color randomColor = new Color(r, g, b); 

    return randomColor; 
} 

newPiece = new Piece(this, randomPiece(), randomColor());. 

在片類,通過瓷磚,tile[i].setColor(color);迴路,設置每個瓷磚的顏色。

for (int i = 0; i < tile.length; i++) { 
    tile[i].setColor(color); 
} 

在瓷磚我加入Color getColor()返回setColor(color);

public Color getColor() { 
    return setColor(color); 
} 

public Color setColor(Color myColor) { 
    color = myColor; 
    return color; 
} 

然後我在董事會類的塗料成份使用方法:g.setColor(grid[row][col].getColor());

這肯定不是,雖然是最優雅的解決方案。學會如何更好地完成這項工作並且像俄羅斯方塊一樣在一個「遊戲循環」中進行描述,這會很酷。

enter image description here

+2

我是建議面向對象方法的時刻!很高興你有自己的,但:) – christopher 2013-04-30 16:39:38