LWJGL обрабатывает собственный ввод со своими классами Keyboard и Mouse. Что бы обновить Keyboard и Mouse классы должны быть опрошены. Это происходит автоматически, когда вы вызываете метод Display.update() поэтому метод poll() в этих классах не нужно вызывать вручную.
Мышь
Позиция мыши на Display может быть получена вызовом следующих методов:
Code
int x = Mouse.getX(); // возвращает X координату на Display.
int y = Mouse.getY(); // возвращает Y координату на Display.
Позиция мыши (x,y) находится в верхнем левом углу Display (в традиционном для OpenGL стиле).
Метод Mouse.isButtonDown(int button); возвращает true если кнопка мыши нажата и false если нет. Кнопки мыши нумеруются от 0 до buttonCount.
Code
boolean leftButtonDown = Mouse.isButtonDown(0); // левая кнопка мыши нажата.
boolean rightButtonDown = Mouse.isButtonDown(1); // правая кнопка мыши нажата.
Клавиатура
Метод клавиатуры Keyboard.isKeyDown(int key) возвращает true если соответствующая клавиша нажата и false если нет. Полный список ключей клавиатуры можно найти здесь
Code
boolean keyDown = Keyboard.isKeyDown(Keyboard.KEY_X); //нажатие клавиши x.
boolean keyDown = Keyboard.isKeyDown(Keyboard.KEY_Q); //нажатие клавиши q и так далее.
Буфер событий
Использование методов isKeyDown(); или isButtonDown(); могут неплохо работать, но с ними возможно пропустить нажатие клавиши, если не сделать опрос достаточно быстрым.
Для решения этой проблеммы, можно использовать буфер событий. Этот буфер содержит все события полученные от клавиатуры и экранных кнопок полученных от Display. События в буфере доступны через методы getEvent*();.
Метод next(); используется для прокручивания буфера событий. Каждый раз при вызове метода next(); он выбирает следующее событие в буфере как событие key/button и как только все события keys/buttons будут прокручены он вернет false.
На пример буфер клавиатуры можно прокручивать так:
Code
while (Keyboard.next()) {
// получение события клавиатуры
}
Метод Keyboard.getEventKey(); возвращает клавишу, которая сгенерировала событие.
Code
//проверяем, нажата ли клавиша A.
if (Keyboard.getEventKey() == Keyboard.KEY_A) {
//вызов функции.
System.out.println("A Key Event");
}
Метод Keyboard.getEventState(); возвращает true если клавиша события нажата и false если она была отпущена.
Используя оба метода можно определить какая клавиша сгенерировала событие и была она нажата или отпущена.
Code
//проверяем, нажата ли клавиша A.
if (Keyboard.getEventKey() == Keyboard.KEY_A) {
if (Keyboard.getEventKeyState()) {
//вызов функции.
System.out.println("A Key Pressed");
}
//или...
else {
System.out.println("A Key Released");
}
}
Пример ниже перебирает все события в буфере и проверяет все события в нем на событие клавиши A.
Code
while (Keyboard.next()) {
if (Keyboard.getEventKeyState()) {
if (Keyboard.getEventKey() == Keyboard.KEY_A) {
System.out.println("A Key Pressed");
}
}
else {
if (Keyboard.getEventKey() == Keyboard.KEY_A) {
System.out.println("A Key Released");
}
}
}
Полный код:
Code
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class InputExample {
public void start() {
try {
Display.setDisplayMode(new DisplayMode(800, 600));
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
System.exit(0);
}
// init OpenGL here
while (!Display.isCloseRequested()) {
// render OpenGL here
pollInput();
Display.update();
}
Display.destroy();
}
public void pollInput() {
if (Mouse.isButtonDown(0)) {
int x = Mouse.getX();
int y = Mouse.getY();
System.out.println("MOUSE DOWN @ X: " + x + " Y: " + y);
}
if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
System.out.println("SPACE KEY IS DOWN");
}
while (Keyboard.next()) {
if (Keyboard.getEventKeyState()) {
if (Keyboard.getEventKey() == Keyboard.KEY_A) {
System.out.println("A Key Pressed");
}
if (Keyboard.getEventKey() == Keyboard.KEY_S) {
System.out.println("S Key Pressed");
}
if (Keyboard.getEventKey() == Keyboard.KEY_D) {
System.out.println("D Key Pressed");
}
} else {
if (Keyboard.getEventKey() == Keyboard.KEY_A) {
System.out.println("A Key Released");
}
if (Keyboard.getEventKey() == Keyboard.KEY_S) {
System.out.println("S Key Released");
}
if (Keyboard.getEventKey() == Keyboard.KEY_D) {
System.out.println("D Key Released");
}
}
}
}
public static void main(String[] argv) {
InputExample inputExample = new InputExample();
inputExample.start();
}
}