APP下载

基于Java的炸弹人游戏设计

2020-11-02吕佳欢蒋富金易

电脑知识与技术 2020年25期
关键词:窗体炸弹冲击波

吕佳欢 蒋富 金易

摘要:炸弹人是一个2D休闲小游戏,可以一机双人操作,只要使用方向键控制人物移动方向,空格键和Ctrl键放置炸弹,就可以进行游戏。游戏制定了一些主要规则:倒计时结束若仍有玩家生存则玩家胜利,游戏结束;倒计时内玩家全部死亡则玩家失败,游戏结束;玩家与敌人相碰则死亡。同时该游戏还实现了其他扩展功能。

关键词:炸弹人;2D双人小游戏

中图分类号:TP393      文献标识码:A

文章编号:1009-3044(2020)25-0097-02

1需求分析

1)后端与前端的耦合性低。后端代碼包括背景、道具、人物、计分、音乐;前端代码包括菜单和游戏界面。

2)实现炸弹爆炸后链式引爆相邻的炸弹。放置的炸弹在一定时间后爆炸会产生冲击波,从而消灭在该范围内的人或可炸毁物。若冲击波范围内有其余炸弹,不管它们是否到达爆炸时间,都会爆炸。

3)多个参数可配置。玩家可以在菜单界面自行调整多种参数。比如:玩家人数、敌人个数等。

4)控制音乐开关。在菜单界面可通过单击按钮来控制音乐的开关。

5)可随机产生地图。既可在菜单界面选择要产生的地图,也可点击随机按钮产生随机地图。

6)可选择不同的角色。游戏开始前,必须为玩家选择游戏时的角色。

7)完善道具使用功能,增加道具种类。

2 系统设计

2.1 总体分析

建立GUI界面。GUI界面分为开始界面和游戏界面,从开始界面可打开游戏界面。开始界面的不同按钮可以进行参数的选择。将这些参数传递给游戏界面,则可控制游戏界面出现的玩家人数及角色等。

开始界面添加一个JPanel类的卡片式布局的面板,在这个面板中再添加多个面板(MyPanel),MyPanel面板继承自JPanel类并重写了paint(g)方法,可实现背景的绘制。

开始界面添加鼠标监听,为不同的MyPanel面板添加相应的按钮,通过按钮实现不同面板的切换以及参数的配置。

游戏界面添加一个面板(MapPanel),将之前选择的参数传递进这个面板中,之后在这个面板里重写paint(g)方法,通过调用其他类里编写的draw(g)方法,即可将各种物体显示在面板上。

游戏界面添加键盘监听来控制人物的移动以及放置炸弹。

游戏中的属性包括:地图块,玩家,敌人,炸弹,道具。同时有一个计分+计时功能。

2.2 问题及解决方法

该游戏的设计过程中,主要解决以下问题,这些问题根本上都是控制图片的显示与移动。

1) 地图的实现:因为要涉及某些地图块的炸毁,所以画地图时不能直接画一整块,而是要一块一块地画。在地图二维数组中存储地图块数据,不同数字代表不同地图块。一个Field对象代表一个地图块,由它的构造函数里的参数,可以选择不同的地图以及该地图块所处位置。地图参数不同,所对应的地图数组也就不同。由传递进Field构造函数里的位置参数选择地图二维数组的某个数据,以此来决定要画的地图块种类。同时为该地图块设置属性:是否可以移动、是否可以炸毁、是否可以添加道具。在后续编写代码过程中就可以依据这些属性来移动人物、炸毁某些障碍物、炸毁障碍物后添加道具。

2) 障碍物的判断:判断相应位置的地图块的移动属性即可。

3) 玩家的上下移动:为窗体添加键盘监听,判断按键以及地图块是否可行来决定是否改变玩家的位置。

4) 空格放炸弹:利用ArrayList<>()存储Bomb。放炸弹不能只判断按键,还要判断地图上的情况。如果玩家在的地方已经放了炸弹且未爆炸,则不能再放。如果放过炸弹但已经爆炸了的地方,则可以放炸弹。这里需要用到碰撞检测,而且也要给Bomb添加一个属性来表示炸弹是否爆炸。

5) 敌人的自由移动:设置一个整型变量,它的4个不同数字代表不同的运动方向。用一个随机函数来改变这个变量的数字,通过控制Enemy对象的位置来实现敌人的自由移动。

6) 爆炸效果+爆炸后更新地图:在Bomb的draw(g)中,用time变量控制显示炸弹还是显示爆炸后的冲击波。显示冲击波时,要判断炸弹周围的地图块是否可炸,若是道路,则直接画冲击波;若是可炸的障碍物,则要利用数组列表的set方法将该障碍物替换成道路,并画冲击波。

7) 炸弹冲击波与玩家、敌人、障碍物的碰撞检测:利用Rectangle对象的intersects(Rectangle)方法。

8) 炸弹爆炸后链式引燃相邻的炸弹:利用碰撞检测,若炸弹的冲击波与未爆炸的炸弹碰撞,则改变此炸弹的time,使其立马爆炸。

9) 控制游戏结束:利用JOptionPane.showMessageDialog(null, String, String,JOptionPane.INFORMATION_MESSAGE)。若倒计时结束,或者玩家全部死亡则结束。其中玩家死亡可以通过玩家的live属性。游戏过程中,若玩家死亡则令其live为0。当所有玩家的live全为0时游戏结束。

2.3 流程图

2.4 函数调用关系

2.5 函数功能说明

后端:

前端GUI:使用JDK中的AWT和Swing库绘制GUI

3 结论与心得

3.1 调试

1) 背景的大小与窗体不适应。

解决方法:画背景图片时,g.drawImage( )方法中的图片大小不用确切的数字,而是用窗体的获取宽度和高度的方法。

2) 绘制地图块时,出现越界的错误。

解决方法:绘制地图块时,我是利用二维数组里的行数和列数来画的,因为这样可以与二维数组里的数字相对应,从而画出对应的地图块类型。地图块的位置就是二维数组里的行数和列数分别乘宽度与高度后得到的数。而我将行数乘宽度当作了横坐标,将列数乘高度当作了纵坐标,所以出错。橫坐标应为列数乘宽度,纵坐标为行数乘高度。

3) 若地图上有炸弹,在其他地方放另一个炸弹时原先的炸弹就立马消失了。

解决方法:每次添加炸弹时都用ArrayList的add()方法将其放入 ArrayList<>()对象中,解决炸弹的 独立问题。

4) 炸弹爆炸时,冲击波会穿透不可炸物。

解决方法:在Bomb的draw方法中增加if条件语句,使得当放置炸弹的周围的地图块为可炸物时才会绘制冲击波。

5) 炸弹可炸物后,可炸物不会消失。

解决方法:仅改变地图数组里的数字不能直接将地图块置换,需将所有的Field对象全部放入List中,当可炸物被炸弹炸到后,利用List里的set方法将可炸物地图块换成玩家可以行走的地图块。

3.2心得

游戏的开发需要做到以下几点:窗体显示、图片绘制、图片移动、窗体监听、相交判定等。游戏的本质,实际上可以理解为图像的显示和图像的移动。明白这个实质后,写游戏的关键问题就变成了怎么显示图片和怎么控制图片移动。

显示图片需要用到 javax.swing 包下的 JPanel类与JFrame类。JPanel 提供了一个面板(画板),显示图片就相当于在面板上把图片画出来。JFrame 提供了一个窗体(窗口),面板被放到窗体中,最终展示在屏幕上。JPanel 上显示图片,是通过重写JPanel中的绘制方法 void paint(Graphics g)。其参数Graphics相当于为我们提供了“一支画笔”,我们可以通过调用它的画图方法drawImage在面板上画任何东西。

控制图片移动实际上就是改变一下drawImage中的图片的坐标。JPanel对象的paint方法,只在窗体显示时调用一次,所以在改变图像坐标的同时,还需要不断地重新绘制面板内容,以达到画面的刷新,图片才能真正地被肉眼所看到移动。JPanel提供了一个刷新的方法repaint( ),即重新绘制。图像的移动分为人为控制与非人为控制,人为控制时需加监听,非人为控制时只需用循环即可。

总之,此系统做的效果较可以,界面美观,功能丰富,易于上手,最初的需求均已实现,有利于其他编程人员学习。

【通联编辑:光文玲】

猜你喜欢

窗体炸弹冲击波
开心炸弹
武汉冲击波
试谈Access 2007数据库在林业档案管理中的应用
医生集团冲击波
超声双探头联合定位法在体外冲击波碎石术中的应用
巧设WPS窗体控件让表格填写更规范
WinCE.net下图形用户界面的开发