【Java经典小游戏】大鱼吃小鱼 (两万字保姆级教程)_大鱼吃小鱼java代码

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取


由于游戏中需要不断绘制背景图片,所以我们在启动方法中添加一个 **while** 循环,在其中每隔 **40** 毫秒重绘背景图



import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GameWin extends JFrame {
int width = 1440;
int height = 900;

//定义游戏默认状态
static int state = 0;

//获取背景图类的对象
Bg bg = new Bg();

//创建一个启动窗口,设置窗口信息
public void launch() throws InterruptedException {
    this.setVisible(true);                          //设置窗口可见
    this.setSize(width, height);                    //设置窗口大小
    this.setLocationRelativeTo(null);               //设置窗口居中
    this.setResizable(false);                       //设置窗口大小不可改变
    this.setTitle("大鱼吃小鱼");                     //设置窗口标题
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);   //设置窗口按钮

    //添加鼠标监听事件
    this.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getButton() == 1 && state == 0) {
                state = 1;
                repaint();
            }
        }
    });

    //背景图片重复使用,需要重复调用repaint方法
    while(true) {
        repaint();
        Thread.sleep(40);
    }
}

@Override
public void paint(Graphics g) {
    //用画笔绘制背景图片
    g.drawImage(GameUtils.bgimg, 0, 0, null);

    switch (state) {
        case 0:
            g.drawImage(GameUtils.bgimg, 0, 0, null);
            //为启动页面添加文字
            g.setColor(Color.pink);
            g.setFont(new Font("仿宋", Font.BOLD, 60));
            g.drawString("请点击开始游戏", 500, 500);
            break;
        case 1:
            bg.paintSelf(g);
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        default:
            break;
    }
}

}


### 6 - 双缓存解决闪屏问题


如果此时你的屏幕出现闪烁的情况,可以用下面的方法解决


整体思路为:


重新创建一个空的图片,将所有的组件先绘制到空的图片上,然后把绘制好的图片一次性地绘制到主窗口上


创建一个空图片对象,在 **paint** 方法中将所有组件绘制到空图片上,再一次性绘制到主窗口上



public class GameWin extends JFrame {
int width = 1440;
int height = 900;

//定义游戏默认状态
static int state = 0;

//获取背景图类的对象
Bg bg = new Bg();

//创建一个空图片对象
Image offScreenImage;

//创建一个启动窗口,设置窗口信息
public void launch() throws InterruptedException {
    this.setVisible(true);                          //设置窗口可见
    this.setSize(width, height);                    //设置窗口大小
    this.setLocationRelativeTo(null);               //设置窗口居中
    this.setResizable(false);                       //设置窗口大小不可改变
    this.setTitle("大鱼吃小鱼");                     //设置窗口标题
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);   //设置窗口按钮

    //添加鼠标监听事件
    this.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getButton() == 1 && state == 0) {
                state = 1;
                repaint();
            }
        }
    });

    //背景图片重复使用,需要重复调用repaint方法
    while (true) {
        repaint();
        Thread.sleep(40);
    }
}

@Override
public void paint(Graphics g) {
    //懒加载模式初始化对象
    offScreenImage = createImage(width, height);
    Graphics gImage = offScreenImage.getGraphics();     //获取图片对应的画笔对象

    switch (state) {
        case 0:
            //把组件重新绘制到主窗口中
            gImage.drawImage(GameUtils.bgimg, 0, 0, null);
            //为启动页面添加文字
            gImage.setColor(Color.pink);
            gImage.setFont(new Font("仿宋", Font.BOLD, 60));
            gImage.drawString("请点击开始游戏", 500, 500);
            break;
        case 1:
            bg.paintSelf(gImage);
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        default:
            break;
    }

    //将绘制好的图片一次性绘制到主窗口中
    g.drawImage(offScreenImage, 0, 0, null);
}

}


### 7 - 敌方第一条小雨的添加


新建敌方鱼的父类 **Enamy**,编写左敌方鱼类 **Enamy\_1\_L** 继承父类



import java.awt.*;

public class Enamy {
//定义图片
Image img;

//定义物体坐标
int x;
int y;
int width;
int height;

//移动速度
int speed;

//方向
int dir = 1;

//敌方鱼的类型、分值
int type;
int count;

//绘制自身方法
public void paintSelf(Graphics g) {
    g.drawImage(img, 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 = -

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值