本篇文章目标


  • 画出坦克的实心圆
  • 让坦克圆动起来

一、画出代表坦克的实心圆

咱们须要画出一个圆,那么能够应用fillOval办法

fillOval(int x,int y ,int width ,int  height)

参数的X 和 Y是矩形框的左上角的坐标,width和height是宽和高。

而咱们重写paint办法进行画出坦克的圆

@Overridepublic void paint(Graphics g) {    //获取默认的色彩Color    Color c = g.getColor();    //将坦克色彩为红色    g.setColor(Color.red);    //画一个圆    g.fillOval(50,50,30,30);    //将原色彩填充回    g.setColor(c);}

当然也能够在lauchFrame办法里增加背景填充色,显得更外显眼一些

//增加设置背景色彩this.setBackground(Color.GREEN);

二、让坦克动起来

咱们应用fillOval办法画出了圆的实现,那么怎么让这个圆扭转地位?

//画一个圆g.fillOval(50,50,30,30);

咱们发现x和y的做标都是50,他们是固定的!

若扭转成变量的形式?是不是也是一样能够呢?

int x = 50;//坦克的x坐标int y = 50;//坦克的y坐标@Overridepublic void paint(Graphics g) {    //获取默认的色彩Color    Color c = g.getColor();    //将坦克色彩为红色    g.setColor(Color.red);    //画一个圆    g.fillOval(x,y,30,30);    //将原色彩填充回    g.setColor(c);}

若咱们每次原有的根底上进行改变,是不是就动起来了?

咱们采纳repaint重绘办法,每隔多少毫秒刷新最新的圆点信息坐标

private class PaintThread implements Runnable {    @Override    public void run() {        while (true) {            repaint();//重绘办法            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}
//定义窗口办法public void lauchFrame() {        //省略其余关键性代码.....    //增加设置背景色彩    this.setBackground(Color.GREEN);    //应用线程重绘最新圆点信息坐标    new Thread(new PaintThread()).start();}@Overridepublic void paint(Graphics g) {    //省略其余关键性代码.....        //刷新圆点地位    x += 5;//x坐标    y += 5;//y坐标}

这时咱们在main办法运行起来就发现每个100毫秒就会挪动圆点地位了

为什么应用线程重面,而不是每按下一个键进行一次重画?

  • 线程重画更平均,更能管制重画的速度。
  • 按键重画不能解决子弹主动航行的问题。

参考资料


尚学堂:坦克大战(马士兵老师)