0

Graphics2Dアニメーション、paintComponentがシェイプを1回だけ描​​画してから停止する理由を理解できません。また、タイマーカウンター変数がインクリメントされない理由も理解できません。私は1時間以上これに頭をぶつけてきました、誰かが私を正しい方向に動かすことができますか?

テトリス

package Tetris;
import javax.swing.JLabel;
import java.util.ArrayList;
public class Tetri {

private int xCoords= (int)(Math.random()*10);
private int yCoords=0;
private int shapeType;
private int orientation=0;

public Tetri(int shapeT){
    shapeType = shapeT;

}
public int getOrient(){
    return orientation;
}
public void setOrient(int orient){
    orientation = orient;
}
public void setXCoords(int coords){
    xCoords = coords;

}
public int getXCoords(){

    return xCoords;
}
public void setYCoords(int coords){
    yCoords = coords;
}
public int getYCoords(){

    return yCoords;
}

public int getShape(){

    return shapeType;
}



}

MovingRectangle

package Tetris;
import javax.swing.JFrame;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JPanel;
import java.awt.Color;
import javax.swing.Timer;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
public class MovingRectangle {

public static void main(String[] args){
    new MovingRectangle();
}

public MovingRectangle() {
    EventQueue.invokeLater(new Runnable(){
        @Override
        public void run(){
            JFrame frame = new JFrame("Tetris");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new GridLayout(0,1));
            frame.add(new TestPane(Color.RED));
            frame.setSize(1000,800);
            frame.setVisible(true);

        }

    });
}

TestPane

public class TestPane extends JPanel {

    private Graphics g0;
    private int unit = 50;
    private ArrayList<Tetri> shapeList = new ArrayList<Tetri>();
    int timercount =1;

    public TestPane(Color foreground){
        setForeground(foreground);
        this.setBackground(Color.BLUE);
        Timer timer = new Timer(2000,new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
            System.out.println("timercount :"+timercount);
            timercount = timercount++;
            shapeList.add(new Tetri((int)(Math.random()*2)));
            System.out.println("shapeList size : "+shapeList.size());
            repaint();
            }
        });
        timer.start();

    }
    @Override
    public void paintComponent(Graphics g){
        g0 = g;
        super.paintComponent(g);
        if(shapeList.size()>0){

        Tetri current = shapeList.get(0);

            if(current.getShape()==0){
                                                             createShape0(current.getXCoords(),current.getYCoords(),current.getOrient());
            }
            if(current.getShape()==1){
                createShape1(current.getXCoords(),current.getYCoords(),current.getOrient());
            }
            current.setYCoords(current.getYCoords()+50);
        }
        else{shapeList.add(new Tetri((int)(Math.random()*2)));}


    }
    public void createShape0(int xc,int yc,int orien){
        int yPixel= yc*50;
        int xPixel= xc*50;

        Graphics2D g2d = (Graphics2D) g0.create();
        g2d.setColor(Color.RED);
        if(orien==0){
            g2d.drawRect(xPixel, yPixel, unit*4, unit);
        }
        if(orien==1){
            g2d.drawRect(xPixel, yPixel, unit, unit*4);
        }



    }
    public void createShape1(int xc,int yc, int orien){
        int yPixel= yc*50;
        int xPixel= xc*50;

        Graphics2D g2d = (Graphics2D) g0.create();
        g2d.setColor(Color.GREEN);
        if(orien==0){
        g2d.drawRect(xPixel, yPixel, unit*3, unit);
        g2d.drawRect(xPixel+50, yPixel+50,unit,unit);
        }
        if(orien==1){
        g2d.drawRect(xPixel+50, yPixel-50, unit, unit*3);
        g2d.drawRect(xPixel, yPixel,unit,unit);
        }
        if(orien==2){
            g2d.drawRect(xPixel, yPixel, unit*3, unit);
            g2d.drawRect(xPixel+50, yPixel-50,unit,unit);
        }
        if(orien==3){
            g2d.drawRect(xPixel+50, yPixel-50, unit, unit*3);
            g2d.drawRect(xPixel+100, yPixel,unit,unit);
        }
    }

}
}
4

1 に答える 1

1

私は物事のリストを持っていますが、最も明白なものから始めましょう。

あなたの「動き」の計算はかなり遠いです。

int yPixel = yc * 50;
int xPixel = xc * 50;

これにより、形状が予想されるより長い距離を「ジャンプ」します...実際、これらの値を「変更」する理由はまったく見つかりません。単にそれらを次のように読ませる...

int yPixel = yc;
int xPixel = xc;

形がうまく動いてきました...

コードレビュー

  • 作成していないグラフィックスコンテキストへの参照を維持しないでください。これらの参照は他のUIコンポーネント間で共有でき、参照が1つのペイントサイクルにあり、次のペイントサイクルでも同じになるという保証はありません。グラフィックスコンテキストにペイントする場合は、ペイントを実行する必要のあるメソッドにパラメータとして渡します。
  • グラフィックスコンテキストを作成する場合( )、それが終わったらGraphics2D g2d = (Graphics2D) g.create();、それを破棄する責任があります( )。g2d.dispose()そうしないと、アプリケーションがクラッシュするまでシステムリソースをゆっくりと消費します(経験から言えば、見つけるのは難しいバグです;))

あなたはそのプロセスを困難な方法で進めているようです。自分自身を「描画」する方法を知っているShapeに基づいて、それぞれのクラスを作成する必要があります。Tetriそうすれば、ペイントループでグラフィックスコンテキストを単純に渡すことができ、気にする必要はありません。これにより、時間の経過とともに新しいピースを追加するのが非常に簡単になります。

これらの各ピースをベースjava.awt.Shapeにすると、形状の変換と回転が非常に簡単になります。

2Dグラフィックス、特にジオメトリの操作を見てください

于 2013-03-08T01:20:26.323 に答える