既有适合小白学习的零基础资料,也有适合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 = -