java坦克大战心得

创建窗口

 创建一个窗体类,继承Frame,(也可以不继承使用JFrame),然后在该类的构造函数中,使用Frame中的方法,设置窗体的标题,大小,位置,可显,不可改变窗体大小(注意:可以使用Toolkit方法获取屏幕的高宽;

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a6d5a2Q5ZCR5YmN5Yay,size_20,color_FFFFFF,t_70,g_se,x_16

也可以直接写窗口的大小;setVisible()方法,显示窗体,最好写在最后面的位置)

然后创建一个类,做主线程,在main方法里将该窗体类实例化,然后就实现了一个游戏窗体。

添加游戏必要元素

先在窗体类中写paint方法,这个paint方法会自动调用,在paint方法里,可以把人物,背景,各个界面的文字画出来,(可以选择不同的字体,颜色,进行美化)关于图片的添加,在该项目里新建一个包用于存图片,图片的使用,我使用的是一个工具类,我所知道的有一个方法把图片对象化的,然后找到图片的路径,对图片进行调用。(图片的实际大小和显示大小不一定一样,实际大小是你在程序中定义的,显示大小是图片本身的大小)(这个之前搞得不是太明白导致两个游戏元素重叠)

控制我方坦克

创建人物类,定义初始位置,和方向,速度,写一个构造器,这样就可以实例化的时候赋初始值了,写一个画笔的成员方法,在从窗体类中的重写paint方法里传过来画笔,这样这个成员方法也相当于重写paint方法了,再写移动方法,通过判断方法来控制移动,然后在paint方法中调用,然后就是获取方向了,可以在窗体类中添加按键监听,通过监听获取四个布尔值,四个布尔值对应着四个方向,在写一个成员方法将四个布尔值转变为方向,在人物类中写一个含参数的方法,用来获取方向进行参数的加减,启动线程,不断重画,进行移动。

闪烁问题

运用双缓存

将所有的东西画在一副虚拟的图片上(和容器一样的大小),然后整个绘制到容器的画布中,一次性的显示出来;

每一次调用repaint()方法(具有刷新页面效果的方法),先调用update()方法(清除当前显示并再调用paint()方法)。

子弹的发射,碰撞,消失

添加x,y等属性;添加构造方法、draw等必要方法;(实时绘制,执行完draw()语句之后立即进行渲染)根据不同的方向,进行不同的运动;按空格发射子弹,那么源头就是监听空格,构造方法来获取此时人物的位置信息的,这样我们获取了子弹的初始坐标和方向,创建一个子弹类,定义的信息和人物类差不多,创建一个子弹容器,在这里写一个方法获取子弹的初始的位置和方向,这样就可以实现按一次空格,就会往子弹容器里添加一个子弹,发射一次子弹后进行发射冷却,可以自己调节时间。关于内存溢出,在子弹类中写一个方法,通过判断子弹的位置,如果子弹的位置超出边界就消去这个子弹(容器中的子弹用getset方法来获取),然后将该方法在paint方法中调用,不断的刷新界面实现子弹的移动。然后判断子弹和界面内物体的碰撞,只要监控它们的坐标,判断是否相同,如果相同就同时消去。

敌方坦克的产生,移动

和控制我方坦克差不多,创建一个新的类,怪物的位置,可以通过创建一个随机类对象random,来获取随机横坐标来随机生成,

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a6d5a2Q5ZCR5YmN5Yay,size_20,color_FFFFFF,t_70,g_se,x_16怪物的数量多少和子弹相似,用容器的存储,这时候就要明确怪物的数量了,创建一个变量,加入if()判断当变量大于多少时,使坦克不在生成。坦克的移动可以通过获取四个随机数来随机生成的,方向转变的时间间隔相同。

 

死亡,胜利,失败,暂停界面

死亡就是判断两个坦克和子弹是否碰撞,把两个物体当作矩形,调用intersects()方法判断两个矩形是否相交。如果坦克和子弹相交及坦克死亡子弹消除;子弹和墙壁相交,两者同时消除。消除物体的方法,就是把用到它的方法从遍历paint的列表中去掉。

胜利就是判断我方坦克是否消灭敌方所有坦克且基地保存完好。然后在paint中重新绘制游戏胜利的界面。

失败和胜利大致相同,即我方坦克全部死亡或基地死亡时,重新绘制游戏失败界面。

暂停模式,就是重新定义一个变量,按下暂停键时,给变量重新赋值。当变量的值为某个值时,重新绘制游戏界面,即跳转到暂停界面。并且使坦克不在生成和移动 。再次,按压下暂停键时,改为原来的值使界面转回原来界面,程序正常运行。

 

优化添加特效

写完上面的游戏就能运行了,不过还是要加一些爆炸特效和背景音乐

     爆炸特效就是,在坦克与子弹相碰的位置连续切换绘制爆炸图片来实现。用Toolkit.getImang()方法来获取图片用for()循环进行图片转换

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a6d5a2Q5ZCR5YmN5Yay,size_20,color_FFFFFF,t_70,g_se,x_16

   添加背景音乐,创建一个新的类,用File添加音乐的绝对路径。然后在线程中用AudioSystem和AudiolnputStram处理音频文件,然后将要播放的音乐,调用到绘制画面后需要有声音的地方。

我的大致思路就是这样,不过背景音乐的添加搞得还不是太明白。

 

 

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宝子向前冲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值