2012年3月10日土曜日

LWJGL の基本 2 - 入力 (Mouse, Keyboard, Controller)

org.lwjgl.input.Mouseorg.lwjgl.input.Keyboardorg.lwjgl.input.Controller クラスおよびインターフェースは LWJGL の入力を司るクラスです。Mouse と Keyboard は一つしかインスタンスはないと仮定しているらしく、static なメソッドで操作します。Controller は org.lwjgl.input.Controllers からインスタンスを取得して使用します。
それぞれの入力状態は poll() メソッドで更新されます。poll() は Display.update() で自動的に呼ばれますので、その後に入力処理を書きます。
入力状態の処理には大きく分けて二つの方法があります。一つ目は、Mouse.isButtonDown(int index) のようにその時点での状態を取得する方法です。しかしこの方法では、poll() 同士の間で変化した状態を知ることはできません。このときは poll したイベントを舐めて処理します。ただ、MouseEvent や KeyEvent のようなクラスがあるのではなく、それぞれの static なイベント処理メソッドを呼んで処理するのが若干ダサイです。next() メソッドで次のイベントに移動し、getEvent*** メソッドでイベントの属性を取得します。
サンプル
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

/**
 * LWJGL のマウス入力のサンプル
 *
 * @author Yuki_M
 */
public class LWJGLInput1 {

    private static final DisplayMode DISPLAY_MODE = new DisplayMode(640, 480);

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        LWJGLInput1 main = new LWJGLInput1();
        main.start();
    }

    public void start() {
        try {
            Display.setDisplayMode(DISPLAY_MODE);
            Display.create();
        } catch (LWJGLException ex) {
            Logger.getLogger(LWJGLInput1.class.getName()).log(Level.SEVERE, null, ex);
            System.exit(0);
        }

        while (!Display.isCloseRequested()) {
            Display.update();
            pollEvents();
        }
        Display.destroy();
    }

    private void pollEvents() {
        if (Mouse.isButtonDown(0)) {
            int x = Mouse.getX();
            int y = Mouse.getY();
            System.out.println("Mouse Down: " + x + ", " + y);
        }
        while (Mouse.next()) {
            int dx = Mouse.getEventDX();
            int dy = Mouse.getEventDY();
            System.out.println("Mouse Move: " + dx + ", " + dy);
        }
    }
}