8.1 贪吃蛇界面绘制
一个游戏由哪几个部分组成呢?
简单来说,主要就两部分:图形界面 和 逻辑(流程控制)
- 图形界面:
- 首先就是游戏的布局,你可以理解为 一个 二维的 表格,我们会将图形画进去!
- 然后在时间的概念下,每秒就刷新 多少次。这就是我们所说的 “帧数”!无论是动画,还是游戏,帧数是使它们能动起来的原因。帧数越高,显示的动画就越流畅!
平时的 30fps、60fps 指的都是 一秒内 刷新画面的次数 是多少!(连起来就是动画,拆开来就是静态显示给你的图像)
- 逻辑
- 我们的所有逻辑,都是 JavaSE 学过的流程控制语句,和自我培养的 编程思维。
- 这里我们要 使用 一个叫做 Timer定时器(或者我们管它就 “时钟”),来进行 画面的刷新(实现帧数),还需要用 到 键盘监听(KeyListener)
8.1.1 设计每个元素点的大小 和 创建主程序窗口!
- 设计每个元素点的大小为 25 像素
- 整体面板为 900x720 像素大小(设定窗体大小为 916x728 即可)
- 然后创建一个 JPanel 面板,直接添加到窗体上,JPanel 会自适应填满整个窗体!(默认布局就是尽量的填充)
- 创建 Data 图片素材类
package com.muquanyu.snake;import javax.swing.*;
import java.net.URL;public class Data {
public static URL headerURL = Data.class.getResource("/statics/header.png");public static ImageIcon header = new ImageIcon(headerURL);public static URL upURL = Data.class.getResource("/statics/up.png");public static URL downURL = Data.class.getResource("/statics/down.png");public static URL leftURL = Data.class.getResource("/statics/left.png");public static URL rightURL = Data.class.getResource("/statics/right.png");public static URL foodURL = Data.class.getResource("/statics/food.png");public static URL bodyURL = Data.class.getResource("/statics/body.png");public static ImageIcon up = new ImageIcon(upURL);public static ImageIcon down = new ImageIcon(downURL);public static ImageIcon left = new ImageIcon(leftURL);public static ImageIcon right = new ImageIcon(rightURL);public static ImageIcon food = new ImageIcon(foodURL);public static ImageIcon body = new ImageIcon(bodyURL);}
用 class.getReSource 获取到 URL 路径,然后通过 new 一个 ImageIcon 图片图标的对象,来进行图片的存储!
- 创建 GamePanel 类
面板里面有个方法 叫做 paintComponet(),它是Swing 用来绘制窗体的 组件的。仅仅只是用来绘制 窗体内的组件,而不绘制 其它的东西。
Swing中的paint方法被调用时,paintComponent、paintBorder、 paintChildren 这三个方法也会被按顺序调用,之所以要按这个顺序调用是为了保证子组件能正确地显示在目前这个组件之上。
所以我们说一般在使用 Swing 的时候,都是用 paintComponet 来进行 画画的,而不是 Paint(因为Paint涉及的东西太多了。)并且 Swing 只要涉及到 Paint 的方法,都不要 把 super 方法的调用删掉。(否则可能会发生各种奇怪的事情!)
AWT 里的 paint 是可以随便重写的,不会对 本身的任何东西造成影响。
package com.muquanyu.snake;import javax.swing.*;
import java.awt.*;public class GamePanel extends JPanel {
//绘制面板,我们游戏中的所有东西,都是用画笔来 画@Overridepublic void paintComponent(Graphics g) {
//清屏,不会出现闪烁。super.paintComponent(g);//绘制静态的面板this.setBackground(Color.BLACK);//第一个参数是画到哪个设备上,那肯定是我们 创建的 面板上呀!Data.header.paintIcon(this, g, 25, 11);//画游戏区域g.fillRect(25,75,850,600);}}
通过 g这个对象,我们就可以进行绘画了。先填充背景颜色,然后 绘画 游戏区域 g.fillRect(25,75,850,600);(画个矩形,不就相当于 游戏区域了吗 ~ ~)。
- 主程序搭建
package com.muquanyu.snake;import javax.swing.*;public class StartGame {
public static void main(String[] args) {
JFrame jFrame = new JFrame("图形界面的贪吃蛇");//JFrame 窗体的大小会有差异 因为 还有窗体边框的大小 也被算了进去,所以 900x720 应该是 916x728 这个要自己算jFrame.setBounds(10,10,916,728);jFrame.setResizable(false);//窗口大小固定jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);jFrame.setVisible(true);GamePanel gamePanel = new GamePanel();jFrame.add(gamePanel);}
}