0

这是每 5 秒生成和绘制一个四氨基图形的代码。然而,这个数字被淹没了两次,因此扭曲了原始画面。

这里 tetramino 图形由 10x10 像素块组成。构造函数图形告诉块的位置和颜色。方法paint(Graphics g) 逐块绘制图f。

import java.applet.*;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;


import javax.swing.Timer;
public class Tetris extends Applet  {

    Dimension size;
    int x1,y1;
    private int xs=0,ys=0;


    public int getXs() {
        return xs;
    }
    public void setXs(int xs) {
        this.xs = xs;
    }
    public int getYs() {
        return ys;
    }
    public void setYs(int ys) {
        this.ys = ys;
    }
    public void rotate(){

    }
    public Figure generate(){
        Figure i = new Figure(new int[][]{new int[]{1},new int[]{1},new int[]{1},new int[]{1}},Color.CYAN);
        Figure j = new Figure(new int[][]{new int[]{1,0,0}, new int[]{1,1,1}},Color.BLUE);
        Figure l = new Figure(new int[][]{new int[]{0,0,1}, new int[]{1,1,1}},Color.ORANGE);
        Figure o = new Figure(new int[][]{new int[]{1,1}, new int[]{1,1}},Color.YELLOW);
        Figure s = new Figure(new int[][]{new int[]{0,1,1}, new int[]{1,1,0}},Color.GREEN);
        Figure t = new Figure(new int[][]{new int[]{1,1,1}, new int[]{0,1,0}},Color.PINK);
        Figure z = new Figure(new int[][]{new int[]{1,1,0}, new int[]{0,1,1}},Color.RED);

        Figure[] genSet = {i,j,l,o,s,t,z};
        int index =((int) (Math.random() * 7)) ;
        //System.out.println(index);
        return  genSet[index];
    }
    public void drop(){

    }
    public void shift(){

    }
    public void movecheck(){

    }
    public void actiondelay(){
        ActionListener actionlistener = new ActionListener() {
            public void actionPerformed(ActionEvent actionevent){
                repaint();
            }

        };
        Timer timer = new Timer(5000,actionlistener);
        timer.start();
    }
    public void init(){
        setSize(200,400);
        setBackground(Color.black);
        size = getSize();

    }

    public void paint(Graphics g){

        super.paint(g);
        System.out.println("________________");
        Graphics2D g2d = (Graphics2D) g.create();
        Figure f = generate();
        int length = f.getX()[0].length;
        for(int j =0; j<f.getX().length;j++){
            System.out.println();
            ys = 0;                 
            for(int i=0;i<length;i++){                      

                if (f.getX()[j][i] == 1){
                    Rectangle2D p = new Rectangle2D.Double(xs,xs,xs+10,ys+10);
                    g2d.setColor(f.getY());
                    g2d.draw(p);
                    //g2d.drawRect(p.x, p.y, p.width, p.height);    
                    //g2d.fillRect(p.x, p.y, p.width, p.height);                    
                    //System.out.println("widnth: " +p.width + " | height: " + p.height + " end ");
                    System.out.print("*");
                }
                else System.out.print(" ");
                ys+=10;             
            }
            xs+=10;
        }
        xs=0;
        ys=0;
        actiondelay();                      
       //g.setColor(Color.white);
       //g.drawRect(45, 95, 55, 105);        
    }


}


import java.awt.Color;

public class Figure{
    int[][] x;
    Color y;
    public Figure(int[][] x , Color y){
        this.x=x;
        this.y=y;
    }
    public int[][] getX() {
        return x;
    }
    public void setX(int[][] x) {
        this.x = x;
    }
    public Color getY() {
        return y;
    }
    public void setY(Color y) {
        this.y = y;
    }
}
4

3 回答 3

0

g2d.dispose()我认为你在你的方法中错过了一个调用paint()。我不确定这是否能解决问题,但尝试一下不会有什么坏处。

于 2012-07-25T23:47:42.313 回答
0

您的图像不是因为图形被绘制了两次而扭曲,而是因为您几乎没有错误new Rectangle2D.Double(xs,xs,xs+10,ys+10);

  1. 在开始xy位置你使用xs了两次而不是xsandys
  2. 您的widthandhight不是固定值,而是与xsand相关ys

此外,您的循环正在增加xs,而不是ys当您进入新行时。

尝试用以下方法替换您的paint()方法:

public void paint(Graphics g){

    super.paint(g);
    System.out.println("________________");
    Graphics2D g2d = (Graphics2D) g.create();
    Figure f = generate();
    int length = f.getX()[0].length;
    for(int j =0; j<f.getX().length; j++){
        System.out.println();

        for(int i=0; i<f.getX()[0].length; i++){                      

            if (f.getX()[j][i] == 1){
                Rectangle2D p = new Rectangle2D.Double(xs, ys, 10, 10);
                g2d.setColor(f.getY());
                g2d.draw(p);
                //g2d.drawRect(p.x, p.y, p.width, p.height);    
                //g2d.fillRect(p.x, p.y, p.width, p.height);                    
                //System.out.println("widnth: " +p.width + " | height: " + p.height + " end ");
                System.out.print("*");
            }
            else System.out.print(" ");
            xs+=10;
        }
        xs = 0;
        ys+=10;             
    }
    xs=0;
    ys=0;
    actiondelay();                      
   //g.setColor(Color.white);
   //g.drawRect(45, 95, 55, 105);        
}

也是javax.swing.Timer(int delay, ActionListener listener)循环线程的类型,因此如果您想在delay. 在你的地方,我会将代码actiondelayinit.

于 2012-07-26T00:14:25.087 回答
0

问题在于你如何使用你的Timer. 我不知道您为什么坚持在每个“绘制”周期创建一个新计时器。

您无法控制绘制周期,Java 可以。所以基本上,发生的事情是每次绘制组件时(可能是Timer事件之间的多次),您正在创建一个新的Timer,每 5 秒重复一次。这意味着你正在运行n 个计时器,这会给你带来很多有趣的东西......

相反,创建一个计时器:

@Override
public void start() {

    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {

            timer = new Timer(5000, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {

                    repaint();

                }
            });

            timer.setInitialDelay(5000);
            timer.setCoalesce(true);
            timer.start(); // Repeats by default...

        }
    });

}

不要改变绘画方法中的任何东西。只是不要你可能会触发更多的绘制请求,这最终会使 EDT 过载并在短时间内将你的 CPU 运行到 100%。

于 2012-07-26T00:20:48.580 回答