《Java小游戏实现》:坦克大战
前面写了一个简单的聊天小程序,今天开始就写一个坦克大战的游戏,算是对Java相关小知识点的一个应用。
这个游戏的完成,我们也是分步完成,逐步累加,一个一个小功能的添加,最后直至完成整个游戏的开发。
第一步:写一个界面
public class TankClient extends JFrame{
public static void main(String[] args) {
new TankClient().launchFrame();
}
public void launchFrame(){
this.setTitle("坦克大战");
this.setLocation(300, 400);
this.setSize(300, 400);
//this.setBackground(Color.RED);
this.getContentPane().setBackground(Color.RED);
//为关闭窗口添加响应
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//设置是否允许用户改变窗口的大小,这里限制下,不允许
this.setResizable(false);
this.setVisible(true);
}
}
以上就是为坦克大战写了一个界面,这是我们的第一步,算是完成了。
在完成这个界面时,遇到了一点小小的问题,这里有必要说明下,本来我想将这个界面设置一个背景颜色,但是使用
this.setBackground(Color.RED);就是不能成功,于是百度了下,这是由于我这里继承的是JFrame,而不是Frame,如果是继承的是Frame,则就可以通过this.setBackground(Color.RED)来设置颜色。如果我们选择的是继承JFrame,则需要使用this.getContentPane().setBackground(Color.RED)来设置背景颜色。
出现上面的原因如下:Frame和JFrame的窗口层次结构不同,JFrame的窗口包括:JFrame、Root Pane、Layered pane、Content Pane、Glass Pane;而Frmae窗口包括:Frame、Content Pane。
其次,窗口背景颜色是指直接调用JFrame或者Frame的setBackground(Color color)方法设置后显示出来的颜色。其实,JFrame在你直接调用这个方法后,你的确设置了背景颜色,而你看到的却不是直接的JFrame或者Frame,而是JFrame.getContentPane().而JFrame上的contentPane默认是Color.WHITE的,所以,无论你对JFrame或者Frame怎么设置背景颜色,你看到的都只是contentPane.因此,
this.setBackground(Color.RED);
his.getContentPane().setVisible(false);//得到contentPane容器,设置为不可见
也可以解决JFram设置的背景颜色的问题。
第二步:在界面上显示一个坦克图标
有界面,没有坦克在上面,肯定不是我们想要的,是吧,因此,我们就先完成这个功能。
在这里我们用一个圆来代表一个坦克。绘图代码如下:
@Override
public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(50, 50, 30, 30);
g.setColor(c);
}
完整的代码如下:
public class TankClient extends Frame{
public static void main(String[] args) {
new TankClient().launchFrame();
}
@Override
public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(50, 50, 30, 30);
g.setColor(c);
}
public void launchFrame(){
this.setTitle("坦克大战");
this.setLocation(300,