在“java俄罗斯方块小游戏编写心得01”中已经将游戏界面完成,那么接下来就是要让方块动起来。
我们之前在写Cell类时,曾经给每个最基本小方块定义了三个方法,即左移、右移、下落,而七种方块皆是由四个最基本小方块组成,所以我们可以在Tetromino类中定义一个七种方块自动下落方法,然后在方法中对七种方块的四个最基本小方块分别调最基本小方块的下落方法,这样就可以使七种小方块动起来。左移、右移皆是如此。
代码如下:
package com.practict;
public class Tetromino {
protected Cell[] cells=new Cell[4];
public void moveLeft() {
for(Cell c:cells) {
c.Left();
}
}
public void moveRight() {
for(Cell c:cells) {
c.right();
}
}
public void softMoveDrop() {
for(Cell c:cells) {
c.drop();
}
}
}
仅仅这样还不足以使小方块动起来,我们需要在程序运行时自动调用该方法,现在我们想,当点开俄罗斯方块这个游戏时,这个游戏便已经开始,由此,我们可以定义一个start()方法,来封装所有游戏开始后可以进行的操作,包括游戏自动进行的和认为操控的如变形、右移等,然后在主方法中创建完窗体后对该方法进行自动调用,现在,这个小方块才算动起来了。
代码如下:
package com.practict;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Tetris extends JPanel{
public void start(){
currentOne.softMoveDrop();
}
public static void main(String[] args){
JFrame jf=new JFrame("火拼俄罗斯");
Tetris tetris=new Tetris();
jf.add(tetris);
jf.setVisible(true);
jf.setSize(535,595);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
tetris.start();
}
}
当再次运行,我们发现他仍然没有下落,当程序运行后,start()方法只调用了一次,相应的,其中currentOne.moveDrop()方法也只调用了一次,那么如果想让他动起来,就得使得方法不断的去自己调用,所以,此处我们需要一个死循环来让系统不断的自动调用moveDrop方法
代码如下:
package com.practict;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Tetris extends JPanel{
public void start(){
while(true){
currentOne.softMoveDrop();
}
}
}
现在我们再次运行,发现仍然没有下落,这是因为虽然面板在启动时会自动调用paing(Graphics g)方法,但是也仅仅只是调用一次,所以系统只画出了最初的界面的样子,虽然在后台我们的方块在下落,但是面板并没有将其画出,那么现在我们就需要一个repaint()方法来重新将游戏界面画出,那么这样,我们就可以肉眼看到方块在下落了
代码如下:
package com.practict;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Tetris extends JPanel{
public void start(){
while(true){
currentOne.softMoveDrop();
repaint();
}
}
}
再次运行,发现界面上竟然没有了方块!为什么呢?这涉及到一个系统线程的问题,因为系统的运算速度非常快,所以我们还没有看到方块最开始到下落,他就已经落到了最下面,直至消失,所以现在我们需要一个小方法来控制系统的运行速度,使其能够使得我们肉眼可见,其中,Thread.sleep()方法中的参数单位为ms。
代码如下:
package com.practict;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Tetris extends JPanel{
public void start(){
while(true){
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace;
}
currentOne.softMoveDrop();
repaint();
}
}
}
现在我们再运行后可以发现,方块已经可以开始下落了,但是我们也可以发现一个问题,方块无法停留在最下层,那么现在我们就需要一个方法来使方块当下落到最底层后使其停留在最底层,而不是消失在最底层。