学习链接:狂神说Java–1小时开发贪吃蛇小游戏
①初识理论
- 帧:时间片足够小=》就是动画,1秒30帧。连起来是动画,拆开就是静态的图片!
- 键盘监听
- 定时器Timer
- 游戏图片素材:GUI之贪吃蛇-KuangStudy-江湖
②游戏开发思路
-
(定义数据,画上面板,监听事件(键盘/事件))
-
1、首先一个游戏主启动类StartGame类,里面放一个JFrame窗口及其大小位置设置,关闭设置,这里设置窗口大小不可变,以防拉伸导致游戏图标变形,相关的具体操作都在相应类中进行!
-
2、正常的游戏界面应在面板上!因此定义一个GamePanel类进行操作,首先是重写了painComponent(Graphics p)方法,游戏中的所有东西都是用这支画笔来画!首先是绘制静态的面板,设置面板颜色为白色。
-
3、接着把游戏图片素材放入static字典中,放入游戏开发包下,定义一个Data类,在其中获取存放游戏图片的地址,并把它们变为图标,接着在花瓣上画上头部广告栏、矩形(默认黑色)的游戏界面。
-
4、绘制静态的的小蛇,在GamePanel类中定义小蛇的数据结构!
- int length; =>蛇的长度
- int[] snakeX=new int[600]; => 蛇的位置的 x 坐标25*25
- int[] snakeY=new int[500]; => 蛇的位置的 y 坐标25*25
- String fx; => 初始方向
然后写初始化方法init()方法初始化静态小蛇的长度、位置及其初始方向,再在构造器中调用init()方法,接着把小蛇画入面板中!(要判断头的方向!),身体用for循环画。
- 5、游戏当前状态inStart:开始/停止,空格键控制!初始设为停止false,判断状态后将提示文字画上面板!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wzjij3il-1622175043668)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210528090620469.png)]
-
6、空格键控制游戏开始与停止!设置键盘监听!直接在GamePanel类中实现KeyListener接口!按下空格键–>状态取反,重画repaint(),再init()函数中设置焦点事件和添加键盘监听。
-
7、小蛇动起来,Timer定时器!在GamePanel类中实现ActionListener接口即可。游戏一开始就启动定时器!接着写出小蛇移动的位置坐标处理,上下左右移动,头部、身体坐标如何变化,最后repaint()重画页面。这样子小蛇可以自己动了。但我们需要通过键盘监听上下左右键来控制小蛇的移动!身体移动是一样的,我们只需要判断移动方向,把头的位置坐标找好就行!
-
8、小蛇吃食物长大啦~,定义食物的坐标并在init()中初始化
- int foodX;
- int foodY;
- Random random=new Random();
吃食物即是头部坐标和食物坐标重合,小蛇长度+1,再次生成随机的食物,吃完食物再画身体!
- 9、定义失败状态,默认是不失败,如果失败面板上需要出现文字提示,在面板上画即可。空格键可能是开始/停止游戏,也可能是失败后重新开始游戏,所以按下空格键得根据游戏失败装药isFail判断时开始/停止、还是重新初始开始游戏!如果游戏开始状态且没有失败,那么需要在走向后面加上失败判定:头部坐标和自己身体的任一坐标重合即为游戏失败,isfail=true! 此时会出现游戏失败提示,按下空格键是重新初始化开始游戏,而不是普通的暂停开始。
- 10、积分,定义数据,画上画板,监听:吃到食物分数+10
- 11、实现代码:
package com.xiao.lesson07_game;
import javax.swing.*;
//游戏的主启动类
public class StartGame {
public static void main(String[] args) {
JFrame frame = new JFrame("贪吃蛇");
//正常游戏界面应在面板上
frame.add(new GamePanel());
frame.setBounds(10,10,900,720);
frame.setResizable(false);//大小不可变
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
package com.xiao.lesson07_game;
import javax.swing.*;
import java.net.URL;
//数据中心
public class Data {
//相对路径“tx.jpg
//绝对路径:/ 相当于当前的项目
//头+身体+食物
public static URL headerURL=Data.class.getResource("statics/header.png");
public static ImageIcon header=new ImageIcon(headerURL);
public static URL bodyURL=Data.class.getResource("statics/body.png");
public static ImageIcon body=new ImageIcon(bodyURL);
public static URL foodURL=Data.class.getResource("statics/food.png");
public static ImageIcon food=new ImageIcon(foodURL);
//上下左右
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