A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

JAVAee52豪

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

1.创建子弹类
1.由于每颗子弹都是一个独立的线程,会不断变换子弹坐标,所以子弹类要实现Runnable接口。
2.子弹需要坐标x,y以及方向,所以构造函数有三个参数。
3.实现Runnable接口后,要覆盖run方法:
    1.如果不让线程sleep,子弹飞出去很快,快到在屏幕如上瞬间消失。
    2.所以增加一个sleep()
    3.另外,子弹需要判断四个方向,增加switch语句
    4.子弹跑出屏幕需要死亡,增加变量islive判断是否存活。否则无限制飞行,不断占用内存空间。

2.hero坦克类中加入shotEnemy()方法,表示发射子弹
1.新建子弹变量s
    Shot s = null;
2.判断开火的方向,增加switch语句。
3.开火后,启动线程。
Thread t =new Thread(s);
    t.start();

3.完成子弹实现过程,接着要在屏幕中让子弹显示,即画出子弹
1.paintComponent方法里加入,画出子弹
    判断子弹是否存活
    hero.s!=null很重要,游戏刚开始没有发射子弹,hero.s=null,此时进入if去画子弹会出现异常。
    if(hero.s!=null&&hero.s.isLive==true){
        g.setColor(Color.red);
        g.draw3DRect(hero.s.x, hero.s.y, 1, 1, false);
    }
2.在KeyPressed监听器处添加,按下J键发射一颗子弹
    if(e.getKeyCode()==KeyEvent.VK_J){
        hero.shotEnemy();
    }

4.MyPanel实现Runnable接口
1.由于子弹打出去后,需要不断让它显示,屏幕每隔一段时间需要repaint()
    所以重载run()方法,让MyPanel每隔一段时间repaint()一次
    public void run() {
    while(true){
        try {
            Thread.sleep(100);//休息100ms,重画一次MyPanel
        } catch (Exception e) {
            e.printStackTrace();
        }
        repaint();
    }

5.由于MyPanel实现了Runnable接口,所以让该线程跑起来
1.在MyTankGame方法中启动线程即可
    p1 = new MyPanel();
        Thread t = new Thread(p1);
        t.start();
您需要登录后才可以回帖 登录 | 加入黑马