上一篇飞机大战文章差不多介绍了简单的飞机大战的实现,剩下要做的就是添加一个分数排行榜和计分器。计分器十分简单,画一个字符串Score,然后显示当前获得的分数即可。既然是排行榜,当然是要记录前几名的分数,具体使用什么方式存储呢?如果使用数组或者数组队列,在每一次关闭了程序之后,记录的数据就会消失,再次打开之后排行榜上的分数就全部变成0了。所以这里我使用了文件读写来存储分数数据。每一次需要存储的分数都会被写在文本中,当再次打开程序的时候只要读取文件里的数据就会得到数据。
public void fileInput(File file) throws IOException{
FileInputStream fis=new FileInputStream(filename);
DataInputStream dis=new DataInputStream(fis);
for(int i=0;i<3;i++){
count[i]=dis.readInt();
}
fis.close();
}
public void fileOutput(File file,int[] score) throws IOException{
FileOutputStream fos=new FileOutputStream(filename);
DataOutputStream dps=new DataOutputStream(fos);
for(int i=0;i<3;i++){
dps.writeInt(score[i]);
}
fos.flush();
fos.close();
}
这里我创建的是一个现实前三名的排行榜,但是创建数组时使用的容量是4。因为重新打开游戏进行游戏再打开排行榜时,需要重新读写本地存储的排行榜数据再添加新的数据进入比较,所以需要容量为4的数组。在读入当次游戏的数据后将数组进行排序,然后在把前三的数据写入文件中。排行榜上显示的也是数组的前三个数。这样,一个排行榜也写好了。不过游戏还是有一点问题。在进行游戏时,如果点击暂停按钮,最小化窗口然后再打开窗口,这时界面会变成初始界面。因为在暂停的时后在主线程的执行中并没有执行绘制图形,所以JFrame界面刷新后变为初始界面。为了改变这种情况,我决定重写JFrame的paint方法。在paint方法中加入标志位,当暂停时最小化窗口了再打开窗口时先让线程执行绘制的方法,然后再进入暂停按钮对应的标志位的语句。
if(biaozhi[0]==1){
//绘制暂停时的界面}
if(flag){
continue;
}
这样就解决了遇到的问题。暂停后无论怎么移动界面也不会出现问题了。
现在的飞机大战能实现的功能都比较简单,还可以再加入一些元素,比如随着时间增加难度增大,加入BGM,给飞机添加一个最终技能之类的。如果还有什么想要实现的再自己添加就好了。差不多就这些了,很久没有更新,最近要多写点文章了- -。