任务二 绘制坦克外形
绘图技术
1.1.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()方法来绘制组件。
1.1.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) 绘制椭圆并将其内部用前景色填充。
任务2实现
思考:项目中既有我方坦克,也有敌方坦克,敌我双方坦克颜色不同,出现位置不同,并且后期坦克还会移动。在程序中如何设计?
类提取:名词提取法,项目需求文档,提取名词。名词有可能是类,还有可能是类的静态属性,子弹
坦克属性:坐标,方向,颜色,类型
需要注意的是:
要在任务一中创建的MenuDemo类中创建GamePanel的对象,将其添加到center容器中
`GamePanel tk=new GamePanel();
center.add("jiemian",tk);`
然后在对**开始**菜单项添加事件监听
startMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
card.show(center,"jiemian");
}
});
分别创建四个类
1. GamePanel //用于呈现坦克的界面
import java.awt.Color;
import java.awt.Graphics;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class GamePanel extends JPanel{
Vector<DfTank> v;
DfTank df1,df2,df3;
MyTank my;
public GamePanel() {
JLabel jl1;
jl1=new JLabel("Game Start!");
this.add(jl1);
my=new MyTank(10,10,1);
v=new Vector<DfTank>();
df1=new DfTank(130,250,2);
df2=new DfTank(250,100,3);
df3=new DfTank(300,150,4);
v.add(df1);
v.add(df2);
v.add(df3);
}
public void paint(Graphics g) {
super.paint(g);
drawTank(g,my.getX(),my.getY(),my.getType(),my.getDirection());
for(int i=0;i<v.size();i++) {
DfTank df=(DfTank)v.get(i);
drawTank(g,df.getX(),df.getY(),df.getType(),df.getDirection());
}
}
public void drawTank(Graphics g, int x, int y, int type, int direction) {
switch (type) {
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 + 8, y + 11, 4, 4);// 绘制圆
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 + 11, y + 8, 4, 4);// 绘制圆
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 + 8, y + 11, 4, 4);// 绘制圆
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 + 11, y + 8, 4, 4);// 绘制圆
g.drawLine(x, y + 10, x + 15, y + 10);// 绘制线
break;
}
}
}
2. tank //所有坦克的父类
import java.awt.Color;
public class tank {//我们通常会对tank类进行封装,这样就可以增加了数据访问限制,增加了程序可维护性
private int x;
private int y;
private int direction;
Color color;//为我方坦克和敌方坦克设置颜色加以区分
private int type;//声明坦克的类型(敌我)
private int speed;
/*对象的封装性:
private的只有对象自己才可以访问,其他任何对象不行,包括它的子类和父类。
安全性高,其他对象只能通过它的public方法,set,get来获取或设置原对象的private属性。*/
public tank(int x,int y,int direction) {
this.x=x;
this.y=y;
this.direction=direction;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getDirection() {
return direction;
}
public void setDirection(int direction) {
this.direction = direction;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
}
3. MyTank //我方坦克
import java.awt.Color;
import java.util.Vector;
public class MyTank extends tank{
public MyTank(int x, int y, int direction) {
// TODO Auto-generated constructor stub
super(x,y,direction);
this.setType(1);
this.setSpeed(2);
}
}
4. DfTank //敌方坦克
public class DfTank extends tank{
public DfTank(int x, int y, int direction) {
super(x, y, direction);
// TODO Auto-generated constructor stub
this.setType(0);
this.setSpeed(2);
}
}
最后效果图如下: