GLFW:キーボード入力

本物のページはこちら→keyboard

Included page "glfw:keyboard" does not exist (create it now)

キーボード

キーボードと数値の関係はISO-8859準拠

普通のアルファベットキーの場合

glfwGetKey('A');//Ok
glfwGetKey('a');//NG

基本的に大文字で書けば、aとAを認識してくれる。
どうも、大文字小文字を区別しないようだ。

スイッチとしてのキー実装

コールバック関数としてのキーボードよりもちょっと面倒臭い。

static bool state=glfwGetKey('L');
        if(glfwGetKey('L')){
            if(state==false){
            state=true;
            }else{state=false;}
        }

戻り値

GLFW_PRESS=1GLFW_RELEASE=0
これって、MFCやDirectXと似てるかな。
aとAを区別してくれない代わりに、デフォルトでShiftなどのを認識してくれる。
今までのglutSpecialFuncとかglutGetModifiersが要らなくなったってことね。
そうすると、Shift押しながら○○を認識するコードを書くのは面倒くさくなるなぁ。

名前 詳細 数値
GLFW_KEY_SPACE Space 32
GLFW_KEY_ESC Escape 256+ 1
GLFW_KEY_Fn Function key n (n can be in the range 1..25) 256+ 3
GLFW_KEY_UP Cursor up 256+ 27
GLFW_KEY_DOWN Cursor down 256+28
GLFW_KEY_LEFT Cursor left 256+29
GLFW_KEY_RIGHT Cursor right 256+30
GLFW_KEY_LSHIFT Left shift key 256+31
GLFW_KEY_RSHIFT Right shift key 256+32
GLFW_KEY_LCTRL Left control key 256+33
GLFW_KEY_RCTRL Right control key 256+34
GLFW_KEY_LALT Left alternate function key 256+35
GLFW_KEY_RALT Right alternate function key 256+36
GLFW_KEY_LSUPER Left super key, WinKey, or command key 256+
GLFW_KEY_RSUPER Right super key, WinKey, or command key 256+
GLFW_KEY_TAB Tabulator 256+
GLFW_KEY_ENTER Enter 256+
GLFW_KEY_BACKSPACE Backspace 256+
GLFW_KEY_INSERT Insert 256+
GLFW_KEY_DEL Delete 256+
GLFW_KEY_PAGEUP Page up 256+
GLFW_KEY_PAGEDOWN Page down 256+
GLFW_KEY_HOME Home 256+
GLFW_KEY_END End 256+
GLFW_KEY_KP_n Keypad numeric key n (n can be in the range 0..9) 256+
GLFW_KEY_KP_DIVIDE Keypad divide () 256+
GLFW_KEY_KP_MULTIPLY Keypad multiply () 256+
GLFW_KEY_KP_SUBTRACT Keypad subtract () 256+
GLFW_KEY_KP_ADD Keypad add (+) 256+
GLFW_KEY_KP_DECIMAL Keypad decimal (. or ,) 256+
GLFW_KEY_KP_EQUAL Keypad equal (=) 256+
GLFW_KEY_KP_ENTER Keypad enter 256+
GLFW_KEY_KP_NUM_LOCK Keypad num lock 256+
GLFW_KEY_CAPS_LOCK Caps lock 256+
GLFW_KEY_SCROLL_LOCK Scroll lock 256+
GLFW_KEY_PAUSE Pause key 256+
GLFW_KEY_MENU Menu key 256+

サンプルコード

#include <stdlib.h>
#include <stdio.h>
#include <functional>
using namespace std;
#include <GL/glfw.h>
#include <GL/freeglut.h>
#pragma comment(lib,"GLFW.lib")
#pragma comment(lib, "opengl32.lib")
void CameraInit(int _w,int _h){
    glViewport (0, 0, (GLsizei) _w, (GLsizei) _h); 
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity (); 
    gluPerspective(30.0, (float)_w / (float)_h, 1.0, 100.0);
    glMatrixMode (GL_MODELVIEW);
}
void GLFWCALL reshape( int _w, int _h)
{
    CameraInit(_w,_h);
}
bool key() {
    static int count=0;
    if(glfwGetKey( GLFW_KEY_ENTER )){
        printf("%d回目のエンタキーです。\n",count);
        count++;
    }
    return 0;
}
void display(void)
{
    // clear the buffer
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // draw the figure
 
    // reset view matrix
    glLoadIdentity();
    glPushMatrix();
    glTranslatef(0.0,0.0,-5.0);
    glPointSize(10);
    glBegin(GL_POINTS);
 
    glColor3f(1.0,1.0,1.0);
    glVertex3f(0.0,0.0,0.0);
 
    glEnd();
    glPopMatrix();
 
    glfwSwapBuffers();
}
void mouse(){
    int mx,my;
    glfwGetMousePos(&mx,&my);
    printf("mouse=%d,%d\n",mx,my);
    if(glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT)){printf("左ボタン押した\n");}
 
}
 
int main( void )
{
    //Miffy m;
    glfwInit();
    glfwOpenWindow( 300,300, 0,0,0,0,0,0, GLFW_WINDOW );
    glfwSetWindowTitle("Miffy OpenGL");
    glfwSetWindowSizeCallback( reshape );
    glfwEnable( GLFW_STICKY_KEYS );
    //glfwEnable( GLFW_KEY_REPEAT );
    //glfwDisable( GLFW_MOUSE_CURSOR );//危険。。!
    while (glfwGetWindowParam(GLFW_OPENED))//ウィンドウが開いている場合
    {
 
        display();
        key();
        mouse();
    }
    // Close window and terminate GLFW
    glfwTerminate();
    // Exit program
    exit( EXIT_SUCCESS );
}

サポートサイト Wikidot.com