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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Как сделать правильный перехват ввода? http://www.cyberforum.ru/cpp-beginners/thread1089630.html
Доброго времени суток. Решил поделать еще что-то интересное. Вот есть идейка сделать что-то типа одной из функций, которые есть в puntoswitcher: в нем можно создать список слов, которые будут автоматически заменены сразу после ввода. Вопрос: как сделать правильный перехват ввода? что именно перехватывать? как это вообще реализовано? Спасибо!
C++ Как работает инкрементирование указателя? #include <iostream> #include <cctype> using namespace std; int main(){ char *p; char str="This Is A Test"; cout << "исходная строка: "<<str<<endl; p=str; while(*p){ //как работает указатель с данным циклом if (isupper(*p)) http://www.cyberforum.ru/cpp-beginners/thread1089601.html
Сокращение слов (например, "напряженность"- "напр-ть") C++
нужно чтобы вместо, к примеру, слово "напряженность" заменялось на "напр-ть". Я понял, что для этого нужно создать два txt-файла, с которых в одном будет изначальное слово, а в друг сокращенное, но реализовать код на C++ не получается. Заранее очень благодарен какой-либо помощи.
WDK7000 компиляция не завершается успешно C++
Доброго времени суток.Помогите с элементарной вещью) Установил windows driver kit 7000.Компилирую исходник драйвера через "windows xp>x86 checked build" , выдает warning в двух местах,но компилирует,драйвер выходит рабочий. Компилирую исходник драйвера через "windows xp>x86 free build" снова warning, и компиляция прекращается,- как я выяснил мешает ключ /WX - считать предупреждение...
C++ Объявить объединение из двух структур и структуру из двух объединений http://www.cyberforum.ru/cpp-beginners/thread1089579.html
Объявить объединение из двух структур и структуру из двух объединений. Заполнить значениями, вывести на экран.
C++ Отсортировать массив из структур по одному из полей структуры любым способом Отсортировать массив из структур по одному из полей структуры любым способом. подробнее

Показать сообщение отдельно
melodicwing
0 / 0 / 0
Регистрация: 31.01.2014
Сообщений: 7
06.02.2014, 11:09  [ТС]     SDL и задержка движения персонажа при зажатии клавиши
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);
 
Текущее время: 01:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru