2017-06-01 86 views
0

我正在寫一個俄羅斯方塊遊戲的代碼,我有件移動的問題。我讓他們向右,向左和向下移動,我讓他們旋轉,但是當這些作品達到底線時,我不能讓他們停下來,並在上面畫一個新作品。這裏是我的課程:如何停止Java中的俄羅斯方塊片?

每個形狀的形狀類,它擴展了一個抽象的Shape類,我也在這裏做了參考。

public class TShape extends Shape{ 

    public TShape(int x, int y, int w, int h) { 
    super(x, y, w, h); 

} 

public void draw(Graphics g){ 

    if (TetrisFrame.turn ==0){ 
     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x, y, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x, y, w, h); 


     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x+w, y, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x+w, y, w, h); 


     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x+2*w, y, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x+2*w, y, w, h); 


     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x+w, y+h, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x+w, y+h, w, h); 

    } 

if(TetrisFrame.turn ==1){ 
    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x-w, y, w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x-w, y, w, h); 


    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x-w, y+h, w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x-w, y+h, w, h); 


    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x-2*w, y+h, w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x-2*w, y+h, w, h); 


    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x-w, y+2*h, w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x-w, y+2*h, w, h); 

} 


if (TetrisFrame.turn ==2){ 

    g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x-2*w, y-h, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x-2*w, y-h, w, h); 

     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x-3*w, y, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x-3*w, y, w, h); 

     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x-2*w, y, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x-2*w, y, w, h); 

     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x-w, y, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x-w, y, w, h); 

} 

if (TetrisFrame.turn ==3){ 

    g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x-w, y-3*h, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x-w, y-3*h, w, h); 

     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x-w, y-2*h, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x-w, y-2*h, w, h); 

     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x-w, y-h, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x-w, y-h, w, h); 

     g.setColor(Color.LIGHT_GRAY); 
     g.fillRect(x, y-2*h, w, h); 

     g.setColor(Color.BLACK); 
     g.drawRect(x, y-2*h, w, h); 

    } 

    } 
} 

繪製面板繪製形狀:

public class DrawPanel extends JPanel{ 
int x = 150; 
int y =0; 
int h=30; 
int w=30; 

Shape s; 

public DrawPanel(){ 

    s = new TShape(x,y,w,h); 
} 

public void paintComponent(Graphics g){ 

    super.paintComponent(g); 
    s.draw(g); 

    } 

我的俄羅斯方塊框架和處理程序:

public class TetrisFrame extends JFrame{ 

DrawPanel dp; 

static int turn; 

public TetrisFrame(){ 

    dp= new DrawPanel(); 
    dp.setBorder(new LineBorder(new Color(0, 0, 0), 3)); 

    MyHandler mhd = new MyHandler(); 

    this.addKeyListener(mhd); 

    getContentPane().add(dp); 


} 

class MyHandler implements KeyListener{ 

    @Override 
    public void keyPressed(KeyEvent e) { 

     //left:37, right:39, up:38 down:40 

     int code = e.getKeyCode(); 

     if(code == 37){ 

      dp.s.x -=30; 

     } 
     if(code == 38){ 

      turn++; 

      if (turn ==4) 
       turn =0; 
     } 

     if(code == 39){ 

      dp.s.x +=30; 

     } 

     if(code == 40){ 

      dp.s.y +=30; 
      if(dp.s.y == 17*30){ 

       JOptionPane.showMessageDialog(null, "fvgbhn"); 

      } 
    } 




    } 

    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 
     dp.repaint(); 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 



    } 
} 

我應該做的,使其工作?

+0

在哪裏,使你的陣營下去的邏輯是什麼?你需要某種類型的引擎讓你的tetrominos失敗,這叫一個類檢查collisons,一旦碰到另一個block,就停下來產生另一個類。你會得到一些tetrominos列表,繪圖班將使用它來繪製每一個tetromino。我不會使用這個架構,當屏幕開始在屏幕中間消失時,會很困難。但只要你有樂趣:) – Asoub

回答

0

更新:我嘗試了發佈代碼,但也有不少錯誤。你確定你已經發布了完整的代碼嗎?如果你想維護你的代碼的隱私,那很好,你可以嘗試下面的內容。

我明白了。你還沒有設定條件是否已經達到底部。

首先,你不應該設置塊的高度和寬度的變量。您應該給它一個預定義的值,如10(以像素爲單位)。

比方說,你要設置的邊界爲矩形0, 0, 300, 500,這將是你的代碼:

if (TetrisFrame.turn ==0){ 

if(y+h >= 500) 
{ 
    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x, (500 - h), w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x, (500 - h), w, h); 

    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x+w, (500 - h), w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x+w, (500 - h), w, h); 


    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x+2*w, (500 - h), w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x+2*w, (500 - h), w, h); 


    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x+w, 500, w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x+w, 500, w, h); 
} 
else 
{ 
    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x, y, w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x, y, w, h); 


    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x+w, y, w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x+w, y, w, h); 


    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x+2*w, y, w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x+2*w, y, w, h); 


    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(x+w, y+h, w, h); 

    g.setColor(Color.BLACK); 
    g.drawRect(x+w, y+h, w, h); 
} 
} 
+0

我也加了我的Tshape類,它到達了底部,但我不能讓它畫出一個新的形狀到框架的頂部 –