Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
melodicwing
0 / 0 / 0
Регистрация: 31.01.2014
Сообщений: 7
#1

SDL и задержка движения персонажа при зажатии клавиши - C++

05.02.2014, 03:32. Просмотров 1099. Ответов 5
Метки нет (Все метки)

Всем доброго времени суток.
Изучаю библиотеку SDL и возникла такая проблема: при зажатии клавиши (например, что бы персонаж шел в сторону), текстура персонажа сначала двигается на один шаг в нужном направлении, потом идет задержка порядка секунды и после нее начинается непрерывное движение. Можно ли как-то убрать эту задержку?
Вот как я отлавливаю нажатие клавиши:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
while (SDL_PollEvent(&event))
        {
            //Если нажали клавишу
            if (event.type == SDL_KEYDOWN)
            {
                switch (event.key.keysym.sym)
                {
                case SDLK_UP: draqon4ik.move(UP); break;
                case SDLK_RIGHT: draqon4ik.move(RIGHT); break;
                case SDLK_DOWN: draqon4ik.move(DOWN); break;
                case SDLK_LEFT: draqon4ik.move(LEFT); break;
                }
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2014, 03:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос SDL и задержка движения персонажа при зажатии клавиши (C++):

Падает FPS в игре на Ubuntu при зажатии клавиши - C++
Падает FPS в игре на Ubuntu при зажатии клавиши, даже если клавиша не описана в коде . Просто у меня там прыгает шарик отличный fps(все...

Отображение движения персонажа - C++
Когда на экране показывается какое то действие персонажа, например двигается рука. Чтобы это сделать делается видео или гифка? Как это...

Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2? - C++
В официальной доке как-то скомкано написано. При инициализации SDL TTF и при загрузке шрифта ошибок нет. Но текст на экране не...

SDL: Нарушение прав доступа при работе с рендером - C++
Есть следующее приложение: Programm.h #include <windows.h> #include <SDL.h> #include <iostream> #include <string> #pragma...

Залипание клавиши Win при зажатии клавиши Ctrl - Windows
Здравствуйте. Проблема следующая: в играх или при работе с некоторыми программами (к примеру, photoshop) при определенной зависимости...

Сделать так, чтобы и при зажатии клавиши фигура продвигалась всего на 15 пунктов - Turbo Pascal
пишу игры на паскале при нажатий клавиши "x" фигура продвигается на 15 пунктов все верно, но если зажать клавишу то фигура начинает...

5
egor2116
340 / 371 / 42
Регистрация: 20.01.2013
Сообщений: 1,130
05.02.2014, 14:17 #2
с SDL не знаком, но у меня вопрос ?
почему у вас обработка в цикле, это так в примерах по обработке событий показано ?
0
melodicwing
0 / 0 / 0
Регистрация: 31.01.2014
Сообщений: 7
05.02.2014, 15:01  [ТС] #3
Да, так показано в примерах.
К том же, если изменить while на if, то (по крайней мере внешне) ничего не поменяется. Задержка все так же есть.
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
05.02.2014, 15:37 #4
Вероятно тормаза из-за загрузки

C++
1
draqon4ik.move()
Какие тут действия происходят. (код??)
0
admsasha
19 / 19 / 4
Регистрация: 11.06.2011
Сообщений: 250
05.02.2014, 15:49 #5
SDL_KEYDOWN - реагирует на событие нажатие клавиши вниз. Если нажать в любом редакторе кнопку и удержать её, точно так же будет. Чтобы получить то, что вы хотите, можно проверять состояние нужной клавиши, через SDL_GetKeyState(NULL)
1
melodicwing
0 / 0 / 0
Регистрация: 31.01.2014
Сообщений: 7
06.02.2014, 11:09  [ТС] #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void DRAQON::move(int dir)
{
    //изменяем stop на false (для правильной отрисовки анимации)
    this->changeStop(false);
 
    //если меняем направление движения - сбрасываем кадр
    if (dir != this->dir) { this->frames = 0; this->reset = false; }
 
    //длина смещения
    int val = 3;
 
    //сохраняем направление
    this->dir = dir;
    
    switch (dir)
    {
    case UP:
        this->y -= val;
        if (this->y < 0) this->y = 0;
        break;
    case RIGHT:
        this->x += val;
        if (this->x+96 > 640) this->x = 640-96;
        break;
    case DOWN:
        this->y += val;
        if (this->y+96 > 480) this->y = 480-96;
        break;
    case LEFT:
        this->x -= val;
        if (this->x < 0) this->x = 0;
        break;
    }
}
Добавлено через 20 минут
Пока что сделал такой вариант. Задержка пропала, но есть "фальшивые срабатывания", когда зажимаешь в одну сторону, потом в другую (одновременно нажаты две клавиши), а потом отпускаешь первую клавишу, срабатывает SDL_KEYUP и на какой-то момент происходит задержка.
Спасибо за совет по поводу SDL_GetKeyState. Вечером попробую и отпишусь о результатах
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//Пока пользователь не захотел выйти
    while (quit == false)
    {
        //Если есть события для обработки
        while (SDL_PollEvent(&event))
        {
            //Если нажали клавишу
            if (event.type == SDL_KEYDOWN)
            {
                if (event.key.keysym.sym == SDLK_UP ||
                    event.key.keysym.sym == SDLK_RIGHT ||
                    event.key.keysym.sym == SDLK_DOWN ||
                    event.key.keysym.sym == SDLK_LEFT)
                    draqon4ik.changeStop(false);
            }
            if (event.type == SDL_KEYUP)
            {
                if (event.key.keysym.sym == SDLK_UP ||
                    event.key.keysym.sym == SDLK_RIGHT ||
                    event.key.keysym.sym == SDLK_DOWN ||
                    event.key.keysym.sym == SDLK_LEFT)
                    draqon4ik.changeStop(true);
            }
 
            //Если пользователь пытается закрыть приложение
            if (event.type == SDL_QUIT)
            {
                //Завершить программу
                quit = true;
            }
        }
 
        SDL_RenderClear(ren);
 
        //отрисовываем фон
        //...
 
        if (!draqon4ik.isStop())
            switch (event.key.keysym.sym)
            {
            case SDLK_UP: draqon4ik.move(UP); break;
            case SDLK_RIGHT: draqon4ik.move(RIGHT); break;
            case SDLK_DOWN: draqon4ik.move(DOWN); break;
            case SDLK_LEFT: draqon4ik.move(LEFT); break;
            }
 
        draqon4ik.draw(ren);
 
        //Обновить экран
        SDL_RenderPresent(ren);
    }
Добавлено через 18 часов 59 минут
Итого, вот конечный вариант, как у меня сейчас сделано:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    //Пока пользователь не захотел выйти
    while (quit == false)
    {
        //Если есть события для обработки
        while (SDL_PollEvent(&event))
        {
            //Если пользователь пытается закрыть приложение
            if (event.type == SDL_QUIT)
            {
                //Завершить программу
                quit = true;
            }
        }
 
        if (keys[SDL_SCANCODE_UP] || keys[SDL_SCANCODE_RIGHT] || keys[SDL_SCANCODE_DOWN] || keys[SDL_SCANCODE_LEFT])
        {
            draqon4ik.changeStop(false);
        }
        else draqon4ik.changeStop(true);
 
        SDL_RenderClear(ren);
 
        //отрисовываем фон
        //...
        
        if (!draqon4ik.isStop())
        {
            if (keys[SDL_SCANCODE_UP]) draqon4ik.move(UP);
            if (keys[SDL_SCANCODE_RIGHT]) draqon4ik.move(RIGHT);
            if (keys[SDL_SCANCODE_DOWN]) draqon4ik.move(DOWN);
            if (keys[SDL_SCANCODE_LEFT]) draqon4ik.move(LEFT);
        }
 
        draqon4ik.draw(ren);
 
        //Обновить экран
        SDL_RenderPresent(ren);
    }
и до этого в самом верху после инклюдов:
C++
1
const Uint8* keys = SDL_GetKeyboardState(NULL);
0
06.02.2014, 11:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2014, 11:09
Привет! Вот еще темы с ответами:

Настройка движения персонажа - ActionScript
Здравствуйте! У меня на монтажном столе в Macromedia Flash есть объекты Layer1 и Layer2 в них находится изображение человека (в Layer1 -...

Ошибка во время движения персонажа - ActionScript
Здравствуйте! Есть персонаж нарисованный в двух клипах(один стоит, второй идёт) объединил я их в один клип, сделал так чтобы персонаж ходил...

Разработать программу движения буквы Z по экрану при нажатии клавиши управления курсором - Assembler
Разработать программу движения буквы Z по экрану при нажатии клавиши управления курсором. При нажатии клавиш со стрелками буква ...

Задать перемещение экрана в зависимости от движения персонажа - ActionScript
Доброго времени суток ! Решили тут с другом сделать флешку вместе:) Так как в програмировании в Action Script мы не очень опытные... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru