一、实验目的
1、了解JavaFX的基本原理和基本组件;
2、能够熟练应用JavaFX组件进行界面设计;
3、掌握Java的事件驱动机制、lambda表达式;
4、掌握shape形状类的使用。
5、能够熟练掌握javaFX基本的动画效果。
6、掌握javaFX基本的图形设计思路。
二、实验要求
1、对实验中要求的代码进行上机调试,完成实验指导书中全部实验内容。
2、编写实验报告。
三、实验步骤
1.确定好大致的设计思路
- 首先要制作几个界面的类,相应的时候展示相应的界面。
- 可以制作一个游戏界面类GamePane继承Pane类,属性为界面中的全部image,line,pathtransition以及“农夫过河”这四个标题大字。
- 开始界面StartPane继承GamePane类可以运用动画效果pathtansion让导入好的几个图像沿着线运动,显示的时候只显示图像不显示线;再就是可以运用学过的timeline相关的知识来优化游戏界面,开始界面正中间一行字为“请点击屏幕开始游戏”,运用timeline达到闪烁的效果。用户点击屏幕后,设置场景为GamingScene。
- 游戏中界面GamingPane继承GamePane类,初始界面为最左边一列为狼,羊,兔子,白菜,胡萝卜五个图像,从左往右第二列为农夫,船(因为农夫默认在船上),当船在左边时(相当于船还没有过河),此时点击某物体会往右移至船的那一列,相当于把物体装上船。再次点击会移至原来的位置,相当于把物体卸下船;在船在右边时,已过河但是不在船上的物体在最右边一列,农夫和船在向右往左第二列,点击物体往左移至船的那一列,相当于把物体装上船,再次点击移至原来的位置,相当于把物体卸下船,点击船进行过河。
- 成功界面SuccessPane和失败界面FailurePane继承GamePane类,当游戏结束时,stage上显示相应的场景。
2.实际设计过程中做出的改进。
- 让AbstractGame类继承Application类,在AbstractGame的子类Game中实现Start函数,每次过河之后进行一次判断,判断游戏成功或者失败。
- 在Game中添加一个move方法,用来制作物体过河时的动画。
- 物体移动后可以凭借物体当前的x坐标来判断物体的过河情况以及上船情况,但是每次移动后都要设置x为线的末端点的x坐标。
- Boat的board和disembark方法返回一个boolean类型的变量,这样在Game中就可以判断物体当前能不能移动(即能不能上船或者下船)。
3.设计过程遇到的问题
遇到的最大的问题还是图像的x坐标和y坐标的设定,由于图像的大小不一以及游戏内容的改变,图像的位置需要不断地变化,需要一点一点去试x和y设置成多少才能保证的基本的游戏效果。另外,我在GamingPane中设置图像初始的x和y,这个图像运动的线的路径的起始端点也是相同的x和y,但是两者却不会在一个位置!!!真的很苦恼,又要自己重新设置合适的线和初始位置,这个花费了我大量的时间,可能是参考的原点不同吧!
四、实验结果
整体类图如下

开始界面


点击进入游戏中界面

将羊和兔子装上船

过河

再次过河

把狼装上船

过河

将羊和兔子装上船

过河

将白菜和胡萝卜装上船

过河

过河

将羊和兔子装上船并过河,游戏成功


游戏失败的情况,将狼装上船并过河


演示视频如下
五、实验小结
总的来说,这次实验做起来还是很有收获的,基本上把老师讲过的内容和书上的大多数内容都应用了一遍,编写图形化界面真的比传统编程好玩,一堆英文和几个图像,谁不愿意看到几个生动的图像呢?这也是我写下去的最大动力吧,看到自己写出来的动画效果感觉very wonderful!但是这次实验我也存在很多不足,比如一开始的时候我是准备用一些button来代替我之前的那些选项的,但是由于自己前面写的比较复杂,写了两个选项界面,导致我后面很难在600*600的空间里安置那么多选项(设置成600*600的图形界面也是我开始设置时的疏忽吧!),最后也是绞尽脑汁想到了可以直接点击图像来进行相关的操作,图像在不同的位置可以让用户知道当前物体在船上的情况以及过河的情况,如果游戏结束或者游戏失败就转到相应的界面,但是较上一次实验少了初始化游戏选项以及中途退出游戏选项,仔细想想这两个选项写起来应该都不难0.0。还有就是界面的美感不足,好像除了开始界面还行之外其他界面都比较生硬。老师课上也说过,javafx编写图像不是优势,自己也是通过这一次实验尝试了一下 ,对比其他工具来讲,的确如此,但是由于这是我第一次图像化编程,收获很大,通过这次实验了解了JavaFX的基本原理和基本组件、能够熟练应用JavaFX组件进行界面设计、掌握Java的事件驱动机制、lambda表达式、掌握shape形状类的使用、能够熟练掌握javaFX基本的动画效果以及掌握javaFX基本的图形设计思路。在java的学习之路上又前进了一步!