2013-04-30 81 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