如何在俄罗斯方块游戏中保留底部的矩形?

时间:2014-06-30 07:17:37

标签: java swing oop graphics

我已经开始开发俄罗斯方块游戏了。一切都很好,但如何在底部保留矩形?

这是Comp1类,其中检索随机形状并使用计时器

向下移动
package buildblock;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import buildblock.tetris;
public class Comp1 extends JPanel implements ActionListener {

int curx=10;
int cury=30;
int nx=0;
int ny=0;
int p=1;
 Timer t;
boolean EndofLine=false;
JLabel l1=new JLabel("");
int value=0;
int coords[][][]=new int[3][3][2];
int shape[][][][]={
        {{{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0}}},
        {{{0,0},{100,20},{0,0}},{{0,0},{100,40},{0,0}},{{80,60},{100,60},{0,0}}},
        {{{0,0},{100,20},{0,0}},{{80,40},{100,40},{120,40}},{{0,0},{0,0},{0,0}}},
        {{{0,0},{100,20},{0,0}},{{0,0},{100,40},{0,0}},{{0,0},{100,60},{0,0}}},
        {{{80,20},{100,20},{0,0}},{{0,0},{100,40},{0,0}},{{0,0},{100,60},{0,0}}},
        {{{0,0},{100,20},{0,0}},{{80,40},{100,40},{0,0}},{{80,60},{0,0},{0,0}}},
        {{{80,20},{0,0},{0,0}},{{80,40},{100,40},{0,0}},{{0,0},{100,60},{0,0}}},
         {{{80,20},{100,20},{0,0}},{{80,40},{100,40},{0,0}},{{0,0},{0,0},{0,0}}},
        };

Comp1(tetris Parent)
{
   setVisible(true);
   setSize(400,900);
   curx=(400-curx)/2;
   setLayout(new BorderLayout());
   timer();
}

public void getShape(int a)
{
     for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            for(int k=0;k<2;k++)
            {
            coords[i][j][k]=shape[a][i][j][k];
             repaint();
            }
        }
    }
}

public void paint(Graphics g)
{
    super.paint(g);

    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            for(int k=0;k<2;k++)
            {
                if(coords[i][j][k]!=0)
                {
                    if(k==0)
                    {
                        curx=coords[i][j][k]+nx;
                    }
                    else
                    {
                        cury=coords[i][j][k]+ny;
                        drawRec(g,curx,cury,20,20);

                    }
                }
            }
        }
    }              
}

 public void drawRec(Graphics g,int newx,int newy,int w,int h)
 {
             g.drawRect(newx, newy, 20, 20);
             g.drawLine(curx+1,cury+20-1,curx+20-1,cury+20-1);       
 }

public void timer()
{
t=new Timer(150,this);
  t.start();
}

public int Random()
{
    Random r=new Random();
    int n=Math.abs(r.nextInt()%7+1);
    return n;
}

public void lineDown()
{
    ny=ny+10;
    repaint();
}

public void actionPerformed(ActionEvent e) 
{
    if(value!=250&&!EndofLine)
    {     
        value=value+5;
        if(p==0)
        {
            p=Random();
        }
        getShape(p);
        lineDown();
    }
    else
    {
        p=Random();
        ny=0;
        EndofLine=false;
        value=0;
    }
}
}

形状是一个四维数组,从中检索特定矩形的宽度和高度,共同形成所需的形状。通过随机函数,我们使用getShape()方法选择特定形状并使用drawRect函数我们绘制矩形。

现在lineDown函数向下移动特定形状,增量为10,并且在到达最后一行后调用repaint()方法并且新的随机形状从顶部向下移动。问题现在是如何保留底部的特定形状,以便进行下一步操作。

1 个答案:

答案 0 :(得分:3)

我会创建一个List&#34;形状&#34;已经跌落到俄罗斯方块板底部。这个List将保留在您的Tetris类中,当当前下降的项目击中棋盘底部或其中一个已经失效的形状时,它应该被停止并添加到下降的列表中。

其他一般提示:

从个人经验来看,尽量远离大小的阵列&gt; 2,除非有必要;他们臃肿,困惑,难以维持。在您的情况下,使用称为Shape的完美界面。看看这段代码

// java.awt.geom.Path2D implements java.awt.Shape
java.awt.geom.Path2D path = new Path2D.Double();
path.moveTo(0, 0);
path.lineTo(2, 0);
path.lineTo(2, 2);
path.lineTo(2, 0);
path.closePath();
path.transform(AffineTransform.getScaleInstance(20, 20));

这会创建一个Shape,这是您的基本方块!然后,您可以访问自己无法实现的强大功能。

PS:正如安德鲁在评论中所建议的那样,&#34;另请参阅Shape基于collision detection。它使用Java 2D Area对象来测试交集。&#34;