尝试写java小游戏(捕鱼达人)

捕鱼达人

(平时都是在学校搞c语言,写算法。忽然java实验课大作业让设计一个小游戏的确挺蒙的,好在我之前学习过开发微信小程序,边查文档文档边做也比较快,下面有我的源码,截图,欢迎刚接触java小游戏的朋友一起学习。)


以下才是重点

废话不多说先上效果图进入游戏
(进入游戏后的界面)
进入游戏后的界面
(点击左键捕到鱼的界面)
点击左键捕到鱼的界面
一个简单的UML类图在这里插入图片描述

游戏实现(各种类)

(1)GameFrame(窗口)JFram游戏支架,用来固定游戏界面
(2)GamePanel(画板类)往窗口绘出各种表现效果
(3)ImageUtill(图片工具类)运用IO流方便图片的调用
(4)Fish(鱼类)鱼塘里的鱼(主角)
(5)Net(渔网类)展示鼠标的位置,右击可使网改变尺寸,左击进行捕鱼

实验总结

<1>窗口的建立

(1)只学了Java最基本的语法规则,和游戏完全不沾边,首先得创建一个窗口。学习到创建窗口的类继承于JFrame。
(2)有了窗口需要画定背景,这种操作叫画板,画板不但能规定背景颜色(在构造方法中用setBackground(Color.pink)),也可以绘出图片,文字等。
(3)图片的调用需要输入图片地址,返回一张图片,且在游戏中非常常见,另外把其写成ImageUtill(图片工具类)。
(4)将函数入口(main函数)写在GameFrame(窗口)里。
(5)遇到问题:GameFrame frame=new GameFrame();创建窗口对象后其不显示。frame.setVisible(true);需要用setVisible函数使其显示。
(6)遇到问题GamePanel panel=new GamePanel();创建画板后窗口不发生变化。
窗口和画板是两个独立的对象,需要在窗口中添加画板frame.add(panel);将其联系在一起。
(7)学习如何绘制图片,文字。在GamePanel(画板类)里定义public void paint(Graphics g) {在其进行绘图。背景图片:g.drawImage(bg,0,0,null);背景文字:g.drawString(“分数:0”, 20, 30);片用set···可以改变字体大小和颜色g.setColor(Color.yellow);g.setFont(new Font(“楷体”,Font.BOLD,20));
(8)遇到问题:在遇到IO流时报错。用图片路径获得图片时,可能有路径错误的情况,此时应有异常处理,及try和catch的运用。
(9)遇到问题:当关闭窗口,控制台显示程序还在运行。需要在GameFrame(窗口)添加语句setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);实现自动关闭。
(10)在学习(9)时知道了用setLocationRelativeTo(null);可以使窗口居中。

<2>鱼类的创立

(11)开始定义鱼类。所有的鱼类主要是图片不同,宽度和高度都有图片决定。所以鱼类可以不分父类子类,一个类就可以解决问题。
(12)每一条鱼都独立游动,所以每一条鱼就是一个独立的线程public class Fish extends Thread{鱼类继承Thead类,在里面编写run()方法,即线程启动时执行的方法,由于鱼一直游动,将鱼游动的方法写进死循环。需要注意的是在创立鱼时需要fish.start();使线程开始。
(13)需要在鱼类的成员变量里添加Random ran=new Random();随机数对象。在方法中需要用到随机数就很方便了。注:随机数对象有一个即可,多次使用均为随机值。如int index=ran.nextInt(9)+1;(1~9随机数)
(14)如何解决创建时生成随机鱼类的问题:鱼类主要是图片不同,所以在鱼类的构造方法中生成的图片随机即可。
(15)处理鱼类游动的问题:鱼并不是在线程里向左移动即可,想要表示出游动的动作,必须借助每一种鱼游动时的多张图片。创建集合 animation为鱼类的成员变量,在创建方法用随机数确定鱼的种类后,将鱼游动时的图片推入集合animation中。在线程run()方法中每向左移动3,就换下一张图片。
(16)遇到问题:鱼类不游动,偶然发现拖动窗口或者拉宽窗口时鱼的图片和位置才会更新。问题所在:虽然鱼的位置和图片更新了,但是画板却没有更新。但画板和鱼是两个不同的类,如何在鱼类中更新画板呢?解决方案:将画板作为参数传进鱼类的构造方法,在鱼类的成员变量中创建一个画板对象,并将传入的画板对象在构造方法赋值给成员变量的画板对象,此时在鱼类中便可以调用画板的方法。更新语句为panel.repaint();
(17)遇到问题:调试过程中发现窗口并没有鱼游动。原因可能是鱼游得太快,所以在run()方法里的死循环添加线程休眠。Thread.sleep(100);(此处需要异常处理)
(18)遇到问题:鱼游动一步就报错且卡住。图片的路径不准确造成的,鱼的图片是19,但是游动的图片序号确实09,代码错误导致图片读取不到而报错。所以图片的地址一定要精确。
(19)遇到问题:鱼游动时图片变形严重。将初始图片更换为游动过程的图片,且停止鱼的游动,发现图片并没有变形,但是开始游动后就有了图片变形的问题。在画板中画鱼的时候规定了宽度和高度,但是图片改变后,对象鱼的宽度和高度还是第一张图片的参数,所以出现了上述问题。解决方案:每游动一次换一张图片的时候,重新取得图片的高度和宽度。
(20)遇到问题:所有的鱼游动都是同步的,将鱼的初始图片更改,发现游的还是同步的。将游动停止,发现初始图片的确被更改了,但游动开始又开始同步。原因是在更新图片时总是更新为第二张,导致游动一致并没有被改变。将初始图片记录为int step_num=startImg;,更新总是变成下一张图片,即解决问题。
(21)遇到问题:虽然鱼游动不同步,但是仍然看着很假,游戏质量很差,原因是所有鱼的移动速度相同。解决方法:将鱼的游动速度创建为成员变量,在构造方法取随机值,int speed=ran.nextInt(5)+1;(偶然发现在这里可以使用前面的随机数成员变量)x-=speed;(鱼向左移动)

<3>鱼网类的创立

(22)渔网和鱼类同样是调用图片,并呈现在画板上,大致思路一样,且需要和鱼类一样同画板建立关联关系。不同点主要在于渔网的位置应和鼠标的位置保持一致,所以需要对鼠标的动作进行监控(监控直接写在画板类中)。具体步骤:在画板类内创立鼠标监听器,在其内创立鼠标适配器,在适配器内可获取鼠标移动,移出,移入,点击等事件。并需要将鼠标配适器加入到监听器中。
注:需要在画板类内打开鼠标监听器。
(23)遇到问题:渔网的位置不在鼠标的点击处(此时网的横纵坐标定义为鼠标的坐标)。解决方法:将网的横坐标定义为(鼠标的横坐标-网宽度的一半),网的纵坐标定义为(鼠标的纵坐标-网高度的一半)。
(24)在监听器写入方法,右击触发网类的方法,改变网的大小。
(25)遇到问题:右击后网不在鼠标的点击处。解决方法:在触发右击事件时同时更新网的横纵坐标。
(26)在鼠标监听器内写入鼠标的移入移出事件,使网在鼠标移出时隐藏。

<4>捕鱼

(27)需要在鱼的线程里判断鱼是否被抓,在此之前,先给鱼类创立成员变量记录鱼是否被捕获boolean catched=false;。并且写出鱼被捕获时状态改变的方法。
(将鱼的位置改为起点,且纵坐标随机)
(28)在鼠标监听器中,判断网和每一条鱼是否有触碰(需要循环语句,判断每一条鱼),若有触碰,将鱼的catched变量改为true。
(29)遇到问题:虽然被捕的鱼被改变到初始位置,但是并没有向前移动。解决方案:将鱼的数量定义为1,然后发现鱼被捕后在起点疯狂换位置(纵坐标不断改变),且为被捕时的动画,分析出是因为虽然把鱼的位置改变,没有把鱼被捕获的状态改为false。添加语句catched=false;。


最后

另外在画板对象可以把子弹数,分数什么的进行定义,剩下的大家就自由发挥了。
我会另外在CSND上传源码,里面有捕鱼达人的图片资源,大家可以下载使用。

  • 29
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值