java飞机大战背景图片_Java简单飞机大战(1)

本文介绍了使用Java开发飞机大战小游戏的过程,包括游戏框架设计、界面制作、键盘监听、多线程实现飞机与子弹的移动、背景图片滚动、碰撞检测以及双缓冲技术消除闪烁。在游戏开发中,作者通过数组队列管理飞机和子弹对象,实现游戏暂停与继续功能,并计划添加排行榜和计分系统,以提升游戏趣味性。
摘要由CSDN通过智能技术生成

在完成了多线程小球之后,就可以写一个飞机大战小游戏了,虽然比较简单,但玩起来还是有一点乐趣的。下面就讲一下我的大概思路和一些实现步骤。

一开始当然要想好一个框架,毕竟框架还是很重要的。当点击开始按钮的时候,游戏开始。在这个游戏里有登陆界面,子弹,我方飞机,敌机,还有背景图片。我想着先应该将子弹,我方飞机,敌军飞机分别写三个类,因为子弹和敌军飞机会不断出现,所以使用数组队列来存储他们的对象。开始游戏后在主线程中绘制飞机,敌机和子弹,背景,当飞机被敌机碰撞到时结束游戏。

一开始当然是完成界面了,根据不同的需求,可以写出不同的登陆界面。然后就是加上监听事件。因为我选择键盘控制飞机,所以这里要加的监听机制有按钮监听和键盘监听。使用键盘监听时候有一个很重要的问题。键盘监听是通过面板上的焦点来确认监听范围,如果在面板上添加了按钮,这个焦点就会默认在按钮上,这时候按键盘除了空格键是不会有反应的,在点击完开始按钮之后需要使用JFrame类中的requestFocus()方法。

点击开始按钮之后,进入绘制战斗画面的主线程,同时也进入创建敌机对象和创建子弹对象的线程。这里要控制只有第一次点击按钮的时候进入线程,之后点击按钮不会再开启新的线程,具体的方法我写在了多线程小球文章里。在主线程里需要绘制的有飞机,敌机,子弹和背景图片。这里所有的图片在网上找好就行,可以的话背景色最好是透明的。在这里画飞机敌机和子弹时就可以调用已经写好的方法。绘制背景图片的时候有个问题。如何让背景图片一直移动呢?因为如果只画一次图片,将图片移动之后背景就会改变,这里我一次画出两张图片,然后让他们移动,当第二张图片移动到尽头后再接上第一张图片继续绘制。

image=new ImageIcon(this.getClass().getResource("背景4.jpg"));

buf.drawImage(image.getImage(), x, y,null);

buf.drawImage(image.getImage(), x, y-image.getIconHeight(),null);

y++;

if(y-image.getIconHeight()==0){

y=0;

}

这样整个战斗画面就绘制完成了,设置好键盘监听,现在按下WASD就可以移动飞机了。但是这里还是会出现问题,移动飞机和敌军飞机出现的时候会不断的闪烁。这是因为我们在不断绘制的原因。这个时候就需要使用双缓冲技术了。双缓冲就是生成一个缓冲图层,在缓冲层中完成所有的绘制工作之后就将图像显示在屏幕图层上。具体代码如下:

//创建缓冲区BufferedImage buffer= new BufferedImage(jf.getWidth(), jf.getHeight(),BufferedImage.TYPE_INT_RGB);

//创建缓冲区画笔对象Graphics buf=buffer.getGraphics();

当使用缓冲区画笔画完所有东西后将缓冲区的画笔传入屏幕画笔即可

//在屏幕上画出缓冲区处理好的图像g.drawImage(buffer, 0, 0,null);

在缓冲区中要先画背景图片再把飞机子弹画出来,不然显示不出来。在每一次绘制敌机对象或者子弹对象时,要设置如果超过窗体范围就把超出的对象从队列中删除,不然一直增加比较占用资源。当判定子弹击中敌机的时候也要将两个对象同时删除掉,这里我是在每次绘制子弹对象的时候都与所有敌机对象进行一次判断,如果撞击到了就同时在数组队列中删除掉。如果想做穿透型的子弹的话只用删除敌机对象即可。把这些工作完成之后,就可以进行简单的游戏了,不过这个时候敌机和子弹对象会快速的出现,这时候在创建敌机和子弹对象的线程中加入延时就好了,具体的数值可以自行调整。因为涉及不少参数传值,所以可以把传承和调用的图先画好,不然写起来可能一下被绕进去了。

当然,光进行 游戏还不行,最好是添加上暂停和继续的按钮,因为在线程中,所以点击暂停不可能直接停止线程,这样又要重新开启新线程了。这里我使用了和多线程小球中一样的方法,加入了标志位,当标志位为true就一直执行continue,这样就能在线程不断执行的情况下同时暂停画面了。点击继续按钮将标志位换为false即可。在对线程传参的时候,最好加上volatile关键字,保证变量每次被读到都是最新的数据,不过如果加入了延时就可以不用加这个关键字了。

这样,一个简单的飞机大战游戏就完成了,当然,光打飞机没什么乐趣,我打算在这个游戏里加入排行榜和计分器,记录下前三名的分数。这些内容会在下一篇文章中写到。

这个游戏的完成让我加深了对线程的理解和面向对象的理解,感觉每次写东西,找bug,改bug都是一次学习,但是改BUG的过程十分痛苦。。。现在还是有很多的问题,希望以后写程序的过程中能少一些经常犯的错误,慢慢进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值