最近正在写一个小练习,java贪吃蛇的项目。其中,蛇会移动,蛇每次移动的过程中,都会往自己的监听者发个消息,然后监听者会做出相应的回应。
其中需要先定义一个监听器接口,如下:
package com.skn.listener;
public interface SnakeListener {
public void snakeMove();
}
其中,定义了snakeMove的接口,表示实现了监听器接口的实现类需要覆盖这个方法,这个方法是针对蛇移动的时候,监听者会调用这个方法。
接下来,蛇是事件源,我们需要在蛇中定义添加监听器的方法,蛇类如下:
package com.skn.entities;
import java.util.ArrayList;
import java.util.List;
import com.skn.listener.SnakeListener;
public class Snake {
<span style="color:#FF0000;"> // 定义蛇的监听器,当蛇有动作的时候,可以被实现了监听器的类监听到,然后做出动作
private List<SnakeListener> snakeListeners = new ArrayList<SnakeListener>();
public void addListener(SnakeListener snakeListener) {
snakeListeners.add(snakeListener);
}
</span>
/**
* @author shikenian
* @param snakeListener
* 实现了蛇监听器的子类
* @return 删除监听器的结果
*/
public boolean removeListener(SnakeListener snakeListener) {
if (snakeListeners.contains(snakeListener)) {
snakeListeners.remove(snakeListener);
}
return false;
}
// 显示自己
public void drawMe() {
System.out.println("snake drawme");
}
public void changeDirection() {
System.out.println("snake change direction");
}
public void move() {
System.out.println("snake move");
Thread moveThread = new Thread(new snakeDriver());
moveThread.setName("moveThread");
moveThread.run();
}
class snakeDriver implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
<span style="color:#FF0000;">for (SnakeListener snakeListener : snakeListeners) {
snakeListener.snakeMove();
}</span>
}
}
}
}
在飘红的地方分别定义了添加监听器的代码对监听者发送消息的代码。
接下来看我们的监听者代码是如何定义的
package com.skn.controller;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import com.skn.entities.Snake;
import com.skn.listener.SnakeListener;
public class Controller extends KeyAdapter implements SnakeListener {
private Snake snake;
public void setSnake(Snake snake) {
this.snake = snake;
}
// 改变蛇的方向
@Override
public void keyPressed(KeyEvent e) {
snake.changeDirection();
}
// 改变蛇的方向
@Override
public void keyReleased(KeyEvent e) {
snake.changeDirection();
}
<span style="color:#FF0000;">@Override
public void snakeMove() {
snake.drawMe();
}</span>
// 游戏开始
public void gameStart() {
snake.move();
}
}
上面代码的飘红的部分就是当蛇移动的时候,实现了蛇移动方法的监听器会调用这个snakeMove方法,当调用这个方法的时候,蛇会进行自我刷新,重新显示出新的位置。