2024-06-01 03:53:35
首先声明一点,我学java可能比你早不了多少(十一假期之后开始), 所以有些地方分析的可能有错误。不过总体应该是正确的。
首先从mian方法入手,这是程序的入口。 先产生了一个TestHoney对象,TestHoney派生于Frame类,mian里首先用setSize等设置了这个窗口的属性,这里是背景颜色,大小,setVisible是使TestHoney显示出来。 然后 Graphics g = th.getGraphics(); 得到Graphics的实例,由于Graphics是抽象类,不能直接用new Graphics()来产生对象。实际上此处th.getGraphics();获得了Graphics的一个子类的实例。然后产生一个CannonBall的实例。下面进入循环中,循环里先sleep(4),先睡4毫秒,也就是这个循环不能一直连续执行,那样CPU会疯的。而且sleep(4)后执行一次下面代码,实现图像的重绘与信息的检测。每4毫秒重绘一次很快了,其实不需要的。(补充一点,这里动起来的图片是每4毫秒坐标变一下在重新画在屏幕上,由于间隔短,眼睛感觉不出来就感觉图连续运动了)。。 sleep可能抛出异常,try,catch是捕获异常的。cb.paint(g,x1);就是每4毫秒都要做的最主要的事情了。多加一个x1参数是为了向Cannonball传递兰椭圆x坐标值,来使 红点 未发射 时保持与椭圆在一起。
Cannonball类:
static int y=560,score=0;这里的y应该是“子弹”,也就会是图中“红点”的y坐标(以像素为单位)。score是得分,int temp=240,应该是初始化的红点的x坐标值,初始为240. 然后得到
ClassLoader对象,主要用于下面AudioClip对象,也就是加载声音文件时用的。 下面是paint方法,用于绘图和判断。首先定义了int t。根据后来的代码知道t是用来记录图中那些黑点的行数的。 if(y==560) temp=x2; y等于560时说明 红点 还没有发射,由下面代码也可以看到 红点 打到黑点时也使y==560,,说明当 子弹 打到黑点时, 子弹 自动回到初始位置。下面就是作图部分了,在指定位置画图。注意这里有一个y--,并且注意到paint方法是每4毫秒调用一下,也就是每4毫秒y--,这就使 红点 的y坐标减1,这就实现红点向上运动。 下面是一堆判断,就是判断 红点 是否打到了 黑点 ,如果打到了,红点回到初始位置(y=560),如果y==0也就是没达到 黑点 ,打出了屏幕(程序窗口),也要回归初始位置。
TestHoney类
static int a=200,是蓝椭圆初始x的值。二位数组用于 黑点 的绘图,等于1表示那个位置有黑点,否则没有。同样ClassLoader和AudioClip是用于产生声音的。下面是两个add LIstener。第一个,addWindowListener就是对TestHoney加入窗口的监听(因为TestHoney派生于Frame类,可以加入这个) 里面重写了WindowAdapter里的windowClosing方法,其实WindowAdapter这个类就是实现了WindowListener里面的所有的抽象方法,不过都是空实现,也就是写完方法声明,下面加一个{},{}里什么都不写。如果不用WindowAdapter,直接用WindowListener,因为是抽象的,需要实现里面所有的方法才能用,但是很多是对这个程序没用的,比如里面还有windowClosed方法等,对于这个没用,但还是要写,所以直接用WindowAdapter后,直接重写要用的方法即可。 这里重写了windowClosing方法,就是实现了鼠标点击程序右上角的红“X”,实现关闭功能。不添加的话点 “X” 也不会关闭程序的。
下面addKeyLIstener,添加键盘的监听,VK_RIGHT表示键盘上的“→”按键,即按“→”后,x1+=10;(蓝色椭圆向右移动) 其他同理。 注意里面有个repaint(),在public void Keypressed(KeyEvent e)里面,这个方法是在键盘有 按键 按下时自动调用的,每次按下时调用一次repaint(),也就是实现一次重绘。这个方法是TestHoney从父类继承来的,这里好像没写,其实已经继承来了,就是实现重绘,刷新图像。
之后是paint()方法,就是把黑点按要求画上去,没什么好说的。
总结起来,就是开始初始为如图情况, 按“→”或“←”分别左右移动,按“SPACE”(就是空格按键)时发射,(按下后y=559,在Cannonball里面判断是只要y小于560就开始y--,实现 红点 的不断向上移动。) 红点位置与黑点位置进行判断,打到黑点后,红点y变成560,即有回到椭圆上,黑点位置对应的二维数组的值变成0,表示那个地方没有 黑点 。如果没打到红点由于y--不断执行y最终到0,之后再次变为560,又回到椭圆上,完成了一个循环。
每4毫秒重绘一次,不断更新。
2024-06-01 00:18:35
我的这个代码的注释 能不能给我讲一下 谢谢 详细的 !
这个不是你写的么,给你个提示:通过颜色来确定对象控制的东西。
2024-06-01 01:14:59
2024-06-01 01:04:08
以下