2017-06-01 9 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

どこ圏がダウンして行かせるロジックがありますか?あなたは、あなたのテトロミノを落とすエンジンクラスを必要とします。これは、コリソンをチェックする別のクラスを呼び出し、一度それが別のブロックと衝突すると、停止して別のクラスを生成します。いくつかの種類のテトロミノがあり、描画クラスはそれを使ってすべてのテトロミノを描画します。私はこのアーキテクチャを使用していないでしょう。ブロックが画面の中央で消え始めるのは難しいでしょう。しかし、あなたが楽しんでいる限り: – 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クラスを追加しました、それは底に達するが、私はそれがフレームの上部に新しい形を描画することができませんでした –

関連する問題