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



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

这是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()方法被调用,新的随机形状从顶部下降,现在的问题是如何在底部保留特定的形状,以便下一个操作可以进行

我将创建一个List的"形状",已经下降到俄罗斯方块的底部。这个List将在你的Tetris类中保存,当当前掉落的项目击中板的底部或一个已经掉落的形状时,它应该停止并添加到掉落列表中。

其他常用提示:

根据个人经验,除非必要,否则尽量远离大小> 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:正如Andrew在评论中建议的那样,"还要看看基于Shape的碰撞检测。它使用Java 2D Area对象来测试交集。"

最新更新