整体思路
1.GUI画出游戏界面
2.设置监听器,键盘控住游戏人物
3.判断敌人是否被击败,游戏是否结束。
代码实现:
GameFrame类画出基本窗体:
package ui;
import javax.swing.JFrame;
public class GameFrame extends JFrame { //窗体
public GameFrame (){ //创建构造方法
//设置标题
setTitle("射击游戏"); //方法来源于JFrame类
//设置大小setSize(宽度,高度)
setSize(1200,800);
//设置位置
//null 相对于居中显示
setLocationRelativeTo(null);
//不允许改界面大小
setResizable(false);
//设置默认关闭选项
//关闭窗体时候的退出选项
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
//创建对象
GameFrame frame = new GameFrame ();
GamePanel panel=new GamePanel(frame);
//调用开始游戏的方法 启动游戏
//panel.action();
frame.add(panel);
//显示窗体 true 显示 false 隐藏
frame.setVisible(true);
}
}
GamePanel画出场上所有人物:
package ui; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; //import com.sun.java.util.jar.pack.Package.File; //java游戏面板 public class GamePanel extends JPanel{ //画图片的方法 //1 在类中定义图片 //2在构造方法中调用工具初始化图片 //3 在画图方法中定义图片 //构造方法 确定面板特点 BufferedImage bg; // 背景图 BufferedImage gov; BufferedImage st; BufferedImage xue; BufferedImage gw; int b=0; boolean c=false; //创建英雄机 Hero hero=new Hero(); Boss boss=new Boss(); //创建敌机 //Ep ep=new Ep(); //创建敌机大本营(所有的敌机都在这里面) List <Ep> eps=new ArrayList <Ep>(); List <Boom> bm=new ArrayList <Boom>(); BufferedImage b1; BufferedImage b2; BufferedImage b3; BufferedImage b4; BufferedImage b5; List <Boss> bs=new ArrayList <Boss>(); /*BufferedImage l1; BufferedImage l2; BufferedImage l3; BufferedImage l4; BufferedImage l5;*/ // 初始化图片 //构造英雄机弹药库 List <Fire>fs=new ArrayList <Fire>(); //定义分数 int score; int score1; //构造方法 //开始游戏的方法 boolean gameover; boolean start = false; public void action() { //创建并启动一个线程 控制游戏场景中物体的活动 //固定格式 // new Thread (){public void run(){...线程需要做的事情...}}.start(); new Thread (){ public void run(){ //写一个死循环 让游戏一直运行 while (true) { if(!gameover&&c==false){ //调用敌机入场方法 epEnter(); //调用敌机移动的方法 epMove(); bsEnter(); bsMove(); //J发射子弹 //shoot(); //让子弹移动 fireMove(); //判断子弹是否打到敌机 shootEp(); //判断敌机是否打到英雄机 hit(); } //重绘,刷新 //每执行一次就休息一下 //线程休眠 sleep(毫秒数) try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } repaint(); } } //检测敌机是否撞到英雄机 //检测是否击中敌机 //排除移除屏幕的飞机 //所有的子弹都有可能打到敌机 //判断一颗子弹是否击中敌人机器 //敌机移动的方法 } .start(); } protected void bsEnter(){ if(score1>=300&&b==0) { Boss boss = new Boss(); bs.add(boss); score1=0; b=1; } } private void bsMove() { //遍历所有的敌机 for(int i=0;i<bs.size();i++) { //获取每一个敌机 Boss b=bs.get(i); //让敌机移动 b.Move(); } } protected void hit(){ for(int i=0;i<eps.size();i++){ Ep e = eps.get(i); if(e.hitBy(hero)){ eps.remove(e); hero.hp--; score += 10; score1 +=10; if(hero.hp<=0){ gameover=true; } } } for(int i=0;i<bs.size();i++){ Boss bos = bs.get(i); if(bos.hitBy(hero)){ hero.hp--; bos.hp--; if(hero.hp<=0){ gameover=true; } } } } protected void shootEp(){ for(int i=0;i<fs.size();i++){ Fire f = fs.get(i); bang(f); } } private void bang(Fire f){ for(int i=0;i<eps.size();i++){ Ep e = eps.get(i); //判断子弹是否击中敌人 if(e.shootBy(f)){ e.hp--; if(e.hp<=0) { eps.remove(e); Boom b=new Boom(e.x,e.y); bm.add(b); score += 10; score1 += 10; } fs.remove(f); //增加分数 } } for(int i=0;i<bs.size();i++){ Boss bos = bs.get(i); //判断子弹是否击中敌人 if(bos.shootBy(f)){ bos.hp--; if(bos.hp<=0){ bs.remove(bos); Boom b=new Boom(bos.x,bos.y); bm.add(b); c = true; } fs.remove(f); //增加分数 } } } protected void fireMove(){ for(int i=0;i<fs.size();i++){ Fire f = fs.get(i); f.move(); } } private void epMove() { //遍历所有的敌机 for(int i=0;i<eps.size();i++) { //获取每一个敌机 Ep e=eps.get(i); //让敌机移动 e.Move(); } } protected void shoot(){ //创建子弹 Fire fire = new Fire(hero.x,hero.y); //讲子弹加入到弹药库 fs.add(fire); } int index =0;//记录方法执行的次数 每执行n次释放一个敌机 protected void epEnter() { //记录执行的次数 index ++; if(index>=5) { //创建敌机 Ep e=new Ep(); //将敌机加入到敌人=机大本营 eps.add(e); //将index重新归0 index =0; } } //确定面板的特点 public GamePanel(GameFrame frame) { //设置背景 setBackground(Color.blue); gov=App.getImg("/img/lose.png"); bg=App.getImg("/img/map.png"); st=App.getImg("/img/menu.png"); b1=App.getImg("/img/b1.png"); b2=App.getImg("/img/b2.png"); b3=App.getImg("/img/b3.png"); b4=App.getImg("/img/b4.png"); b5=App.getImg("/img/b5.png"); xue=App.getImg("/img/hart.gif"); gw=App.getImg("/img/gw.png"); MouseAdapter adapter = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if(start == true){ action(); }else{ start = true; action(); } if(gameover){ hero = new Hero(); gameover = false; score = 0; repaint(); } if(c==true){ hero = new Hero(); c=false; score = 0; repaint(); } } }; addMouseListener(adapter); addMouseMotionListener(adapter); //键盘监听器 KeyAdapter kd = new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); //System.out.println(keyCode); if(!gameover&&c==false){ if(keyCode==KeyEvent.VK_UP){ //英雄向上移动 hero.moveUp(); System.out.println("英雄向上移动了"); }else if(keyCode==KeyEvent.VK_DOWN){ //英雄向下移动 hero.moveDown(); System.out.println("英雄向下移动了"); }else if(keyCode==KeyEvent.VK_LEFT){ //英雄向左移动 hero.moveLeft(); System.out.println("英雄向左移动了"); }else if(keyCode==KeyEvent.VK_RIGHT){ //英雄向右移动 hero.moveRight(); System.out.println("英雄向右移动了"); }else if(keyCode==KeyEvent.VK_J){ shoot(); System.out.println("子弹发射了"); } } //重绘 repaint(); } }; repaint(); //将适配器加入键盘监听器 frame.addKeyListener(kd); } //专用画图方法 //Graphics g 画笔 public void paint(Graphics g) { super.paint(g); g.drawImage(bg, 0, 0, null); //画图片时 如果不加入高度和宽度 就是原图大小 //在paint中画图是有顺序的 先画的会被后画的覆盖 //画英雄机器 //g.drawImage(图片,横坐标,纵坐标,宽度,高度,null); g.drawImage(hero.img,hero.x,hero.y,hero.w,hero.h,null); //画敌机 //遍历敌机大本营 for (int i=0;i<eps.size();i++) { //获取每一个敌机 Ep ep=eps.get(i); g.drawImage(ep.img, ep.x ,ep.y, ep.w, ep.h, null); } //画boss for (int i=0;i<bs.size();i++) { //获取每一个敌机 Boss bos=bs.get(i); g.drawImage(bos.img,bos.x,bos.y,bos.w,bos.h,null); } //画爆炸效果 for(int i=0;i<bm.size();i++){ //取出炸弹 Boom b = bm.get(i); //System.out.format("%d",++num); if(b.life>=5){ g.drawImage(b1, b.x, b.y, 90, 90, this); }else if(b.life>=4){ g.drawImage(b2, b.x, b.y, 90, 90, this); }else if(b.life>=3){ g.drawImage(b3, b.x, b.y, 90, 90, this); }else if(b.life>=2){ g.drawImage(b4, b.x, b.y, 90, 90, this); }else if(b.life>=1){ g.drawImage(b5, b.x, b.y, 90, 90, this); } b.lifeDown(); //System.out.format("1+%d\n",i); //如果life为 0 酒吧炸弹从bombs向量去掉 if(b.life==0){ bm.remove(b); //System.out.println("炸弹爆炸"); } } //画子弹 for(int i=0;i<fs.size();i++) { //获取一个子弹 Fire fire=fs.get(i); g.drawImage(fire.img, fire.x ,fire.y, fire.w, fire.h, null); } //画分数 g.setColor(Color.white); g.setFont(new Font("楷体",Font.BOLD,20)); g.drawString("分数:"+score,10,30); //画英雄机血量 for(int i=0;i<hero.hp;i++) { g.drawImage(xue,350+i*35, 5,30,30, null); } if(start == false){ g.drawImage(st, 0, 0, 1200,900,null); } //游戏结束,画出gameover if(gameover) { //g.drawImage(bg, 0, 0, null); g.drawImage(gov, 0, 0,1200,900, null); g.setColor(Color.white); g.setFont(new Font("楷体",Font.BOLD,20)); g.drawString("点击屏幕重新开始",500,290); }else if(c==true){ //gameover=true; g.drawImage(gw, 0, 0,1200,900, null); } } }
在GamePanel设置敌人的出现,及敌人出现被子弹击中后消失,子弹在击中敌人后消失,主人翁死后游戏结束!