java开发俄罗斯方块学习笔记 Day-7 多态

本文介绍了一种基于Java的游戏UI绘制方法,通过自定义Lay类及其子类实现不同功能的UI组件绘制,并在PanelGame类中实现了这些UI组件的布局和绘制。文章详细展示了如何创建UI组件并为它们添加特定内容,如背景图片和数据库窗口。

分别建立Lay的子类LayDataBase、LayDisk、LayGame、LayButton、LayNext、LayLevel、LayPoint、LayAbout继承Lay,在创建Lay对象时使用Lay的子类创建,将Lay写成一个抽象类,在Lay类创建一个抽象方法paint,所有子类都必须覆写paint方法,在PanelGame类中将PaintComponent方法中调用的createWindow方法改为paint方法。

package ui;
import java.awt.Graphics;
import javax.swing.JPanel;

public class PanelGame extends JPanel{

private Lay[] lays=null;
public PanelGame(){
lays=new Lay[]{
//TODO 硬编码,是非常不好的开发习惯
//TODO 我们要尽量将数字或字符串定义成常量,或者写入配置文件
new LayBackground(0,0,0,0),
new LayDataBase(40,32,334,279),
new LayDisk(40,343,334,279),
new LayGame(414,32,334,590),
new LayButton(788,32,334,124),
new LayNext(788,188,176,148),
new LayLevel(964,188,158,148),
new LayPoint(788,368,334,200)
};
}
@Override //表示下面的方法要覆盖父类的方法
public void paintComponent(Graphics g){
//循环刷新游戏画面
for(int i=0;i<lays.length;i++){
//刷新层窗口
lays[i].paint(g);
}
}
}

	并将Lay类的变量x,y,w,h都定义为protectd类型,用于子类的调用
package ui;

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;


/**
 * 绘制窗口
 * @author Administrator
 *
 */
public abstract class Lay {
	//设置string里面图片在对应窗口内边距为16
	protected static final int PADDING=16;
	
	private static final int SIZE=7;
	//新建一个图片对象,并指定以工程为根,图片在项目的相对路径
	private static final Image WINDOW_IMG=new ImageIcon("Graphics/window/Window.png").getImage();
	//取图片宽度
	private static int WINDOW_W=WINDOW_IMG.getWidth(null);
	//取图片高度
	private static int WINDOW_H=WINDOW_IMG.getWidth(null);
	//窗口左上角x坐标
	protected int x;
	//窗口左上角y坐标
	protected int y;
	//窗口宽度
	protected int w;
	//窗口高度
	protected int h;
	
	protected Lay(int x,int y,int w,int h){
		this.x=x;
		this.y=y;
		this.w=w;
		this.h=h;
	}
	/**
	 * 绘制窗口
	 */
	protected void creatWindow(Graphics g){
		//(图片,图片在Panel上显示范围左上角x,左上角y,右下角x,右下角y,源图片坐标切割起始点x,切割起始点y,切割终点x,切割终点y,null)
		//左上
		g.drawImage(WINDOW_IMG, x, y, x+SIZE, y+SIZE, 0, 0, SIZE, SIZE, null);
		//中上
		g.drawImage(WINDOW_IMG, x+SIZE, y, x+w-SIZE, y+SIZE, SIZE, 0, WINDOW_W-SIZE, SIZE, null);
		//右上
		g.drawImage(WINDOW_IMG, x+w-SIZE, y, x+w, y+SIZE, WINDOW_W-SIZE, 0, WINDOW_W, SIZE, null);
		//左中
		g.drawImage(WINDOW_IMG, x, y+SIZE, x+SIZE, y+h-SIZE, 0, SIZE, SIZE, WINDOW_H-SIZE, null);
		//中
		g.drawImage(WINDOW_IMG, x+SIZE, y+SIZE, x+w-SIZE, y+h-SIZE, SIZE, SIZE, WINDOW_W-SIZE, WINDOW_H-SIZE, null);
		//右中
		g.drawImage(WINDOW_IMG, x+w-SIZE, y+SIZE, x+w, y+h-SIZE, WINDOW_W-SIZE, SIZE, WINDOW_W, WINDOW_H-SIZE, null);
		//左下
		g.drawImage(WINDOW_IMG, x, y+h-SIZE, x+SIZE, y+h, 0, WINDOW_H-SIZE, SIZE, WINDOW_H, null);
		//中下
		g.drawImage(WINDOW_IMG, x+SIZE, y+h-SIZE, x+w-SIZE, y+h, SIZE, WINDOW_H-SIZE, WINDOW_W-SIZE, WINDOW_H, null);
		//右下
		g.drawImage(WINDOW_IMG, x+w-SIZE, y+h-SIZE, x+w, y+h, WINDOW_W-SIZE, WINDOW_H-SIZE, WINDOW_W, WINDOW_H, null);
	}
	
	/**
	 * 刷新游戏具体内容
	 * @author xiayichong
	 * @param g 画笔
	 */
	//定义一个抽象方法,必须被子类覆写
	 public abstract void paint(Graphics g);
		
}
	向LayDataBase类中插入一张“数据库”图片
package ui;

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;

public class LayDataBase extends Lay{
	
	private static Image IMG_DB=new ImageIcon("Graphics/string/db.png").getImage();
	
	public LayDataBase(int x,int y,int w,int h){
		super(x,y,w,h);
	}
	
	public void paint(Graphics g){
		this.creatWindow(g);
		/*打印string目录下的db.png图片,保持原图片大小,this.x+16表示相对数据库窗体左上角顶点x轴16个像素距离
		  this.y+16表示相对数据库窗体左上角顶点y轴16个像素距离*/
		g.drawImage(IMG_DB,this.x+PADDING,this.y+PADDING, null);
	}
}
其他窗口上文字图片添加方法也跟上面一样。
下面尝试为Panel添加一个背景图片
package ui; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; public class LayBackground extends Lay { //TODO 临时背景 private static Image IMG_BG_TEMP=new ImageIcon("Graphics/background/bg01.jpg").getImage(); protected LayBackground(int x, int y, int w, int h) { super(x, y, w, h); // TODO Auto-generated constructor stub } @Override public void paint(Graphics g) { // TODO x,y没有加this就从Panel的左上角开始算,图片过小,调用drawImage的重载函数对图片进行拉伸为1162*654 g.drawImage(IMG_BG_TEMP,0,0,1162,654,null); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值