java实现一个简单的射击游戏1

本文介绍了一个基于Java Swing的射击游戏GUI实现方案,包括游戏界面绘制、键盘控制游戏角色移动、敌人出现与消失逻辑、子弹碰撞检测及游戏结束条件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整体思路

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设置敌人的出现,及敌人出现被子弹击中后消失,子弹在击中敌人后消失,主人翁死后游戏结束!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皇正经

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值