首页 > 编程语言 >跟着王洋老师学编程 - 1.4 飞行的小球

跟着王洋老师学编程 - 1.4 飞行的小球

时间:2023-12-13 12:11:20浏览次数:34  
标签:1.4 10 MyPanelB java 王洋 小球 mpb public

一、我的思路

  1. 画一个窗体,并设定大小
  2. 准备一个画布,并将画布添加至窗体
  3. 在画布上用paint方法实现小球的运动 —— 用一个for循环,小球x轴不变,先画一个球,然后改变画笔颜色与背景色相同,在原位置上再画一个小球;改变小球Y轴坐标,改变画笔颜色,在新的位置重新画小球,循环直到Y轴坐标达到窗体最大值结束。

代码版本1 - 直线下落:

 1 import java.awt.Frame;
 2 import java.awt.Panel;
 3 import java.awt.Graphics;
 4 import java.awt.Color;
 5 public class DroppingBall{
 6     public static void main(String[] args){
 7         Frame w = new Frame();
 8         w.setSize(1366,768);
 9         
10         MyPanelB mpb = new MyPanelB();
11         w.add(mpb);
12         w.show();
13     }
14 }
15 
16 class MyPanelB extends Panel{
17     public void paint(Graphics g){
18         int x=30,y=30;
19         g.drawOval(x,y,10,10);
20         for(;y<768;y++){
21             g.setColor(Color.white);
22             g.drawOval(x,y,10,10);
23             y++;
24             g.setColor(Color.black);
25             g.drawOval(x,y,10,10);
26         }
27     }
28 }

编译及执行结果如下:

现象1 - 没有实现下落的动态效果,只显示一条直线。

思考1 - 是不是坐标变化的粒度太小,改为斜线呢。。?

代码版本2 - 斜线下落:

 1 import java.awt.Frame;
 2 import java.awt.Panel;
 3 import java.awt.Graphics;
 4 import java.awt.Color;
 5 public class DroppingBall{
 6     public static void main(String[] args){
 7         Frame w = new Frame();
 8         w.setSize(1366,768);
 9         
10         MyPanelB mpb = new MyPanelB();
11         w.add(mpb);
12         w.show();
13     }
14 }
15 
16 class MyPanelB extends Panel{
17     public void paint(Graphics g){
18         int x=5,y=5;
19         g.fillOval(x,y,10,10);
20         for(;x<1366;){
21             for(;y<768;y++){
22                 g.setColor(Color.white);
23                 g.fillOval(x,y,10,10);
24                 x++;
25                 y++;
26                 g.setColor(Color.black);
27                 g.fillOval(x,y,10,10);
28             }
29         }
30     }
31 }

编译及运行结果如下:

现象2 - 没有实现动态下落效果,只显示一条斜线。

思考2 - 小球没有按预想的在A位置出现、抹掉,在A+1位置重现、再抹掉……如果不用循环呢?

代码版本3 - 去掉循环。。:

 1 import java.awt.Frame;
 2 import java.awt.Panel;
 3 import java.awt.Graphics;
 4 import java.awt.Color;
 5 public class DroppingBall{
 6     public static void main(String[] args){
 7         Frame w = new Frame();
 8         w.setSize(1366,768);
 9         
10         MyPanelB mpb = new MyPanelB();
11         w.add(mpb);
12         w.show();
13     }
14 }
15 
16 class MyPanelB extends Panel{
17     public void paint(Graphics g){
18         int x=5,y=5;
19         g.fillOval(x,y,10,10);
20         g.setColor(Color.white);
21         g.fillOval(x,y,10,10);
22         x=30;
23         y=30;
24         g.setColor(Color.black);
25         g.fillOval(x,y,10,10);
26 
27         g.setColor(Color.white);
28         g.fillOval(x,y,10,10);
29         x=100;
30         y=100;
31         g.setColor(Color.black);
32         g.fillOval(x,y,10,10);
33     }
34 }

编译及运行结果如下: 

去掉循环之后,看不到线的轨迹了,说明旧位置的小球确实被“擦除”了,但看不到小球下落的效果;而加上循环,显示的却是小球的轨迹,看起来小球的旧位置并没有被“擦除”——

结论 - 不管循环是否存在,都没有实现小球动态下落的结果。。看起来如果能在原位置的小球“擦除”之后加入延时。。

二、老师的讲解

1、引入了线程,并线程与进程的区别

进程 - 一个独立运行的程序,比如一个正在运行的记事本、一个正在运行的浏览器;启动两次记事本,得到的也是两个线程。

线程 - 一个进程当中的单一顺序的控制流

https://m.runoob.com/java/java-multithreading.html

2、用线程实现小球下落效果的思路

代码版本1 - 线程固定用法

 1 import java.awt.*;
 2 public class DroppingBall{
 3     public static void main(String args[]){
 4         Frame w = new Frame();
 5         w.setSize(1366,768);
 6         
 7         MyPanelB mpb = new MyPanelB();
 8         w.add(mpb);
 9 
10         // 使用线程对象
11         Thread t = new Thread(mpb);
12         t.start();
13 
14         // w.show();
15         w.setVisible(true);
16     }
17 }
18 
19 class MyPanelB extends Panel implements Runnable{
20     int x=5,y=5;
21     public void paint(Graphics g){
22         g.fillOval(x,y,10,10);
23     }
24     public void run(){
25         while(true){
26             y++;
27             if(y>768){
28                 y=5;
29             }
30             try{
31                 Thread.sleep(1000);
32             }catch(Exception e){
33                 System.out.println(e);
34                 System.out.println(y);
35                 repaint();
36             }
37         }
38     }
39 }

编译并运行后,结果如下:

 小球一直在初始位置不动。。各种打印后,发现try里面的代码执行了,但repaint()方法一直未执行,各种搜索博客也没解决。最后,去了一趟厕所,沉思……try...catch... catch是异常处理,发生异常,才抛出或处理异常,没有异常……啊!

结论:repaint()写错位置。。。。

解决方案

 1 import java.awt.*;
 2 public class DroppingBall{
 3     public static void main(String args[]){
 4         Frame w = new Frame();
 5         w.setSize(1366,768);
 6         
 7         MyPanelB mpb = new MyPanelB();
 8         w.add(mpb);
 9 
10         // 使用线程对象
11         Thread t = new Thread(mpb);
12         t.start();
13 
14         w.show();
15     }
16 }
17 // 通过实现Runnable接口使用线程
18 class MyPanelB extends Panel implements Runnable{
19     int x=5,y=5;
20     public void paint(Graphics g){
21         g.fillOval(x,y,10,10);
22     }
23     public void run(){
24         while(true){
25             y++;
26             if(y>768){
27                 y=5;
28             }
29             try{
30                 Thread.sleep(1000);
31             }catch(Exception e){
32                 System.out.println(e);
33             }
34             repaint();
35         }
36     }
37 }

编译及运行结果如下:

看到小球每秒下移一次~~~~~O(∩_∩)O~~~~~

最后,加快下移速度,并把过时的 show()方法,改为 setVisible(true)方法

 1 import java.awt.*;
 2 public class DroppingBall{
 3     public static void main(String args[]){
 4         Frame w = new Frame();
 5         w.setSize(1366,768);
 6         
 7         MyPanelB mpb = new MyPanelB();
 8         w.add(mpb);
 9 
10         // 使用线程对象
11         Thread t = new Thread(mpb);
12         t.start();
13 
14         // w.show();
15         w.setVisible(true);
16     }
17 }
18 // 通过实现Runnable接口使用线程
19 class MyPanelB extends Panel implements Runnable{
20     int x=5,y=5;
21     public void paint(Graphics g){
22         g.fillOval(x,y,10,10);
23     }
24     public void run(){
25         while(true){
26             y++;
27             if(y>768){
28                 y=5;
29             }
30             try{
31                 Thread.sleep(100);
32             }catch(Exception e){
33                 System.out.println(e);
34             }
35             repaint();
36         }
37     }
38 }

小球实现了匀速下移!~

 

标签:1.4,10,MyPanelB,java,王洋,小球,mpb,public
From: https://www.cnblogs.com/shannonredeemed/p/17888866.html

相关文章

  • 跟着王洋老师学编程 - 1.3 满天星星
    编写程序,以窗体形式实现“满天星星”代码一1importjava.awt.Frame;2importjava.awt.Color;3importjava.awt.Panel;4importjava.awt.Graphics;5publicclassStarSky{6publicstaticvoidmain(String[]args){7Framew=newFrame();8......
  • Unreal入门,通过蓝图控制小球
    1.新建Pawn,添加StaticMesh并设置StaticMesh为小球,启用物理模拟(新手内容应该是有小球的)2.新建GameMode,WorldSetting中设置为默认GameMode,一并设置默认Pawn为刚创建的Pawn3.添加轴映射事件,并绑定WASD按键4.在Pawn的事件图标中添加事件处理,注意先添加float类型变量M......
  • 模拟集成电路设计系列博客——4.1.4 二阶Gm-C滤波器
    4.1.4二阶Gm-C滤波器下图展示了一个全差分二阶\(G_m-C\)滤波器,其传输函数可以表达为:\[H(s)=\frac{V_{out}(s)}{V_{in}(s)}=\frac{s^2C_X/(C_X+C_B)+sG_{m5}/(C_X+C_B)+G_{m2}G_{m4}/[C_A(C_X+C_B)]}{s^2+sG_{m3}/(C_X+C_B)+G_{m1}G_{m2}/[C_A(C_X+C_B)]}\tag{4.1.23}\]二阶......
  • 文心一言 VS 讯飞星火 VS chatgpt (139)-- 算法导论11.4 3题
    三、用go语言,考虑一个采用均匀散列的开放寻址散列表。当装载因子为3/4和7/8时,试分别给出一次不成功查找和一次成功查找的探查期望数上界。文心一言:在开放寻址法中,当散列表的装载因子超过其阈值时,会触发重新哈希。在均匀散列的情况下,我们可以使用二次探查来处理冲突。为了计......
  • 文心一言 VS 讯飞星火 VS chatgpt (138)-- 算法导论11.4 2题
    二、用go语言,试写出HASH-DELETE的伪代码;修改HASH-INSERT,使之能处理特殊值DELETED。文心一言:首先,让我们定义一个基本的哈希表数据结构。这个结构将包括一个存储键值对的哈希表和一个存储已删除键值对的队列。我们可以用空值和大括号{}来表示“DELETED”。下面是哈希表的基本定......
  • 文心一言 VS 讯飞星火 VS chatgpt (138)-- 算法导论11.4 2题
    二、用go语言,试写出HASH-DELETE的伪代码;修改HASH-INSERT,使之能处理特殊值DELETED。文心一言:首先,让我们定义一个基本的哈希表数据结构。这个结构将包括一个存储键值对的哈希表和一个存储已删除键值对的队列。我们可以用空值和大括号{}来表示“DELETED”。下面是哈希表的基本......
  • openresty 1.21.4.3 发布
    实际上openresty比较早就发布openresty1.21.4.3版本了,只是周边的构建包,就在昨天才发布的,核心是解决了nginx关于http2处理的问题对于使用nginx以及openresty的同学比较推荐进行升级参考资料https://openresty.org/en/changelog-1021004.htmlhttps://github.com/openresty/......
  • 2023.11.4测试
    \[\text{NOIP模拟赛-2023.11.4}\]T1难题设\(f(i)\)表示最小的非\(i\)因数的正整数,求\(\sum\limits_{i=1}^nf(i)\)\(T\leq10^4\),\(1\leqn\leq10^{16}\)考虑计算数\(x\)对\(f(1\simn)\)的贡献通过分析可以发现,\(1\simx\)能筛掉的数的个数为\(n-\dfrac{n}{\ope......
  • 11.4 显哗
    你在看这篇鲜花的时候,你是安全的吗?早上胃疼请假一上午,成功打断了连续不知道多少天的早八模拟赛。很快我就能享受到单休了下午之前三班的同学以及跟他一起学化竞的双胞胎弟弟和另一个同学来找我,说数学建模竞赛缺一个人。(他俩在役情况未知)“肯定需要一个会编程的,然后你还学地......
  • 2023.11.4——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.软考知识明日计划:学习......