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

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

Восстановить пароль Регистрация
 
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
13.09.2013, 13:12     SDL + C++ = Тормозит событие нажатия кнопки #1
С помощью 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); // функция обновления экрана, чтобы отобразить изменения
        }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 14:59     SDL + C++ = Тормозит событие нажатия кнопки #2
Кода мало.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
13.09.2013, 15:04  [ТС]     SDL + C++ = Тормозит событие нажатия кнопки #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Кода мало.
В смысле?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 15:20     SDL + C++ = Тормозит событие нажатия кнопки #4
Цитата Сообщение от dimakozyr Посмотреть сообщение
В смысле?
Чтобы разбираться.
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
5282 / 4801 / 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++ = Тормозит событие нажатия кнопки
Еще ссылки по теме:

почти While или как делать действие до нажатия кнопки C++
SDL ошибка на событии обработки нажатия кнопки мыши C++
Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2? C++

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

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

Текущее время: 08:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru