JREGC

Главная | Регистрация | Вход Приветствую Вас Инопланетяне | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: wawe  
Форум » PROGRAMMING CATEGORY » Уроки LWJGL » LWJGL Основы 2 - ввод
LWJGL Основы 2 - ввод
waweДата: Вторник, 07.08.2012, 14:31 | Сообщение # 1
Просто человек...
Группа: Администраторы
Сообщений: 50
Награды: 3
Статус: Offline
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();
     }
}
 
Форум » PROGRAMMING CATEGORY » Уроки LWJGL » LWJGL Основы 2 - ввод
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2024
Используются технологии uCoz