到目前为止,Piece对象也创建好了,所以“物资”齐全,该准备登上游戏的舞台———MainFrame中了,要想让物快在舞台上表演,得有”演员“在”舞台"上啊.所以,在MainFrame中提供了表示当前正在运动的Piece对象的引用currentPiece和下一个方块的引用nextPiece
private Piece currentPiece; private Piece nextPiece;
注意了当前大方块的运动是在GamePanel中运行的,(需要提出的是,游戏界面包括两个部分,一是方块的堆积界面GamePanel,一是工具界面。整个游戏界面用GameFrame来类实现),在MainFrame中提供了gamePanel(private GamePanel gamePanel;)
在继承JPanel中的GamePanel类中提供了实现了paint方法,把当前的大方块画到界面上。但是怎么在游戏界面MainFrame里得到当前运动的大方块呢?方法就是在GamePanel里提供一个MainFrame的引用mainFrame,(MainFrame mainFrame;),
并提供一个构造器来初始化mainFrame。
public GamePanel(MainFrame mainFrame) { this.mainFrame = mainFrame; }
为MainFrame类提供了一个获得当前下降大方块的方法
public Piece getCurrentPiece(){ return this.currentPiece; }
public void paint(Graphics g) { //画背景 g.drawImage(this.background,0, 0, this.getWidth(),this.getHeight(),null); //画当前运动的方块 /** * 由于方块是在游戏界面gamepanel里动的,所以在这里定义了话piece的方法 */ Piece currentPiece = this.mainFrame.getCurrentPiece(); ImageUtil.paintPiece(g, currentPiece); }
在这里我们将GamePanel看做是一个二维数组,每一个Square都是二维数组的一个元素,然后再paint中将这些小方块画到GamePanel中。当大方块进行下降的时候,GamePanel中就根据这个二维数组进行重画。注意二维数组中的Square元素是只含有位置而不含有图片的Square对象,为此需要在Square类里提供一个构造器
/* * 初始化方块的位置和图片。用来作为gamePanel存放有图片的square二维数组的元素 */ public Square(int beginX, int beginY) { this.image = image; this.beginX = beginX; this.beginY = beginY; }
当一个Piece对象完成下降时,我们需要将这个Piece里面有的带有图片的Square记录到MainFrame中。没完成一个下降就把Square加入二维数组中。下面是初始化界面的二维数组
/** * 游戏的界面看做是个二维数组组成的平面 * 当一个piece对象完成下降是,需要将这个piece里面所有的square对象添加到mainframe中 * 也就是gamePanel中。在mainframe类里提供一个二维数组来存放一个square对象 * 每个完成下降的piece都将自己所有的square对象存放到一个二维数组中 * 注意只是初始化这个二维数组,绘制二维数组在gamePanel里绘制 */ private void initSquares() { int xSize = this.gamePanel.getWidth()/Piece.SQUARE_BORDER; int ySize = this.gamePanel.getHeight()/Piece.SQUARE_BORDER; this.squares = new Square[xSize][ySize]; for(int i = 0; i < this.squares.length; i++) { for (int j = 0; j < this.squares[i].length; j++) { this.squares[i][j] = new Square(Piece.SQUARE_BORDER * i, Piece.SQUARE_BORDER * j); } } }
此方法在ManFrame里调用,以便在运行程序时就可以将二维数组初始化,然后再GamePanel里画出来。在这里MainFrame类里又提供了
private Square[][] squares;和
//得到游戏gamepanel的二维数组 public Square[][] getSquares() { // TODO Auto-generated method stub return this.square
}
这样在GamePanel类里就可以画好在GamePanel界面了(在paint里画)代码如下
public void paint(Graphics g) { //画背景 g.drawImage(this.background,0, 0, this.getWidth(),this.getHeight(),null); //画当前运动的方块 /** * 由于方块是在游戏界面gamepanel里动的,所以在这里定义了话piece的方法 */ Piece currentPiece = this.mainFrame.getCurrentPiece(); ImageUtil.paintPiece(g, currentPiece); // Square[][] squares = this.mainFrame.getSquares(); if(squares == null) return ; //绘制用来存放二维数组的代码, for(int i=0;i
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?