①初识实践
帧:工夫片足够小=》就是动画,1秒30帧。连起来是动画,拆开就是动态的图片!
键盘监听
定时器Timer
②游戏开发思路
(定义数据,画上面板,监听事件(键盘/事件))
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,判断状态后将提醒文字画上面板!
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);}}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.
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("statics/left.png");public static URL rightURL=Data.class.getResource("statics/right.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);}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.
package com.xiao.lesson07_game;import javax.swing.;import java.awt.;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Random;//游戏面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {
//定义小蛇的数据结构int length; //长度int[] snakeX=new int[600]; //x坐标 25*25int[] snakeY=new int[500]; //y坐标 25*25String fx; //初始方向//食物的坐标(随机!)int foodX; //失常食物int foodY;Random random=new Random();//随机int score; //问题boolean isStart=false;// 游戏以后状态:开始/进行,默认进行boolean isFail=false; //游戏失败状态//定时器,以毫秒为单位Timer timer=new Timer(100,this); //100ms执行一次//结构器public GamePanel() { init(); //取得焦点和键盘监听 this.setFocusable(true); //取得焦点事件 this.addKeyListener(this); //取得键盘监听器 timer.start();//游戏一开始定时器就启动 //食物坐标得在游戏界面,小蛇能力吃到! foodX=25+25*random.nextInt(34); foodY=75+25*random.nextInt(24); score=0;}//小蛇初始化办法public void init(){ length=3; snakeX[0]=100; snakeY[0]=100; //脑袋坐标 snakeX[1]=75; snakeY[1]=100; //第一个身材坐标 snakeX[2]=50; snakeY[2]=100; //第二个身材坐标 fx="R"; //初始方向向右 }//绘制面板,游戏中的所有货色,都是用这支画笔来画!@Overrideprotected void paintComponent(Graphics g) { super.paintComponent(g); //清屏 //绘制动态的面板 this.setBackground(Color.WHITE); Data.header.paintIcon(this, g, 25, 11);//画上头部广告栏 g.fillRect(25, 75, 850, 600); //画矩形=》游戏界面 //画积分 g.setColor(Color.WHITE); g.setFont(new Font("微软雅黑",Font.BOLD,18)); g.drawString("长度:"+length,775,30); g.drawString("分数:"+score,775,50); //画食物 Data.food.paintIcon(this,g,foodX,foodY); //把小蛇画下来,得判断初始方向! if (fx.equals("R")) { Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);//蛇头初始化向右 } else if (fx.equals("L")) { Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);//蛇头初始化向右 } else if (fx.equals("U")) { Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);//蛇头初始化向右 } else if (fx.equals("D")) { Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);//蛇头初始化向右 } for (int i = 1; i < length; i++) { Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);//身材 } //游戏状态 if(isStart==false){ g.setColor(Color.WHITE);//设置画笔色彩 g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体 g.drawString("按下空格键开始游戏!",250,380); //写游戏提醒 } if(isFail){ g.setColor(Color.WHITE);//设置画笔色彩 g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体 g.drawString("Score:"+score,230,330); score=0; g.setColor(Color.RED);//设置画笔色彩 g.drawString("失败,按下空格键从新开始!",230,380); //写游戏提醒 }}//键盘监听事件:键盘按压,管制游戏开始、进行@Overridepublic void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); //取得键盘按键是哪个 if(keyCode==KeyEvent.VK_SPACE){ if(isFail){ //从新开始 isFail=false; init(); }else{ isStart=!isStart; //取反 } repaint(); } //小蛇挪动,上下左右 if(keyCode==KeyEvent.VK_UP){ fx="U"; }else if(keyCode==KeyEvent.VK_DOWN){ fx="D"; }else if(keyCode==KeyEvent.VK_LEFT){ fx="L"; }else if(keyCode==KeyEvent.VK_RIGHT){ fx="R"; }}@Overridepublic void keyReleased(KeyEvent e) { }@Overridepublic void keyTyped(KeyEvent e) { }//事件监听--须要通过固定事件来刷新,1s=10次,Timer@Overridepublic void actionPerformed(ActionEvent e) { //如果游戏是开始状态,就让小蛇动起来 if(isStart && isFail==false) { //吃食物,坐标重合 if((snakeX[0]==foodX && snakeY[0]==foodY)){ length++; //小蛇长长了! score+=10; //食物再次随机生成! foodX = 25 + 25 * random.nextInt(34); foodY = 75 + 25 * random.nextInt(24); } //身材挪动不必变!都一样的 for (int i = length - 1; i > 0; i--) { //向前挪动一节,后一节变为前一节的地位 snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } //走向 if (fx.equals("R")) { //右移 snakeX[0] = snakeX[0] + 25; if (snakeX[0] > 850) { snakeX[0] = 25; } //边界判断 } else if (fx.equals("L")) { //左移 snakeX[0] = snakeX[0] - 25; if (snakeX[0] < 25) { snakeX[0] = 850; } } else if (fx.equals("U")) { //上移 snakeY[0] = snakeY[0] - 25; if (snakeY[0] < 75) { snakeY[0] = 650; } } else if (fx.equals("D")) { //下移 snakeY[0] = snakeY[0] + 25; if (snakeY[0] > 650) { snakeY[0] = 75; } } //失败断定:撞到本人 for (int i = 1; i < length; i++) { if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){ isFail=true; } } repaint();//重画页面 } timer.start();
13、打包公布
点击Project Structure–>Artifaxts–>”+“号–>抉择JAR–>from modules with dependencies,抉择main办法函数,例如在www.cungun.com能够启动类,apply即可。
抉择build–>build Artifacts–>build,期待即可在我的项目的out目录下看到artifacts目录,外面就是生成的jar包,能够发给敌人玩了
命令行关上:java -jar gui-study.jar,即可开始贪吃蛇游戏!
14、优化(未实现!)
level:越到前面速度越快!依据level设定定时器delay
撞墙断定
小蛇不能回头
食物模式,分数或长度增长不一样
界面优化
游戏联机(网络编程)