Java俄罗斯方块01-03

  之前用java web写过俄罗斯方块游戏,但由于实习想做Java,把项目经历转成了Java,找了视频一边看一边做,看完一部分整理成博客以便后续复习思考。视频链接

  这部分画出了游戏窗口,将TetrisClient类继承了Frame类,以下有几个需要注意的点:

    a. 这里的修正值定义了游戏区域到窗口边缘的距离;

    b. 这里添加窗口关闭方法的时候使用了匿名类:

        面试题:匿名类的作用---匿名类相当于在定义类的同时再新建这个类的实例。匿名类可以在需要的地方使用接口, 可以在使用的同时实现, 这样不但节省了空间, 还可以使代码更加明了。这里对于addWindowListener中windowClosing进行重写,右击addWindowListener,在出现的菜单中,选择Source-Override/Implement Methods。

    c. 这里的刷新类用线程实现:sleep(n),n越大,则下落越慢;

    d. 这里控制方块停止运动的条件: y + SIZE >= TetrisClient.CORRECT_Y + TetrisClient.GAME_HEIGHTH

 

TetrisClient类:

import java.awt.*;
import java.awt.event.*;

public class TetrisClient extends Frame{
	//声明变量,窗口出现的位置	
	int x = 300;
	int y = 100; 
	
	//游戏窗体宽高
	public static final int WIDTH = 400;
	public static final int HEIGHT = 480;
	//修正值
	public static final int CORRECT_X = 110;
	public static final int CORRECT_Y = 50;
	//游戏区域大小
	public static final int GAME_WIDTH = 200;
	public static final int GAME_HEIGHTH = 400;
	//实例化一个Unit对象
	Unit u = new Unit(CORRECT_X + 100, CORRECT_Y + 80);
	
	public void lancher() {
		//出现位置
		this.setLocation(x,y);
		//大小
		this.setSize(WIDTH, HEIGHT);
		//设置标题
		this.setTitle("Tetris Game");
		//不可调节大小
		this.setResizable(false);
		//布局属性
		this.setLayout(null);
		//设置游戏背景颜色
		this.setBackground(new Color(245, 212, 226));
		//添加窗口关闭事件
		this.addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
			
		});
		//启动一个刷新线程
		new Thread(new paintThread()).start();
		//可见性
		this.setVisible(true);
	}
	
	@Override
	public void paint(Graphics g) {
		Color c = g.getColor();
		g.drawRect(CORRECT_X, CORRECT_Y, GAME_WIDTH, GAME_HEIGHTH);
		g.setColor(c);
		
		//画出Unit对象U
		u.draw(g);
		u.changeStatus();
		if(!u.stopped) {
			u.drop();
		}
	}

	public static void main(String[] args) {
		new TetrisClient().lancher();
	}
	
	//刷新类(内部类)-线程
	public class paintThread implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(true) {
				repaint();
				//刷新间隔
				try {
					Thread.sleep(300);
				} catch (InterruptedException e) {
					e.getStackTrace();
				}
			}
		}		 
	}
}

Unit类:

import java.awt.Color;
import java.awt.Graphics;

public class Unit {
	//出现的位置
	int x,y;
	//大小
	public static final int SIZE = 20;
	//下落步长
	public static final int SPEED = 20;
	//停止状态
	public boolean stopped = false;
	
	//构造函数
	public Unit(int x,int y) {
		this.x = x;
		this.y = y;
	}
	
	//画出自己的方法
	public void draw(Graphics g) {
		Color c = g.getColor();
		g.setColor(Color.BLUE);
		g.drawRect(x, y, SIZE, SIZE);
	}
	
	public void drop() {
		y += SPEED;
	}
	//检测当前状态
	public void changeStatus() {
		if(y + SIZE >= TetrisClient.CORRECT_Y + TetrisClient.GAME_HEIGHTH) {
			stopped = true;
		}
	}

}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页