You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.8 KiB
108 lines
2.8 KiB
package com.black.play.listener;
|
|
|
|
import com.black.play.component.SnakeWindow;
|
|
import com.black.play.constant.AppConstant;
|
|
import com.black.play.entity.Direction;
|
|
import com.black.play.entity.Snake;
|
|
|
|
import java.awt.event.KeyAdapter;
|
|
import java.awt.event.KeyEvent;
|
|
|
|
/**
|
|
* 主界面全局监听 snake
|
|
*
|
|
* @author ylx
|
|
*/
|
|
public class SnakeListener extends KeyAdapter {
|
|
// 与SnakeWindow持有同一Snake引用
|
|
private final Snake snake;
|
|
|
|
public SnakeListener(Snake snake) {
|
|
this.snake = snake;
|
|
}
|
|
|
|
/**
|
|
* 键盘按键监听
|
|
*
|
|
* @param e 按键事件
|
|
*/
|
|
@Override
|
|
public void keyPressed(KeyEvent e) {
|
|
int keyCode = e.getKeyCode();
|
|
switch (keyCode) {
|
|
case KeyEvent.VK_UP:
|
|
case KeyEvent.VK_W:
|
|
handleDirection(Direction.UP);
|
|
break;
|
|
case KeyEvent.VK_DOWN:
|
|
case KeyEvent.VK_S:
|
|
handleDirection(Direction.DOWN);
|
|
break;
|
|
case KeyEvent.VK_LEFT:
|
|
case KeyEvent.VK_A:
|
|
handleDirection(Direction.LEFT);
|
|
break;
|
|
case KeyEvent.VK_RIGHT:
|
|
case KeyEvent.VK_D:
|
|
handleDirection(Direction.RIGHT);
|
|
break;
|
|
case KeyEvent.VK_ESCAPE:
|
|
handleEscape();
|
|
break;
|
|
case KeyEvent.VK_SPACE:
|
|
handleSpace();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void handleDirection(Direction direction) {
|
|
SnakeWindow snakeWindow = SnakeWindow.getInstance();
|
|
if (!AppConstant.GAME.equals(snakeWindow.getActiveCard())) {
|
|
return;
|
|
}
|
|
snake.changeDirection(direction);
|
|
}
|
|
|
|
/**
|
|
* 空格
|
|
* 游戏→暂停
|
|
* 暂停→游戏
|
|
* 菜单→开始
|
|
*/
|
|
private void handleSpace() {
|
|
SnakeWindow snakeWindow = SnakeWindow.getInstance();
|
|
String activeCard = snakeWindow.getActiveCard();
|
|
switch (activeCard) {
|
|
case AppConstant.GAME:
|
|
snakeWindow.pauseGame();
|
|
break;
|
|
case AppConstant.PAUSE:
|
|
snakeWindow.continueGame();
|
|
break;
|
|
case AppConstant.MENU:
|
|
snakeWindow.startGame();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Esc
|
|
* 菜单→退出
|
|
* 暂停→退出
|
|
* 游戏→暂停
|
|
*/
|
|
private void handleEscape() {
|
|
SnakeWindow snakeWindow = SnakeWindow.getInstance();
|
|
String activeCard = snakeWindow.getActiveCard();
|
|
switch (activeCard) {
|
|
case AppConstant.GAME:
|
|
snakeWindow.pauseGame();
|
|
break;
|
|
case AppConstant.PAUSE:
|
|
case AppConstant.MENU:
|
|
System.exit(0);
|
|
break;
|
|
}
|
|
}
|
|
}
|