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

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

Войти
Регистрация
Восстановить пароль
 
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
#1

SDL + C++ = Тормозит событие нажатия кнопки - C++

13.09.2013, 13:12. Просмотров 682. Ответов 6
Метки нет (Все метки)

С помощью SDL создается поверхность.
При нажатии на нее левой кнопкой мыши должно изменяться название окна программы,
но оно изменяется не после первого нажатия, а после 4 - 6, всегда по разному.
Почему так может быть?

A.h - объявление класса А:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include "SDL.h"
class A{
  public:
      A() : x(0), y(0), w(0), h(0) {}
      A(int xx, int yy, int ww, int hh)
                 : x(xx), y(yy), w(ww), h(hh) {
        o_rect.x = x;
        o_rect.y = y;
        o_rect.w = w;
        o_rect.h = h;
      }  
      virtual ~A() {}
      void buttonEvents();
  protected:
      SDL_Event o_event;      
  private:
      SDL_Rect o_rect;    
      int x, y, w, h;
};
A.cpp - определение класса A:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "A.h"
void A::buttonEvents() {    
    int x = o_event.button.x;
    int y = o_event.button.y;
 
    if(SDL_PollEvent(&o_event))
        if(o_event.type == SDL_MOUSEBUTTONDOWN)
           if(o_event.button.button == SDL_BUTTON_LEFT)
                if((x > o_rect.x) && (x < o_rect.x + o_rect.w) &&
                   (y > o_rect.y) && (y < o_rect.y + o_rect.h))
                    SDL_WM_SetCaption("Test event", NULL);   // Это то самое событие
}
Здесь вызывается метод buttonEvents(), который реагирует на нажатие клавиши:
C++
1
2
3
4
5
6
7
8
9
void C_Scenes::keyEvents() {    
    A o_button(0, 0, 960, 640);   // 960х640 - размеры окна
    int isCicleEnd = 0;
    while(isCicleEnd == 0)
        if(SDL_PollEvent(&o_event)) {
            o_button.buttonEvents();            
            SDL_Flip(screen); // функция обновления экрана, чтобы отобразить изменения
        }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2013, 13:12     SDL + C++ = Тормозит событие нажатия кнопки
Посмотрите здесь:

SDL ошибка на событии обработки нажатия кнопки мыши - C++
Не могу третий день разобраться. Использовал функцию SDL для обработки события нажатия левой кнопки мыши, но как только компилятор...

Эмуляция нажатия клавиш для SDL - C++
Столкнулся с такой проблемой что на эмуляцию нажатия клавиш, SDL не реагирует. Точнее DOSBox. Пробовал 2 метода (WINAPI), оба не подходят....

Имитация нажатия кнопки - C++
как программно сымитировать нажатие кнопки в программе нужно нажать кнопку PgUp а на клавиатуре ее нет как это можно сделать

Ожидание нажатия определенной кнопки - C++
Нужно чтобы при нажатии кнопки &quot;Enter&quot; происходило определенное действие. Подскажите как реализовать ожидание нажатия нужных кнопок,...

Обработка нажатия/отжатия кнопки на WinApi! - C++
Подскажите хоть каким образом отловить команду нажатия или отжатия клавиши! Как например с клавиатурой WM_KEYDOWN/WM_KEYUP! ...

Создание формы после нажатия кнопки - C++
Мне нужно сделать так, чтобы форма создавалась только после нажатия кнопки (именно создавалась, то есть у меня уже есть готовая форма,...

Почти While, или как делать действие до нажатия кнопки - C++
Доброго времени суток. Идея такова должен работать следующий код: SetCursorPos(x, y); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 14:59     SDL + C++ = Тормозит событие нажатия кнопки #2
Кода мало.
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
13.09.2013, 15:04  [ТС]     SDL + C++ = Тормозит событие нажатия кнопки #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Кода мало.
В смысле?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 15:20     SDL + C++ = Тормозит событие нажатия кнопки #4
Цитата Сообщение от dimakozyr Посмотреть сообщение
В смысле?
Чтобы разбираться.
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
13.09.2013, 15:30  [ТС]     SDL + C++ = Тормозит событие нажатия кнопки #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Чтобы разбираться
Хотел упростить, чтоб ничего лишнего не было. Привожу весь код и архив с программой

C_Buton.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include "SDL.h"
class C_Button {
  public:
      C_Button() : x(0), y(0), w(0), h(0) {}
      C_Button(int xx, int yy, int ww, int hh)
                 : x(xx), y(yy), w(ww), h(hh) {
        o_rect.x = x;
        o_rect.y = y;
        o_rect.w = w;
        o_rect.h = h;
      }   
      void buttonEvents();
  protected:
      SDL_Event o_event;      
  private:
      SDL_Rect o_rect;    
      int x, y, w, h;
};
C_Scenes.h
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
#pragma once
#include "SDL.h"
#include "SDL_image.h"
#include "C_Button.h"
class C_Scenes: protected C_Button {
  public:
      C_Scenes() : img_background_1(0),     img_background_2(0),
                   img_background_3(0),     img_beaver(0),
                   img_red_beaver(0),       img_button_continue(0),
                   img_button_mainMenu(0),  img_button_play(0),
                   img_button_playAgain(0), img_button_pause(0),
                   img_soundOff(0),         img_soundOn(0),
                   img_gameOver(0),         img_heart(0),
                   img_button_facebook(0),  img_button_twitter(0),
                   screen(0) {}
      void loadImages();
      void cleanMemory();
      void blittingImage(int, int, SDL_Surface*, SDL_Surface*);
      void keyEvents();
      void sceneDraw_1();
      void sceneDraw_2();
      void sceneDraw_3();
      void sceneDraw_4();
      inline SDL_Surface* getSceen()
        { return screen; }
      inline void setScreen(SDL_Surface* variable)
        { screen = variable; }  
  private:
      SDL_Surface* img_background_1;
      SDL_Surface* img_background_2;
      SDL_Surface* img_background_3;
      SDL_Surface* img_beaver;
      SDL_Surface* img_red_beaver;
      SDL_Surface* img_button_continue;
      SDL_Surface* img_button_mainMenu;
      SDL_Surface* img_button_play;
      SDL_Surface* img_button_playAgain;
      SDL_Surface* img_button_pause;    
      SDL_Surface* img_soundOff;
      SDL_Surface* img_soundOn;
      SDL_Surface* img_gameOver;
      SDL_Surface* img_heart;
      SDL_Surface* img_button_facebook;
      SDL_Surface* img_button_twitter;  
      SDL_Surface* screen;
};

C_MainClass.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
#include "SDL.h"
#include "C_Scenes.h"
class C_MainClass {
  public:
      C_Scenes o_scenes;          
      void initSDL();
      void startAllMethods();  
  private:        
      enum {_screenWidth     = 960,
            _screenHeigth    = 640,
            _screenColorBits = 32};
};
C_Button.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "C_Button.h"
        void C_Button::buttonEvents() { 
    int x = o_event.button.x;
    int y = o_event.button.y;
 
    if(SDL_PollEvent(&o_event))
        if(o_event.type == SDL_MOUSEBUTTONDOWN)
           if(o_event.button.button == SDL_BUTTON_LEFT)
                if((x > o_rect.x) && (x < o_rect.x + o_rect.w) &&
                   (y > o_rect.y) && (y < o_rect.y + o_rect.h))
                    SDL_WM_SetCaption("Test event", NULL);
}
C_Scenes.cpp
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "C_Scenes.h"
void C_Scenes::loadImages() {
    img_background_1     = IMG_Load("Images/background_menu.png");
    img_background_2     = IMG_Load("Images/background.png");
    img_background_3     = IMG_Load("Images/shadow_back.png");
 
    img_beaver           = IMG_Load("Images/beaver.png");
    img_red_beaver       = IMG_Load("Images/red-beaver.png");
 
    img_button_continue  = IMG_Load("Images/button_continue.png");
    img_button_mainMenu  = IMG_Load("Images/button_mainmenu.png");
    img_button_play      = IMG_Load("Images/button_play.png");
    img_button_playAgain = IMG_Load("Images/button_playagain.png");
    img_button_pause     = IMG_Load("Images/button_pause.png");
    img_soundOff         = IMG_Load("Images/sound_off.png");
    img_soundOn          = IMG_Load("Images/sound_on.png");
    img_gameOver         = IMG_Load("Images/game_over.png");
    img_heart            = IMG_Load("Images/heart.png");
 
    img_button_facebook  = IMG_Load("Images/fb_icon.png");
    img_button_twitter   = IMG_Load("Images/twitter_icon.png");
}
 
void C_Scenes::cleanMemory() {
    SDL_FreeSurface(img_background_1);
    SDL_FreeSurface(img_background_2);
    SDL_FreeSurface(img_background_3);
 
    SDL_FreeSurface(img_beaver);
    SDL_FreeSurface(img_red_beaver);
 
    SDL_FreeSurface(img_button_continue);
    SDL_FreeSurface(img_button_mainMenu);
    SDL_FreeSurface(img_button_play);
    SDL_FreeSurface(img_button_playAgain);
    SDL_FreeSurface(img_button_pause);
    SDL_FreeSurface(img_soundOff);
    SDL_FreeSurface(img_soundOn);
    SDL_FreeSurface(img_gameOver);
    SDL_FreeSurface(img_heart);
 
    SDL_FreeSurface(img_button_facebook);
    SDL_FreeSurface(img_button_twitter);
 
    SDL_Quit();
}
 
void C_Scenes::blittingImage(int x, int y, SDL_Surface* source,
                             SDL_Surface* destination) {
    SDL_Rect o_rect;
    o_rect.x = x;   
    o_rect.y = y;
    SDL_BlitSurface(source, NULL, destination, &o_rect);
}
 
void C_Scenes::keyEvents() {    
    C_Button o_button(0, 0, 960, 640);
    int isCicleEnd = 0;
    while(isCicleEnd == 0)
        if(SDL_PollEvent(&o_event)) {
            o_button.buttonEvents();
            if(o_event.type == SDL_QUIT)
                isCicleEnd = 1;
            if(o_event.type = SDL_KEYDOWN &&
               o_event.key.keysym.sym == SDLK_ESCAPE)
                    isCicleEnd = 1;
            SDL_Flip(screen);
        }
}
 
void C_Scenes::sceneDraw_1() {
    blittingImage(0,   0,   img_background_1,    screen);
    blittingImage(150, 100, img_button_play,     screen);
    blittingImage(200, 400, img_soundOff,        screen);
    blittingImage(400, 400, img_button_facebook, screen);
    blittingImage(600, 400, img_button_twitter,  screen);
}
 
void C_Scenes::sceneDraw_2() {
    blittingImage(0,   0,   img_background_2, screen);
    blittingImage(10,  10,  img_heart,        screen);
    blittingImage(880, 10,  img_button_pause, screen);
    blittingImage(410, 330, img_beaver,       screen);
}
 
void C_Scenes::sceneDraw_3() {
    blittingImage(0,   0,   img_background_3,    screen);
    blittingImage(200, 250, img_button_continue, screen);
}
 
void C_Scenes::sceneDraw_4() {
    blittingImage(0,   0,   img_background_3,     screen);
    blittingImage(120, 100, img_gameOver,         screen);
    blittingImage(180, 270, img_button_playAgain, screen);
    blittingImage(220, 400, img_button_mainMenu,  screen);
}

C_MainClass.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "C_MainClass.h"
void C_MainClass::initSDL() {   
    SDL_Init(SDL_INIT_EVERYTHING);
    o_scenes.setScreen(SDL_SetVideoMode(_screenWidth,
                                        _screenHeigth,
                                        _screenColorBits,
                                        SDL_SWSURFACE));
    SDL_WM_SetCaption("Beaver Game", NULL);
}
 
void C_MainClass::startAllMethods() {
    initSDL();
    o_scenes.loadImages();
    o_scenes.sceneDraw_1();
    //o_scenes.sceneDraw_2();
    //o_scenes.sceneDraw_3();
    //o_scenes.sceneDraw_4();   
    o_scenes.keyEvents();
    o_scenes.cleanMemory();
}
main.cpp
C++
1
2
3
4
5
6
#include "C_MainClass.h"
int main(int argc, char* argv[]) {
    C_MainClass o_mainClass;
    o_mainClass.startAllMethods();
    return 0;
}
Вложения
Тип файла: 7z Bober.7z (8.63 Мб, 5 просмотров)
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 16:21     SDL + C++ = Тормозит событие нажатия кнопки #6
Немного переделал. Так работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void C_Scenes::keyEvents() 
{   
    C_Button o_button(0, 0, 960, 640);
    int isCicleEnd = 0;
    while(isCicleEnd == 0)
        if(SDL_PollEvent(&o_event)) 
        {
            o_button.buttonEvents(&o_event); // изменил
            if(o_event.type == SDL_QUIT)
                isCicleEnd = 1;
            if(o_event.type = SDL_KEYDOWN &&
               o_event.key.keysym.sym == SDLK_ESCAPE)
                    isCicleEnd = 1;
            SDL_Flip(screen);
        }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
void C_Button::buttonEvents(SDL_Event* o_event) 
{   
    int x = o_event ->button.x;
    int y = o_event ->button.y;
 
    //if(SDL_PollEvent(&o_event))
        if(o_event ->type == SDL_MOUSEBUTTONDOWN)
           if(o_event ->button.button == SDL_BUTTON_LEFT)
                if((x > o_rect.x) && (x < o_rect.x + o_rect.w) &&
                   (y > o_rect.y) && (y < o_rect.y + o_rect.h))
                    SDL_WM_SetCaption("Test event", NULL);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2013, 17:15     SDL + C++ = Тормозит событие нажатия кнопки
Еще ссылки по теме:

Ожидание нажатия кнопки или пауза в выполнении цикла - C++
Есть цикл, внутри него несколько кейсов. Необходимо каким-то образом реализовать &quot;поэтапное&quot; прохождение case-ов внутри цикла. Ф-ия...

Как сделать, чтобы цикл продолжался только после нажатия кнопки? - C++
for (int i=0; i&lt;n;i++) pl=dieroll (); нужно чтобы пользователь перед каждой иттерацией жал любую (можно заданную, можно нет)...

Установка SDL 2 - C++
Из-за некоторых проблем с обработкой клавиатуры решил перейти с GLUT на SDL 2. Вопрос: как на Ubuntu установить этот самый SDL 2? ...

SDL mouse - C++
если обработка нажатия на левую кнопку мыши это if (occur.type == SDL_MOUSEBUTTONDOWN) if(occur.button.button == SDL_BUTTON_LEFT)...

Sdl 2.0 Dev-cpp - C++
Под спойлером лог компилятора, по сути не может найти winapifamily.h, где его брать, куда пихать итд, сдл поставил полностью ...


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

Или воспользуйтесь поиском по форуму:
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
13.09.2013, 17:15  [ТС]     SDL + C++ = Тормозит событие нажатия кнопки #7
Ура, спасибо, с меня ящик пива)) Теперь осталось сделать события нажатия на кнопки и чтоб бобры из нор выскакивали)
Yandex
Объявления
13.09.2013, 17:15     SDL + C++ = Тормозит событие нажатия кнопки
Ответ Создать тему
Опции темы

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