贪吃蛇小游戏的收获
1.图片大小、坐标值怎么解决?
图片统一大小,(图片:头部、身体、食物、广告栏),
坐标值和图片的大小有关
2.本游戏的制作流程包括哪些?有哪些要点?
流程:
1. 建立一个启动类
2. 建立一个游戏面板类,并在启动类中添加
3. 建立一个游戏数据类,在面板中使用
要点:
-
启动类(继承JFrame)中,只负责启动!即创建其它类对象或调用其它类方法
-
游戏面板类(继承JPanel),复写JPanel类的paintComponent方法,用该方法中的Graphics画笔来绘制我们的游戏界面
-
游戏面板类需要实现两个接口
-
KeyListener:用来监听我们键盘
但注要要记得开启("this"表示当前面板对象)
public GamePanel(){ //构造方法 init(); isStart=false; this.setFocusable(true); //获取焦点事件 this.addKeyListener(this); //添加键盘监听 timer.start(); isFail = false; }
-
ActionListener:用来使用定时器,定时刷新界面,才能实现画面动的感觉(定时器Timer要求实现的)
private Timer timer = new Timer(150,this);//1.new一个定时器,150毫秒刷新 public GamePanel(){ //2.在构造方法开启 init(); isStart=false; this.setFocusable(true); this.addKeyListener(this); timer.start(); isFail = false; } public void actionPerformed(ActionEvent e) {//3.执行定时操作,最后也要开启定时器 if(isStart && isFail == false){ if(foodX == snakeX[0] && foodY == snakeY[0]){ 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(dir.equals("R")){ snakeX[0] += 25; if(snakeX[0] > 850){ snakeX[0] = 25; } }else if(dir.equals("L")){ snakeX[0] -= 25; if(snakeX[0] < 25){ snakeX[0] = 850; } }else if(dir.equals("U")){ snakeY[0] -= 25; if(snakeY[0] < 75){ snakeY[0] = 650; } }else if(dir.equals("D")){ snakeY[0] += 25; if(snakeY[0] > 650){ snakeY[0] = 75; } } for (int i = 1; i < length; i++) { if(snakeX[i] == snakeX[0] && snakeY[i] == snakeY[0]){ isFail = true; } } repaint(); //数据改完重绘 } timer.start(); }
-
-
修改面板的数据时,一定要repaint()重绘一遍。