JAVA游戏《坦克大战》(一)
完成效果图
这是使用java完成的一个小窗体游戏,目前已实现八方位移动,炮弹发射,定时生成敌军坦克生成且可以自行移动,坦克及炮弹的碰撞的检测,我在这里总结一下游戏的制作过程及使用的技术。
游戏场景布局
游戏的整体都是使用图片进行加载展示的,图片可以上网找并进行ps处理,也可以简单的使用纯背景颜色搭建一个画面简单的游戏。
public class tankedz extends Frame{
private static final long serialVersionUID = 1L;
private tankedz tc = this;
//在外面定义窗体的大小,方便后期调整
static int width=1200;static int height=800;
//背景图片与坦克的图片的加载
Image zhutk = Toolkit.getDefaultToolkit().getImage("img/ztk50.png");
Image desk = Toolkit.getDefaultToolkit().getImage("img/caopin.jpg");
//绘制场景
public void paint(Graphics g){
fps++;
g.drawImage(desk, 0, 0, this);//绘制图片
g.setColor(Color.white);//字体颜色
Font font = new Font("等线", Font.BOLD, 14); //设置字体样式
g.setFont(font);
mytank.draw(g);
//显示游戏信息
g.drawString("坦克数量:" + tankes.size(), 10, 50);
g.drawString("炮弹数量:"+missiles.size(),10,70);
g.drawString("爆炸数量:"+baoes.size(),10,90);
}
//生成窗口
private void launchFrame(){
this.setLocation(450,150);//窗口位置
this.setSize(width,height);//窗口大小
this.setTitle("坦 克 大 战 │ by 丘 秋");//标题栏文字
this.addKeyListener(new Keynote());
//禁止窗口改变大小
this.setResizable(false);
setVisible(true);
//启动线程
new Thread(new PaintThread()).start();
}
//线程重画
//通过线程不断的重绘使游戏画面不断刷新
private class PaintThread implements Runnable{
public void run() {
while(true){
try {
repaint();
Thread.sleep(33);//线程睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
通过以上方法就能简单的创建出游戏窗体与背景了
上面比较重要的方法是创建线程进行画面的刷新重绘,在游戏过程中坦克的移动就是通过不断重绘所实现的。
解决画面闪烁问题
在游戏运行起来后,如果刷新频率过高会出现画面闪烁的想象,这是因为上一个画面还未绘制完成下一个画面已经开始绘制了,特别是在后面坦克移动的时候闪烁现象会更加的严重,要解决这个问题就需要用到画面缓存,将要绘制的内容先加载到一张图片中再将这个图片显示出来。
//在类中再定义一个变量
Image offScreenImage = null;
//在绘制前将内容加载到一张图片中
public void update(Graphics g){
if(offScreenImage == null){
offScreenImage=this.createImage(width, height);
}
Graphics gOffScenn = offScreenImage.getGraphics();
paint(gOffScenn);
g.drawImage(offScreenImage,0,0,this);
}
窗口关闭事件
在生成窗口时还需要重写窗口的关闭事件,将程序停止写入关闭事件,不然关闭窗口后程序是仍然在运行的需要手动的终止程序才会停止。
//写在launchFrame中
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});