坦克大战项目3
任务3:绘制坦克外形
1.绘图实现原理:
Java在AWT的根类Component类中预置了paint(Graphics g)方法
paint方法的参数是一个图形类Graphics对象
在类Graphics中系统预置了大量的用于图形处理与输出的方法
在paint()方法的重新定义中,可以通过Graphics的对象g来调用方法进行图形处理与输出。
paint()方法是由程序运行的环境来调用,每当一个AWT构件首次显示或在部分显示已被破坏而必须刷新时该方法被自动地调用。
Component类提供了两个和绘图相关最重要的方法
1)paint(Graphics g)绘制组件外观
2)repaint()刷新组件的外观
3)update(Graphics g): 调用paint()方法,刷新组件外观。
当组件第一次在屏幕显示时,程序会自动的调用paint()方法来绘制组件。
2. Graphics类
Graphics类是一个抽象的画笔对象,Graphics可以在组件上绘制丰富多彩的几何对象和位图。坐标同前面讲的一样,容器左上角为(0,0),向右x坐标增加,向下y坐标增加。
1)在Graphics类中使用drawLine()方法画一条线段,方法如下:
drawLine(int x1,int y1,int x2,int y2)
2)Graphics类中提供了3种类型的矩形:普通矩形、圆角矩形和三维矩形。
每一种矩形都提供两种不同风格的方法:
仅画出矩形的边框;
不仅画出边框,并且还用相同的颜色将整个矩形区域填满;
- 画出普通矩形
drawRect(int x,int y,int width,int) - 画出一个填充型风格的普通矩形
fillRect(int x,int y,int width,int height) - 画出一个圆角矩形
drawRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight) - 画填充型的圆角矩形
fillRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight) - 画三维矩形
draw3DRect(int x,int y,int width,int height,boolean raised) - 画填充型三维矩形
fill3DRect(int x,int y,int width,int height,boolean raised)
3)圆和椭圆的输出
Java中绘制椭圆是以其外接矩形作为参数来实现的,与画普通矩形的方法相似。
drawOval(int x,int y,int width,int height) 绘制一个椭圆
fillOval(int x,int y,int width,int height) 绘制椭圆并将其内部用前景色填充。
(详细方法介绍可以参考一下帮助文档)
下为绘制坦克的两种画法方法:
// DrawTank坦克的画法1;
//设置坦克颜色
g.setColor(color);
//1.画出左边的矩形
g.fillRect(x,y, 5, 30);
//2.画出右边的矩形
g.fillRect(x+15,y, 5, 30);
//3.画出中间的矩形
g.fill3DRect(x+5,y+5, 10, 20,false);
//4.画出中间的圆型
g.fillOval(x+5,y+10, 10, 10);
//5.画炮管
g.drawLine(x+10,y+1,x+10,y+15);、
//DrawTank坦克的画法2;
public void DrawTank1(int x,int y,Color color,Graphics g) {
g.setColor(color);
g.drawRect(x, y,5, 30);
g.drawRect(x+15, y, 5, 30);
g.drawRect(x+5, y+5, 10, 20);
g.drawOval(x+8, y+11, 4, 4);
g.drawLine(x+10, y, x+10, y+15);
}
上述的两种画法虽然代码的书写方式不同,但是实现是一样的 第二种与第一种相比较,第二中国方法封装起来了,便于以后的调用。
除了坦克的绘制之外,每个坦克都有自己的方向我们可以用一个switch (direction){ }语句来控制,当direction值为1时坦克方向向上,为2时向右,为3时向下,为4时向右代码如下:
switch (direction) {
case 1:// 方向向上
g.fill3DRect(x, y, 5, 30, false); // 绘制左边矩形
g.fill3DRect(x + 5, y + 5, 10, 20, false); // 绘制中间矩形
g.fill3DRect(x + 15, y, 5, 30, false);// 绘制右边矩形
g.drawOval(x + 5, y + 10,10, 10);// 绘制圆
g.drawLine(x + 10, y, x + 10, y + 15);// 绘制线
break;
case 2:// 方向向右
g.fill3DRect(x, y, 30, 5, false); // 绘制上边矩形
g.fill3DRect(x + 5, y + 5, 20, 10, false); // 绘制中间矩形
g.fill3DRect(x, y + 15, 30, 5, false);// 绘制下边矩形
g.drawOval(x + 10, y + 5, 10, 10);// 绘制圆
g.drawLine(x + 15, y + 10, x + 30, y + 10);// 绘制线
break;
case 3:// 方向向下
g.fill3DRect(x, y, 5, 30, false); // 绘制左边矩形
g.fill3DRect(x + 5, y + 5, 10, 20, false); // 绘制中间矩形
g.fill3DRect(x + 15, y, 5, 30, false);// 绘制右边矩形
g.drawOval(x + 5, y + 10, 10, 10);// 绘制圆
g.drawLine(x + 10, y + 15, x + 10, y + 30);// 绘制线
break;
case 4:// 方向向左
g.fill3DRect(x, y, 30, 5, false); // 绘制上边矩形
g.fill3DRect(x + 5, y + 5, 20, 10, false); // 绘制中间矩形
g.fill3DRect(x, y + 15, 30, 5, false);// 绘制下边矩形
g.drawOval(x + 10, y + 5, 10, 10);// 绘制圆
g.drawLine(x, y + 10, x + 15, y + 10);// 绘制线
break;
}
值得注意的时在每次绘制完之后都要用刚刚break返回对象。
除了绘制坦克之外还必须要区分开敌我双方的坦克,这时候我们也可以用一个switch (leixing) { }语句进行区分,加上前面坦克方向的switch语句,我们可以用一个总的方法进行封装,把坦克的类型以及方向封装在同一个方法里,方便以后的调用。代码如下:
public void DrawTank(int x,int y,int direction, int leixing,Graphics g) {
switch (leixing) {
case 1: // 我方坦克
g.setColor(Color.red);
break;
case 0:// 敌方坦克
g.setColor(Color.blue);
break;
}
switch (direction) {
case 1:// 方向向上
g.fill3DRect(x, y, 5, 30, false); // 绘制左边矩形
g.fill3DRect(x + 5, y + 5, 10, 20, false); // 绘制中间矩形
g.fill3DRect(x + 15, y, 5, 30, false);// 绘制右边矩形
g.drawOval(x + 5, y + 10,10, 10);// 绘制圆
g.drawLine(x + 10, y, x + 10, y + 15);// 绘制线
break;
case 2:// 方向向右
g.fill3DRect(x, y, 30, 5, false); // 绘制上边矩形
g.fill3DRect(x + 5, y + 5, 20, 10, false); // 绘制中间矩形
g.fill3DRect(x, y + 15, 30, 5, false);// 绘制下边矩形
g.drawOval(x + 10, y + 5, 10, 10);// 绘制圆
g.drawLine(x + 15, y + 10, x + 30, y + 10);// 绘制线
break;
case 3:// 方向向下
g.fill3DRect(x, y, 5, 30, false); // 绘制左边矩形
g.fill3DRect(x + 5, y + 5, 10, 20, false); // 绘制中间矩形
g.fill3DRect(x + 15, y, 5, 30, false);// 绘制右边矩形
g.drawOval(x + 5, y + 10, 10, 10);// 绘制圆
g.drawLine(x + 10, y + 15, x + 10, y + 30);// 绘制线
break;
case 4:// 方向向左
g.fill3DRect(x, y, 30, 5, false); // 绘制上边矩形
g.fill3DRect(x + 5, y + 5, 20, 10, false); // 绘制中间矩形
g.fill3DRect(x, y + 15, 30, 5, false);// 绘制下边矩形
g.drawOval(x + 10, y + 5, 10, 10);// 绘制圆
g.drawLine(x, y + 10, x + 15, y + 10);// 绘制线
break;
}
}
这样就把坦克绘制完成了,在以后坦克的绘制中我们可以直接调用这个方法进行坦克的绘制。