千家信息网

Java怎么实现升级版布谷鸟闯关游戏

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章主要介绍"Java怎么实现升级版布谷鸟闯关游戏",在日常操作中,相信很多人在Java怎么实现升级版布谷鸟闯关游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"J
千家信息网最后更新 2024年11月23日Java怎么实现升级版布谷鸟闯关游戏

这篇文章主要介绍"Java怎么实现升级版布谷鸟闯关游戏",在日常操作中,相信很多人在Java怎么实现升级版布谷鸟闯关游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java怎么实现升级版布谷鸟闯关游戏"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

前言

《布谷鸟闯关-升级版》是一个基于java的布谷鸟闯关游戏,鼠标左键点击控制鸟的位置穿过管道间的缝隙,需要做碰撞检测,监听键盘事件,背景图片的切换,障碍物管道产生时y轴上需要随机位置。

主要设计

1.设计游戏界面,用swing实现

2.设计背景

3.设计移动墙

4.设计布谷鸟

5.设计障碍物

6.设计背景音乐和音效

7.新增用户账号注册登录功能

8.引用mysql数据库,管理用户账号密码和储存排行榜等信息

  • 需要提前创建好数据库"game",字符集选"utf8mb4"

  • 然后执行mysql表结构和初始化数据脚本

  • 修改代码里的DBUtils的参数值

9.新增游戏商城模块

10.新增排行榜模块

功能截图

用户注册:

游戏欢迎界面:

游戏开始界面:

鼠标左键点击控制鸟的位置穿过管道间的缝隙

代码实现

游戏启动类

//开始界面public class frame extends JFrame {        private JPanel pane;        public static frame frame;        public frame(){                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                this.setSize(240,150);                 ImageIcon backGround = new ImageIcon("images/frame.png");             JLabel bkgImage = new JLabel(backGround);             bkgImage.setSize(240,150);             bkgImage.setLocation(0,0);             JPanel bkgPanel = (JPanel) this.getContentPane();             bkgPanel.setOpaque(false);                     //注册按钮                JButton button_regist =new JButton("注册");                button_regist.setBounds(30,40, 60,30);                bkgPanel.add(button_regist);                                button_regist.addActionListener(new ActionListener(){                        public void actionPerformed(ActionEvent e){                                new frame_regist().setVisible(true);                        }                });                                //登录按钮                JButton button_log=new JButton("登录");                button_log.addActionListener(new ActionListener(){                        public void actionPerformed(ActionEvent e){                                new frame_log(frame).setVisible(true);                        }                });                button_log.setBounds(130,40, 60, 30);                bkgPanel.add(button_log);                this.getContentPane().add(bkgImage);                        }                //弹出显示传入String的提示框        public static void frame_warning(String warning) {                JFrame frame=new JFrame();                JPanel pane=new JPanel();                frame.setBounds(540, 360, 300, 150);                frame.setContentPane(pane);            pane.setBorder(new EmptyBorder(5, 5, 5, 5));                pane.setLayout(null);                JLabel label_warning=new JLabel(warning);                label_warning.setBounds(50,20,150,50);                pane.add(label_warning);                                JButton button_yes = new JButton("确定");                button_yes.addActionListener(new ActionListener() {                        public void actionPerformed(ActionEvent e) {                                frame.setVisible(false);                        }                });                button_yes.setBounds(80, 80, 93, 23);                pane.add(button_yes);                                frame.setVisible(true);        }        public static void main(String[] args){                                frame =new frame();                frame.setLocationRelativeTo(null);                frame.setVisible(true);        }        /**         *          */}

核心类

import static java.lang.Thread.sleep; public class GameplayingFrame extends JFrame{        private static final long serialVersionUID = 1L;        user_inf user;        MainFrame mainframe;        List rfs;        Graphics g=this.getGraphics();        GameplayingFrame(user_inf user,List rfs,MainFrame mainframe)        {                this.mainframe=mainframe;                this.rfs=rfs;                this.user=user;                this.setTitle("Fly Bird");        this.setSize(Constant.Frame_Width,Constant.Frame_Height);        this.setResizable(false);        this.setLocationRelativeTo(null);        this.setVisible(true);        Scene stage = new Scene(user);        Graphics g = this.getGraphics();         ImageIcon backGround = new ImageIcon("images/bg_day.png");        JLabel bkgImage = new JLabel(backGround);        bkgImage.setSize(288,512);        bkgImage.setLocation(0,0);        JPanel bkgPanel = (JPanel) this.getContentPane();        bkgPanel.setOpaque(false);        this.getContentPane().add(bkgImage);        //为界面加入鼠标的响应事件        this.addMouseListener(new MouseListener(){                        @Override                        public void mouseReleased(MouseEvent e) {}                        @Override                        public void mousePressed(MouseEvent e) {                            }                        @Override                        public void mouseExited(MouseEvent e) {                             }                                                @Override                        public void mouseEntered(MouseEvent e) {                            }                        @Override                        public void mouseClicked(MouseEvent e) {                            stage.speed_y=-175;                        }                });        JLabel scoreText = new JLabel();        Font font = new Font(Font.SERIF, Font.ITALIC, 30);        scoreText.setFont(font);        scoreText.setText(String.valueOf(0));        this.setLayout(null);        scoreText.setBounds(129,0,30,30);        this.add(scoreText);        //添加一个线程对象,用于重复绘图,来节约主线程的资源,使游戏运行更加流畅        new Thread(new playingThread(stage,g,this,user,rfs,mainframe)).start();     }                       }         /*  * 场景类,包含了游戏界面的物品以及游戏实现的算法  */class  Scene{    //后缀_x/_y表示横/纵坐标,窗口左上角为原点    public final int bird_x = 88;    //重力加速度    public final int G = 300;    public double bird_y;    public double birdRadius;    //速度--正值为向下,负值为向上    public int speed_x;    public int speed_y;    private  Ground land= new Ground(GameUtil.toBufferedImage(GameUtil.getImage("ioo/land.png")));    BufferedImage back=  GameUtil.toBufferedImage(GameUtil.getImage("ioo/bg_day.png")) ;       Barrier barrier;    Barrier barrier1;    Ground ground;    FlyingBird bird=null;    Scene(user_inf user){            bird_y = 200;        bird=new FlyingBird(bird_x,bird_y,user);        birdRadius = 22;        speed_x = 3;        speed_y = 0;        ground = new Ground(GameUtil.toBufferedImage(GameUtil.getImage("ioo/land.png")));        barrier= new Barrier(GameUtil.toBufferedImage(GameUtil.getImage("ioo/pipe_down1.png")));        barrier1= new Barrier(GameUtil.toBufferedImage(GameUtil.getImage("ioo/pipe_down.png")));          }         //返回true是游戏已经结束,返回false表示游戏继续进行             boolean ifGameOver(){                    //碰到地面                    if(bird_y + birdRadius > 512 - ground.getHeight()){                        System.out.println("hit ground");                        return true;                    }                    //碰到顶                    if(bird_y - birdRadius < 0){                        System.out.println("hit sky");                        return true;                    }                    //未过左边界时                    if(bird_x + birdRadius <= barrier.location_x){                        return false;                    }                    //接近左边界时                    if(bird_x + birdRadius > barrier.location_x && bird_x < barrier.location_x){                        if(bird_y < barrier.topHeight || bird_y + birdRadius*0.7 > 512 - barrier.bottomHeight){                            System.out.println("hit left edge");                            return true;                        }                        return false;                    }                    //通过管道时                    if(bird_x >= barrier.location_x && bird_x < barrier.location_x + barrier.width){                        boolean y1 = bird_y + birdRadius > 512 - barrier.bottomHeight;                        boolean y2 = bird_y  = barrier.location_x + barrier.width){                        return false;                    }                    return false;                }    //ifGameOver=false时才执行    boolean ifGetScore(){        return bird_x + birdRadius > barrier.location_x;    }    //第二次之后的绘图    public void drawItems(Graphics g){        //鸟         bird.draw(g);            //下障碍物            g.drawImage(barrier.img, barrier.location_x, 512 - barrier.bottomHeight,33,barrier.bottomHeight, null);        //上障碍物            g.drawImage(barrier1.img,barrier.location_x, 0,33,barrier.topHeight, null);            //地面        g.drawImage(ground.getBufferedImage(),0,512-30, null);        ground.checkGround();        barrier.checkBarrier();    }    //更新各个物体的位置(每秒30次)    public void itemMove() {        //计算鸟的速度        speed_y += G*0.033;        //鸟最大的向下速度为220        if(speed_y > 220){            speed_y = 220;        }        //计算鸟的纵坐标        bird_y += speed_y*0.033;          bird.y=bird_y;        //计算障碍物和地面的横坐标        barrier.location_x -= speed_x;        ground.setX(ground.getX()-speed_x);    }      //变速方法,根据分数调整速度    public void shift(int score){        if(score < 1) {            speed_x = 3;        }        else if (score < 100){            speed_x = 4;        }        else if (score < 200){            speed_x = 5;        }        else if (score < 300){            speed_x = 6;        }        else if (score < 400){            speed_x = 7;        }        else if (score < 500){            speed_x = 8;        }        else speed_x = 9;    }            }

线程类用于重复绘图

public class playingThread implements Runnable {        Scene stage;        private Image iBuffer;    private Graphics gBuffer;    List rfs;    user_inf user;    MainFrame mainframe;        Graphics g ;        GameplayingFrame playingframe ;        public static boolean flag = true;//控制计分板的变量        public int score = 0;//分数        playingThread(Scene stage,Graphics g,GameplayingFrame playingframe ,user_inf user,List rfs,MainFrame mainframe)        {                this.mainframe=mainframe;                this.rfs=rfs;                this.user=user;                this.stage=stage;                this.g=g;                this.playingframe=playingframe;                        }        @Override        public void run() {                 while (!stage.ifGameOver()){                     stage.drawItems(g);//绘画                     stage.itemMove();//物体移动                    //33ms刷新一次                    try {                        sleep(33);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    if(stage.ifGetScore()){                            score++;                    }                    stage.shift(score);                    //playingframe.update(g);                    //清除上一次绘画结果                  //双缓冲方法清除上一次绘画结果                    if (iBuffer == null){                        iBuffer = playingframe.createImage(playingframe.getSize().width,playingframe.getSize().height);                        gBuffer = iBuffer.getGraphics();                    }                    playingframe.paint(gBuffer);                    g.drawImage(iBuffer,0,0,null);                  //  stage.drawItems(g);//再绘画                }                     user.setCoin(user.getCoin()+score);                     new user_dao().update(user);                     playingframe.setVisible(false);                     rank_information rf=new rank_information();                     rf.setScore(score);                     rf.setName(user.getUser_name());                     rfs.add(rf);                      new rank_dao().update_rank(rfs);                      new  resultFrame(score,user,rfs,mainframe);                      System.out.println("game over");                                                                                  }}

到此,关于"Java怎么实现升级版布谷鸟闯关游戏"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0