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

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

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

Баги SDL окна - C++

01.07.2015, 01:13. Просмотров 301. Ответов 6
Метки нет (Все метки)

Начал учить 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
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include "SDL.h"
#include <math.h>
 
int WIDTH = 1280;
int HEIGHT = 960;
 
int xCursor;
int yCursor;
 
char **colors;
 
SDL_Window *WINDOW;
SDL_Surface *W_SCREEN;
SDL_Renderer *RENDERER;
SDL_Texture *W_TEXTURE;
 
void initWindow()
{
    SDL_Init(SDL_INIT_EVERYTHING);
    WINDOW = SDL_CreateWindow("Fuck you", 1, 120, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
    W_SCREEN = SDL_GetWindowSurface(WINDOW);
    RENDERER = SDL_CreateRenderer(WINDOW, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
}
 
void closeWindow()
{
    SDL_FreeSurface(W_SCREEN);
    SDL_DestroyRenderer(RENDERER);
    SDL_DestroyWindow(WINDOW);
    SDL_Quit();
}
 
char** getColors()
{
    int r, g, b;
    r = g = b = 0;
    char **colorsArr = new char*[4096];
    for (int i = 0; i < 4096; i++)
    {
        colorsArr[i] = new char[3];
    }
 
    int i = 0;
    for (r = 15; r < 256; r += 16)
    {
        for (g = 15; g < 256; g += 16)
        {
            for (b = 15; b < 256; b += 16)
            {
                colorsArr[i][0] = r;
                colorsArr[i][1] = g;
                colorsArr[i][2] = b;
                i++;
            }
        }
    }
    return colorsArr;
}
 
void getSetData(double &xStart, double &yStart, double &step, int zoom)
{
    if (zoom != 0)
    {
        double xCenter, yCenter;
 
        xCenter = xStart + xCursor*step;
        yCenter = yStart + yCursor*step;
 
        xStart = xCenter - 2.0 / pow(2.0, zoom);
        yStart = yCenter - 1.5 / pow(2.0, zoom);
        step /= 2;
    }
    else
    {
        xStart = -2.5;
        yStart = -1.5;
        step = 4.0/WIDTH;
    }
}
 
void drawMandelbrotRaw(double xStart, double yStart, double step, int row)
{
    int max = 4096;
    int iteration;
    double x, y, temp;
    int r, g, b;
 
    yStart += step*row;
    for (int col = 0; col < WIDTH; col++)
    {
        x = y = iteration = 0;
        xStart += step;
        while (x*x + y*y <= 4 && iteration < max)
        {
            temp = x*x - y*y + xStart;
            y = 2 * x*y + yStart;
            x = temp;
            iteration++;
        }
 
        if (iteration < max)
        {
            SDL_SetRenderDrawColor(RENDERER, colors[iteration][0], colors[iteration][1], colors[iteration][2], 255);
            SDL_RenderDrawPoint(RENDERER, col, row);
        }
        else
        {
            SDL_SetRenderDrawColor(RENDERER, 0, 0, 0, 255);
            SDL_RenderDrawPoint(RENDERER, col, row);
        }
    }
}
 
int main(int argc, char* args[])
{
    initWindow();
 
    SDL_Event event;
    colors = getColors();
    double xStart, yStart, step;
    int zoom = 0;
    bool isZoomed;
 
    while (1)
    {
        isZoomed = 0;
        getSetData(xStart, yStart, step, zoom);              // задаёт начальные значения для отрисовки
        for (int row = 0; row < HEIGHT; row++)           // отрисовка 
        {
            drawMandelbrotRaw(xStart, yStart, step, row);          // отрисовка ряда пикселей 
            SDL_RenderPresent(RENDERER);
 
            while (SDL_PollEvent(&event) != 0)             // отслеживание событий во время отрисовки
            {
                if (event.type == SDL_MOUSEBUTTONUP && event.button.button == SDL_BUTTON_LEFT)
                {
                    zoom++;
                    xCursor = event.button.x;
                    yCursor = event.button.y;
                    isZoomed = 1;
                }
                else if (event.type == SDL_QUIT)
                {
                    closeWindow();
                    return 0;
                }
            }
            if (isZoomed)
                break;
        }
 
        while (1)                                       // отслеживание событий во время бездействия 
        {
            while (SDL_PollEvent(&event) != 0)
            {
                if (event.type == SDL_MOUSEBUTTONUP && event.button.button == SDL_BUTTON_LEFT)
                {
                    zoom++;
                    xCursor = event.button.x;
                    yCursor = event.button.y;
                    isZoomed = 1;
                }
                else if (event.type == SDL_QUIT)
                {
                    closeWindow();
                    return 0;
                }
            }
            if (isZoomed)
                break;
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2015, 01:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Баги SDL окна (C++):

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

Баги в XP - C++
Да не приколисты мы, просто не понятно, на кой делать предложенную тобой хреновину? А на счет Win9x &amp; Win2k не знаю, наверное лучше было бы...

Баги в коде. Одномерные массивы - C++
Собственно, задание, на которое написана прога: В одномерном массиве, состоящем из n вещественных элементов, вычислить: — количество...

Баги в Visual Studio 2010 - C++
В MS VC++ 2010 также не мало глюков! Другое дело, что у вас не такая высокая квалификация, чтобы понять, что вы имеете дело с глюком. ...

C++ SDL - C++
Всем привет! Работал я значи в SDL, а потом что-то нажалось ил не нажалось и вообщем теперь, при компиляции любого(работающего,...

После первого прохода появляются баги - C++
Если вызвать функцию enter(), первый раз все хорошо, но если вызвать ее еще раз, то первый ввод строки пропускатеся и другие косяки бывают....

6
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
01.07.2015, 06:24 #2
Это проблемы консольного приложения.
Переходите на WinApi.
0
Max Dark
шКодер самоучка
1873 / 1673 / 607
Регистрация: 09.10.2013
Сообщений: 3,718
Записей в блоге: 6
Завершенные тесты: 2
01.07.2015, 06:52 #3
MrShootex, у вас цикл обработки сообщений неправильный - нет обработки сообщения "обновить окно"(SDL_WINDOWEVENT_EXPOSED).

Не по теме:

Цитата Сообщение от zss Посмотреть сообщение
Переходите на WinApi.
под *nix нет WinAPI

0
MrShootex
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 3
01.07.2015, 15:54  [ТС] #4
Cra3y, то есть нужно ещё и добавить обработку изображения при перемещении окна?
0
Max Dark
шКодер самоучка
1873 / 1673 / 607
Регистрация: 09.10.2013
Сообщений: 3,718
Записей в блоге: 6
Завершенные тесты: 2
01.07.2015, 16:36 #5
основной цикл должен выглядеть примерно так:
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
SDL_Event event;
bool runned = init(); // инициализация SDL
 
while(runned) {
    // пока есть сообщения
    while(SDL_PollEvent(&event)) {
        switch(event.type) {
            case SDL_MOUSEBUTTONUP:
                if(SDL_BUTTON_LEFT == event.button.button) {
                    zoom(event.button); // обработка левой кнопки
                }
                break;
            case SDL_WINDOWEVENT:
                switch(event.window.event) {
                    case SDL_WINDOWEVENT_EXPOSED: // окно нужно перерисовать
                        draw(event.window);
                        break;
                    case SDL_WINDOWEVENT_RESIZED: // изменились размеры
                        resize(event.window);
                        break;
                }
                break;
            case SDL_QUIT:
                runned = false;
                break;
        }
    }
    idle(); // функция обработки простоя
    SDL_Delay(1); // задержка для переключения процессов,
                  // иначе прога будет грузить 1 ядро на 100%
}
cleanup(); // функция очистки
SDL_Quit();
я бы разделил расчет и рисование на две функции
собственно рисование по рассчитанным данным draw()
и функцию расчета recalc(), которую вызывал пи зуме и изменении размеров окна
1
MrShootex
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 3
01.07.2015, 17:02  [ТС] #6
Cra3y, спасибо большое. Но я так и не понял как быть со свёрнутым окном.
0
Max Dark
шКодер самоучка
1873 / 1673 / 607
Регистрация: 09.10.2013
Сообщений: 3,718
Записей в блоге: 6
Завершенные тесты: 2
01.07.2015, 17:43 #7
Цитата Сообщение от MrShootex Посмотреть сообщение
как быть со свёрнутым окном.
при подобной обработке сообщений мне ни разу не приходилось как то специально обрабатывать то, что окно свернуто
1
01.07.2015, 17:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2015, 17:43
Привет! Вот еще темы с ответами:

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

Оптимизация SDL - C++
Начал изучать SDL. Все бы хорошо, но процесс созданного окна кушает 25% ресурсов процессора. Когда делал по этим урокам:...

Странность С++ и SDL - C++
Здравствуйте уважаемые форумчане возникла непонятная ситуация вообщем писал на С++ классы и учил OpenGL и все вроде нормально как вдруг...

SDL - Конфигурирование - C++
Всем доброго времени суток. Недавно натолкнулся проблему с настройкой SDL. Дело в том, что мне нужно отключить переадресацию stdio с...


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

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

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