我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛。
前言
「游戏」创意 对于一名后端CURD程序员来说是比较陌生的,不是很擅长,但是我有想要一份奖励,思索许久,想到了初学java时,培训老师带领做的经典小游戏-【飞机大战】,那么这期就记录下飞机大战的开发过程吧。
设计思路:
1.创建游戏界面的JFrame窗体实现
2.创建战机类和子弹类,并将子弹始发点坐标定在战机坐标前面
3.创建敌机类。
4.判断敌机与子弹碰撞方法,即敌机被击中后消失,判断敌机与战机碰撞方法
总体开发思想
第一步创建JFrame窗体,设置大小
public class Game {
public static void main(String[] args) {
JFrame j = new JFrame(); //创建窗口
j.setSize(400, 650);
j.setTitle("PlaneWar"); //设置标题
j.setLocationRelativeTo(null); //设置居中
j.setDefaultCloseOperation(3); //默认关闭
j.setVisible(true); //窗口可见性
}
}
创建画布,设置背景图片
//构造方法
public GamePanel() {
state=START;
bx = 0;
by = -5350;
bg = new ImageIcon("src/images/background_1.png").getImage();
}
创建战机类,定义x,y为战机坐标,并创建子弹,置于飞机前面,
List fires = new ArrayList();
public class Bullet {
int x, y;
//构造方法
public Bullet(int a, int b) { //参数为英雄机坐标
this.x=a;
this.y=b;
}
//x,y的get和set方法
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
//画子弹
public void drawZd(Graphics g) {
Image zd=new ImageIcon("src/images/bullet_7.png").getImage();
g.drawImage(zd, x-19, y-80, null);
}
}
创建敌机类,同战机类,随机x坐标,y不变,保证敌机固定在顶部生成。
public class Enemy {
int x,y;
String icon;
public Enemy(String icon) { //参数为敌机图片路径
this.icon=icon;
x=(int)(Math.random()*360)+10; //随机生成x坐标
y=-30;
}
//画敌机
public void drawPlane(Graphics g) {
Image plane=new ImageIcon(icon).getImage();
g.drawImage(plane, x-15, y-15, null);
}
}
判断子弹和敌机碰撞方法实现,获取子弹坐标和敌机中心坐标,判断是否相撞
public boolean Boom(Bullet z, Enemy d) {
int zx, zy, dx, dy;
boolean crash = false;
//子弹坐标
zx = z.getX();
zy = z.getY();
//敌机坐标
dx = d.getX();
dy = d.getY();
if (dx < zx && zy - dy < 30 && dx + 30 > zx) {
crash = true; //如果相撞返回真值
}
return crash;
}
判断飞机与敌机相撞方法,获取英雄机中心坐标和敌机中心坐标.
public boolean Boom2(Enemy d, int x, int y) {
int dx, dy;
boolean crash = false;
//敌机坐标
dx = d.getX();
dy = d.getY();
//英雄机坐标
x = x - 50;
y = y - 80;
//相撞条件
if (dx > x+20 && y - dy < 20 && dx < x + 60) {
crash = true; //如果相撞返回真值
}
return crash;
}
在画布类中增加监听鼠标移动方法,并设置生成子弹速度及敌机速度,用集合来存储子弹的对象,子弹的发射是从集合中调出对象,子弹的消失是从集合中删除相应的子弹对象,当子弹与敌机碰撞时删除子弹和敌机,当敌机与战机碰撞时,游戏结束
子弹的移动: 子弹图片在窗口中显示位置横纵坐标的改变
List<Bullet> zd = new ArrayList<Bullet>(); //存储子弹对象
重新MouseMotionListener 中的mouseMoved方法获取取鼠标的坐标值
@Override
public void mouseMoved(MouseEvent e) {
x = e.getX(); //动态获取鼠标的坐标值
y = e.getY();
}
// 子弹和敌机碰撞
Crash crash = new Crash();
for (int j = 0; j < zd.size(); j++) {
Bullet z = zd.get(j);
for (int i = 0; i < dj.size(); i++) {
Enemy d = dj.get(i);
if (crash.Boom(z, d)) { //调用Crash对象的Boom方法判断是否相撞
score += 2; //分数加2
dx = dj.get(i).getX(); //敌机坐标
dy = dj.get(i).getY();
db = true; //敌机爆炸
dj.remove(i); //从集合中删除敌机
zd.remove(j); //从集合中删除子弹
break;
}
}
}
//判断飞机相撞
for (int i = 0; i < dj.size(); i++) {
Enemy d = dj.get(i);
if (crash.Boom2(d, x, y)) {
score += 2; //分数加2
dx = dj.get(i).getX();
dy = dj.get(i).getY();
db = true;
dj.remove(i); //从集合中删除敌机
}
}
}
好了,本文就给大家介绍到这里,感觉有帮助的,留下个赞或评论再走吧!谢啦~ 💐