Snake - 按键响应时间慢

我做了一个蛇游戏(通过尝试遵循 youtuber 的代码),方向由 WASD 控制。但是,当我按下其中一个键时,什么也没有发生。如果我按住它,它会改变方向,但是会有很大的延迟,可能超过一秒钟。我该如何解决?我查看了我的代码并将其与我多次遵循的 youtube 代码进行了比较,但似乎仍然看不出问题所在。这是我第一次制作游戏,所以我对此很陌生。


鸿蒙传说
浏览 81回答 2
2回答

慕姐4208626

我发现您的代码与教程中的代码不同。if (!moved)     return;switch (event.getCode()) {     .     .     .}moved = false;在您的代码中,缺少 if(!moved) 之后的 return 语句。我试图将它添加到我的代码中,然后它对我有用。希望这可以解决您的问题。干杯马耳他

白猪掌柜的

问题是每次KeyFrame触发时,您都会重置moved标志。这需要用户在帧之间触发至少 2 个KEY_PRESSED事件才能获得改变的方向。假设您想阻止用户在第一帧之前改变方向,您应该删除if条件中的否定。(根据您尝试使用标志实现的目标,您可能需要不同的修复)。scene.setOnKeyPressed(event -> {&nbsp; &nbsp; if (moved) {&nbsp; &nbsp; &nbsp; &nbsp; switch (event.getCode()) {&nbsp; &nbsp; &nbsp; &nbsp; case W:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (direction != Direction.DOWN)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; direction = Direction.UP;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case S:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (direction != Direction.UP)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; direction = Direction.DOWN;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case A:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (direction != Direction.RIGHT)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; direction = Direction.LEFT;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case D:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (direction != Direction.LEFT)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; direction = Direction.RIGHT;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }});此外,您可以通过使用 aMap并向Direction枚举添加属性来改进代码的一些方面。public enum Direction {&nbsp; &nbsp; UP(0, -1), RIGHT(1, 0), DOWN(0, 1), LEFT(-1, 0);&nbsp; &nbsp; private final int dx;&nbsp; &nbsp; private final int dy;&nbsp; &nbsp; private Direction(int dx, int dy) {&nbsp; &nbsp; &nbsp; &nbsp; this.dx = dx;&nbsp; &nbsp; &nbsp; &nbsp; this.dy = dy;&nbsp; &nbsp; }&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* Tests, if 2 directions are parallel (i.e. both either on the x or the y axis).<br>&nbsp; &nbsp; &nbsp;* Note: Depends on the order of the enum constants&nbsp; &nbsp; &nbsp;* @param other the direction to compare with&nbsp; &nbsp; &nbsp;* @return true, if the directions are parallel, false otherwise&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public boolean isParallel(Direction other) {&nbsp; &nbsp; &nbsp; &nbsp; return ((ordinal() - other.ordinal()) & 1) == 0;&nbsp; &nbsp; }}在里面KeyFrame...double tailX = tail.getTranslateX();double tailY = tail.getTranslateY();Node head = snake.get(0);tail.setTranslateX(head.getTranslateX() + BLOCK_SIZE * direction.dx);tail.setTranslateY(head.getTranslateY() + BLOCK_SIZE * direction.dy);moved = true;...final Map<KeyCode, Direction> keyMapping = new EnumMap<>(KeyCode.class);keyMapping.put(KeyCode.W, Direction.UP);keyMapping.put(KeyCode.S, Direction.DOWN);keyMapping.put(KeyCode.A, Direction.LEFT);keyMapping.put(KeyCode.D, Direction.RIGHT);Scene scene = new Scene(createContent());scene.setOnKeyPressed(event -> {&nbsp; &nbsp; if (moved) {&nbsp; &nbsp; &nbsp; &nbsp; Direction newDirection = keyMapping.get(event.getCode());&nbsp; &nbsp; &nbsp; &nbsp; if (newDirection != null && !direction.isParallel(newDirection)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; direction = newDirection;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java