★最近闲的无聊,刚好看了下java的GUI,然后就做了个坦克大战练练手。
★以下是效果图
★用到的知识也就j算ava的基础,包括java的语法,面向对象的思路,GUI,多线程,一点文件操作知识等。
★编程思路
1.这里的进入界面和游戏界面分为两个面板,通过界面的切换实现选择和游戏功能。
2.定义一个坦克类,子类分别为我方坦克和敌方坦克,同时还有一个子弹类,成员主要包括,x,y,speed。方法见代码。
3.首先,坦克的移动是通过x,y的改变来实现的,同样,子弹的实现也是如此。
其次,如何把实际的动作显示到界面上是通过repaint()函数结合面板的多线程来实现的,我设置的是面板线程45毫秒repaint一次面板内容。我方坦克通过按键实现移动和攻击,敌方坦克通过线程控制,使用随机数来确定方向和射击的时间间隔。子弹也相当于一个线程,把子弹放到集合里去方便以后检测是否击中坦克或者是否击中障碍物。
最后,就是碰撞问题,intersects()可以检测两个矩形是否碰撞,当然,你就要返回一个矩形让函数去判断。坦克与坦克的碰撞,坦克与子弹的碰撞都可以这样实现,至于边界问题,可以通过面板x,y的最大值来限制。
4.解决线程并发导致的集合越界问题,解决图片闪烁问题。
综上,大概就这几个方面。
★主要的目录如下()
★代码实现主要是 TankPanel较为复杂,所以只放了TankPanel.java的代码,如下
(包括界面的实现,图形的重绘,线程的操作,坦克的碰撞等)
class TankPanel extends JPanel implements KeyListener,Runnable,MouseListener
{
Tank_08 tank_08;
MyTank mytank=null;
EnemyTank enemy=null;
Impact impact=null;
Impact boss=null;
Protectwall protectwall=null;
Vector<Impact> impacts=new Vector(); //阻碍物集合
Vector<Impact> impacts1=new Vector(); //阻碍物集合 (子弹测试集合)
Vector<Protectwall> prowall=new Vector(); //保护墙集合
Vector<EnemyTank> enemytank=new Vector(); //