游戏开发期末⼤作业之基于Java的⼩游戏“⼤鱼吃⼩鱼“(代码
素材齐全)
1.EatFish游戏开发过程
1.游戏窗⼝创建
2.添加背景图⽚
3.启动封⾯
4.启动页⾯的点击事件
5.游戏开始的背景添加
6.双缓存解决闪屏问题
7.敌⽅鱼类的⽣成
8.我⽅鱼的⽣成
9.我⽅鱼和敌⽅鱼的碰撞检测
10.游戏积分以及关卡的设置
2.游戏窗⼝的窗⼝创建
⾸先这个⼤鱼吃⼩鱼游戏在设计时就准备做成⼀个窗⼝游戏,并且准备采⽤Java进⾏开发,所以理所当然的想到了去使
⽤Swing技术来⽀持开发。当然,现如今Swing也早就成为了时代的产物,逐渐被JavaJX替代了。由于时间以及难易程度的考虑,这⾥我们还是采⽤了Swing技术来开发这个游戏。
3. EatFish游戏中的5种状态
这⾥我们⾸先定义了⼀个static的对象state⽤来表⽰游戏状态,然后采⽤switch语句来判定每种游戏状态对应的窗⼝应该做什么事情。⾸先,state=0表⽰“游戏未开始”,state=1表⽰“游戏进⾏中”,state=2表⽰“游戏结束”,state=3表⽰“通关成功”,state=4表⽰“游戏暂停”。
4.我⽅鱼类和敌⽅鱼类的创建
敌⽅鱼类:
我⽅鱼类:
敌我⽅的鱼类本质其实就是⼀个个打的对象,我们要做的就是去创建它们对应的类然后⽣成相应的对象,然后通
过createImage⽅法将这些鱼类的图⽚于对象进⾏绑定,然后我们看到的就是如上⽣动的鱼类了。此外,由于我⽅鱼类在向左向右移动时,以及敌⽅鱼类出现时都是有左右两个⽅向的,所以我们要提前准备好连个⽅向的动态图以及在代码中分别设计左右两个⽅向的鱼类对象。
5.我⽅鱼类的移动以及⼤⼩的变化
在⼯具类GameUtil中已经定义了UP、DOWM、LEFT、RIGHT,分别对应着键盘监听事件。我⽅鱼位置的变化由每次先前定义的speed以及当前位置决定。⽐如向右移动,点击⼀次“→”,我⽅鱼X坐标位置就加⼀个speed的⼤⼩。在我⽅鱼吃到⽐⾃⼰等级⼩的鱼的时候,鱼的体积是应该变⼤的。这⾥是由给不同等级敌⽅鱼类的分数count决定的,当吃掉⽐⾃⼰等级低的鱼类后,会调⽤绘制⾃⾝的⼀个⽅法paintSelf(),由于参数中加了count的值,所以我⽅鱼的体积就会变⼤。
6.敌⽅鱼类的批量⽣成
⾸先敌⽅鱼类我们设计成了三种:海马、热带鱼、剑鱼。另外还有⼀种Boss鲨鱼(⽆视任何其他鱼类,实现通吃)。这⾥敌⽅鱼类的⽣成是和游戏难度等级挂钩的。当level=1时,我们让窗⼝内随机不断⽣成1级敌⽅鱼:海马。Level=2时,⽣成热带
鱼。level=3时,⽣成剑鱼。Level=4时,⽣成鲨鱼。这⾥敌⽅鱼的⽣成借助了⼀个指针time,将他作为计数器,⽤来控制每过多久添加⼀条敌⽅鱼到敌⽅鱼的集合中。
7.鱼类的碰撞检测
鱼类碰撞检测是⼤鱼吃⼩鱼游戏中很关键的步骤,这⾥我们采⽤的是矩形碰撞检测的⽅法,即:通过获取鱼类⾃⾝矩形的⽅法,⽤于检测不同矩形之间是否相交了来判断鱼类碰撞。Java中有原⽣的Rect
angle类,我们为每个鱼类⽣成⼀个可以返回Rectangle类的对象的⽅法即可。之后再通过Java中的intersects()⽅法去⽐较两个返回的Rectangle对象是否相交就可以判断出鱼类间是否碰撞了。在碰撞后,将等级⼩的鱼类位置坐标更新到窗⼝之外就达到了被吃掉的效果
8.项⽬代码
Bg类:
package com.shu;
import java.awt.*;
public class Bg {
void paintSelf(Graphics g , int fishLevel){
g.drawImage(GameUtils.bgimg,0,0,null);
switch (GameWin.state){
case 0:
GameUtils.drawWord(g,"开始",d,80,700,500);
break;
case 1:
GameUtils.drawWord(g,"积分"+unt,Color.ORANGE,50,200,120); GameUtils.drawWord(g,"难度"+GameUtils.level,Color.ORANGE,50,600,120); GameUtils.drawWord(g,"等级"+fishLevel,Color.ORANGE,50,1000,120);
break;
case 2:
GameUtils.drawWord(g,"游戏结束",d,50,600,400);
break;
case 3:
GameUtils.drawWord(g,"积分"+unt,Color.ORANGE,50,200,120); GameUtils.drawWord(g,"难度"+GameUtils.level,Color.ORANGE,50,600,120); GameUtils.drawWord(g,"等级"+fishLevel,Color.ORANGE,50,1000,120);
GameUtils.drawWord(g ,"胜利",d,80,700,500);
break;
case 4:
break;
default:
}
}
}
Enamy类:
package com.shu;
import java.awt.*;
public class Enamy
{
//定义图⽚
Image image;
//定义物体坐标
//定义物体坐标
int x;
int y;
int width;
int height;
//移动速度
int speed;
//⽅向
简单的java游戏代码int dir = 1;//1为向右 -1为向左
//类型
int type;
//分值
int count;
/
/绘制⾃⾝⽅法
public void paintSelf(Graphics g)
{
g.drawImage(image,x,y,width,height,null); }
//获取⾃⾝矩形⽤于碰撞检测
public Rectangle getRec()
{
return new Rectangle(x,y,width,height); }
}
//敌⽅鱼左类
class Enamy_1_L extends Enamy
{
Enamy_1_L()
{
this.x = -45;
this.y = (int)(Math.random()*700 + 100); this.width = 45;
this.height = 69;
this.speed = 10;
this.image = amyl_img;
}
}
//敌⽅鱼右类
class Enamy_1_R extends Enamy_1_L
{
Enamy_1_R()
{
this.x = 1400;
dir = -1;
this.image = amyr_img;
}
}
class Enamy_2_L extends Enamy
{
Enamy_2_L()
{
this.x = -100;
this.y = (int)(Math.random()*700+100);
this.width = 100;
this.height = 100;
this.speed = 5;
this.image = amyl_2img;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论