飞机大战游戏设计
皮卡丘大战超梦(飞机大战)
java实验课大作业让设计一个游戏,就试着写了一下,下面有我的源码,欢迎小伙伴们一起学习。
运行效果图
游戏界面
游戏结束时候的画面
一个简单的UML类图
游戏实现
MyGameFrame类:JFrame游戏支架,绘制窗口,main
Utils类:工具类,运用IO流方便图片的调用
GameObject类:游戏里物体的父类
Plane类:英雄机的类
Enemy类:敌机的类
BUllet类:敌机发出的子弹类
Diamond类:英雄机拾取的宝石类
实验总结
-
窗口的建立
-
设计游戏首先得创建一个窗口,窗口的类继承于JFrame
-
创建后窗口后,对窗口进行初始化,如设置大小,位置,可视化等等,(默认的窗口是不可视的,要利用setVisible方法),这里要注意,窗口的关闭按键点击后程序还在运行,这个时候就要添加一个窗口监听事件,用window Closing方法,实现点击后关闭程序。
-
画出背景,背景可以用包里自带的方法setBackground(color),也可以利用画图drawImage方法。
-
利用画图方法时首先要创建Image对象,引入图片地址。定义一个paint(Graphics g)方法,画背景时,g.drawImage(Image,0,0,null),画字符串时g.drawString(“string”,int,int),可以用setColor方法设置字符串颜色,setFont设置字体格式
-
画图时一定要先画背景在画其他图片,不然其他图片会被背景覆盖,就绘制不出图片。
-
在绘制图片时创建一个paintThread extends Thread类,实现不断重画
-
Plane类的创建
-
英雄机类继承自游戏物体的所有父类GameObject,继承了父类的x,y,width,height,img,speed等变量,还定义了两个静态变量score=0,life=3,boolean型变量left,up,right,down,将图片的宽度和高度分别赋给,width,height
-
首先创建了一个构造方法(Image,x,y),在窗口类中创建英雄机的对象,并将图片,x,y传入方法
-
在窗口类中增加键盘监听,在英雄机类里创建addDirection方法和minusDirection方法,对输入的按键对boolean变量赋值,并创建move方法,根据boolean型变量的值对英雄机进行移动,需要注意的是,英雄机移动的范围应该在窗口范围之内。
-
需要注意的是,增加监听必须在main方法所在的类里
-
最后,创建一个Retangle类型的getRect方法,返回图片所在的矩形,利于后面的碰撞检测。ps:这个很重要,我之前就是没返回敌机和子弹的矩形,导致碰撞检测一直失败。
-Enemy,Diamond类的创建
- Enemy,Diamond类都是继承子所有游戏物体的父类,且都是随机出现,因此可以放在一块讲
- 这两个类与Plane类相比多了个随机出现的方法,创建一个Random类型的对象,利用random.nextInt(int)设置随机出现的个数,这里需要注意随机出现的横坐标应该是在窗口宽度-width/2之间,纵坐标应该是-(窗口高度-height/2)之间,然后出现后利用move方法向下移动
- 在窗口类里面创建Enemy和Diamond类的集合,对集合中的每一个对象初始化,并绘制集合中的每一个对象,为了保持数量的稳定,设置为每一个对象超出窗口范围后,remove(),并repaint()
- 在Enemy和Diamond类里重载getRec方法,返回图片所在的矩形,在窗口类里与Plane对象用intersects进行碰撞检测,如果Plane对象与Enemy对象碰撞,则Plane对象生命值减一,remove Enemy对象并重绘,如果Plane对象与Diamond对象碰撞,Plane对象的score加10,移去Diamond对象并重绘
- 这里要注意,调用paint方法时一定要把图片的地址传进去
-Bullet类的创建
- 在窗口类里创建一个装子弹的集合
- 在Bullet类里创建一个构造方法Bullet(x,y),利用enemy的坐标创建对象,这里因为子弹的发射速度过快,可以先创建一个临时变量time,执行一次循环time++,当time%20==0时,发射子弹。
- 发射子弹时,会发现子弹在enmey一边,这个时候可以把传入的坐标改为enmey.x+bullet.width/2,enmey.y+bullet.height/2,这样发射的子弹就在enemy图片正中间了。
- 子弹在移动时,可以对子弹位置进行判断,当子弹位置进入窗口后在进行移动
- 在进行碰撞检测时,如果子弹碰到英雄机,英雄机生命值减一,子弹消失。
-游戏效果
- 在窗口的适当位置画出两个字符串“当前生命值”和“积分”,注意设置颜色不要与背景颜色相近
- 在飞机生命值为0时,绘制出一张背景,在飞机的位置绘制一个字符串,“游戏结束”。
最后
大家还可以加个异常处理,对键盘监听时输入的指令进行检测,如果不是WASD,则会输出“请输入正确指令”。
我会另外发个源码还有游戏中用到的图片,有兴趣的大家可以下载。