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

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

Восстановить пароль Регистрация
 
MrShootex
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 3
01.07.2015, 01:13     Баги SDL окна #1
Начал учить 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;
        }
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2015, 01:13     Баги SDL окна
Посмотрите здесь:

Баги в Visual Studio 2010 C++
Баги в XP C++
C++ Странность С++ и SDL
Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2? C++
Баги в коде. Одномерные массивы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
01.07.2015, 06:24     Баги SDL окна #2
Это проблемы консольного приложения.
Переходите на WinApi.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
01.07.2015, 06:52     Баги SDL окна #3
MrShootex, у вас цикл обработки сообщений неправильный - нет обработки сообщения "обновить окно"(SDL_WINDOWEVENT_EXPOSED).

Не по теме:

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

MrShootex
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 3
01.07.2015, 15:54  [ТС]     Баги SDL окна #4
Cra3y, то есть нужно ещё и добавить обработку изображения при перемещении окна?
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
01.07.2015, 16:36     Баги SDL окна #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(), которую вызывал пи зуме и изменении размеров окна
MrShootex
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 3
01.07.2015, 17:02  [ТС]     Баги SDL окна #6
Cra3y, спасибо большое. Но я так и не понял как быть со свёрнутым окном.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2015, 17:43     Баги SDL окна
Еще ссылки по теме:

C++ SDL C++
Оптимизация SDL C++
C++ Мои баги по C++

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

Или воспользуйтесь поиском по форуму:
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
01.07.2015, 17:43     Баги SDL окна #7
Цитата Сообщение от MrShootex Посмотреть сообщение
как быть со свёрнутым окном.
при подобной обработке сообщений мне ни разу не приходилось как то специально обрабатывать то, что окно свернуто
Yandex
Объявления
01.07.2015, 17:43     Баги SDL окна
Ответ Создать тему
Опции темы

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