做屏保

    xiaoxiao2021-03-25  242

    这次做的是一个小球移动的屏保,总共做了两个版本。这两个版本也是有一个递进的关系,第一个版本是在一个窗体上画出一个小球,让它移动,碰到边界就让它返回并让它改变颜色。这个小游戏用到的主要是线程,实现线程共有两种方法:1、继承Thread,new Thread(){public void run(){}}.start();这时一般将while(ture){}包在匿名内部类的外面,在类的上面一定要哦休眠。如:while (true) { // 休眠一定是在内部类外面写 try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 匿名内部类 new Thread() { public void run() { // 没有阻塞一定要sleep()一下 x += 5; y += 5; repaint(); }; }.start();

    }

    2、实现Runnerble接口,这时只要实现run()方法即可。只这样写线程开启不了,所以Runnerble一定要结合Thread().start();才能开启线程。如何将run()与Thread结合在一起成了一个值得注意的问题,就是要将一个Runnerble对象丢进Thread(),这样,这两者就结合起来了。如:

    public void run() { while (true) { try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } x += speedX; y += speedY; // 碰撞判断 if (x < 0 || x > frame.getWidth() - r) { speedX = -speedX; // 调用改变颜色的函数 changeColor(); } if (y < 0 || y > frame.getWidth() - r) { speedY = -speedY; changeColor(); } } }

         //下面这句是放在构造函数中来开启线程

          new Thread(this).start();

        这个游戏除了线程用的比较多以外,还有就是随机值的产生,随机值的产生有两种方法:1、int r1=new Random().nextInt(256);这个产生的随机值是[0,256).2、int r2=int(Math.Random()*256).注意一定不能写成int r1=new Random().nextInt(1)*256,这个得到的值永远是0,之前写的时候就写成这样,所以小球的颜色就一直是黑色。之前还是没有清楚这个函数的真正含义,不过这个通过查API就可以明白了。其实这个游戏不是很难,只是要把里面的关系弄明白了,要把窗体作为小球的一个数据成员,然后在构造函数中将它进行初始化,这样就能将窗体和小球联系起来了。

        做这个感觉最大的收获是当程序运行不是你期望的时候,可以从头看起,一步一步的点进去,只有搞清楚每一步是怎么做的,为什么要这么做,也许这样就能找到问题所在了。目前感觉自己对线程还不是很熟悉,希望通过接下来的项目能对它有一个更深入的了解。

      

    转载请注明原文地址: https://ju.6miu.com/read-1184.html

    最新回复(0)