Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Input 文本编辑器的键盘输入_Input_Sdl_Sdl 2 - Fatal编程技术网

Input 文本编辑器的键盘输入

Input 文本编辑器的键盘输入,input,sdl,sdl-2,Input,Sdl,Sdl 2,我正在制作一个文本编辑器,通过SDL2使用OpenGL进行渲染。我使用SDL_K switch语句获取键盘输入: if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE) { should_run = 0; break; } else if (event.type == SDL_KEYDOWN) { switch (event.key.keysym.s

我正在制作一个文本编辑器,通过SDL2使用OpenGL进行渲染。我使用SDL_K switch语句获取键盘输入:

if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE) {
    should_run = 0;
    break;
}
else if (event.type == SDL_KEYDOWN)
{
    switch (event.key.keysym.sym)
    {
        case SDLK_a:
        add_character(&test_element, 'a');
        break;

        case SDLK_b:
        add_character(&test_element, 'b');
        break;

        case SDLK_c:
        add_character(&test_element, 'c');
        break;

        case SDLK_d:
        add_character(&test_element, 'd');
        break;

        case SDLK_LEFT:
        move_cursor(&test_element, -1);
        break;

        case SDLK_RIGHT:
        move_cursor(&test_element, 1);
        break;

    }
}

对于整个键盘,我将有两个写很多开关盒。有更好的方法吗?

是的,有更好的方法。使用,它将为用户键入的内容提供UTF-8表示形式。

好的,我查看了SDLKey值:

它们实际上是各自字符的ascii值,因此我可以将event.key.keysim.sim直接输入到我的add_character函数中,如果我在上一帧中按下左shift键,则调整为-32:

int kbshift = 0;
for (should_run = 1; should_run; ) {

    if (timer_diff > FRAME_TIME){
        timer_start = clock();

        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE) {
                should_run = 0;
                break;
            }
            else if (event.type == SDL_KEYDOWN)
            {
                if (event.key.keysym.sym >= 32 && event.key.keysym.sym <= 127)
                {
                    if (kbshift)
                        add_character(&test_element, event.key.keysym.sym - 32);
                    else
                        add_character(&test_element, event.key.keysym.sym);
                }
                switch (event.key.keysym.sym)
                {
                    case SDLK_LSHIFT:
                    kbshift = 1;
                    break;

                    case SDLK_LEFT:
                    move_cursor(&test_element, -1);
                    break;

                    case SDLK_RIGHT:
                    move_cursor(&test_element, 1);
                    break;

                }
            }
            else if (event.type == SDL_KEYUP)
            {
                switch (event.key.keysym.sym)
                {
                    case SDLK_LSHIFT:
                    kbshift = 0;
                    break;
                }
            }
        }

        Update();
    }

    timer_end = clock();
    timer_diff = ((double) (timer_end - timer_start)) / CLOCKS_PER_SEC;
}
int-kbshift=0;
for(should_run=1;should_run;){
如果(计时器差异>帧时间){
计时器启动=时钟();
SDL_事件;
while(SDL_事件和事件)){
if(event.type==SDL\u WINDOWEVENT&&event.window.event==SDL\u WINDOWEVENT\u CLOSE){
应该运行=0;
打破
}
else if(event.type==SDL\u KEYDOWN)
{

如果在相关注释中(event.key.keysym.sym>=32&&event.key.keysym.sym Big'ole
std::map
of
SDLK.*
enum values to
std::function
s:),您应该标记一种语言并定义“better”。@genpfault好的,我会尝试一下,谢谢