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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Проверка правильности ввода http://www.cyberforum.ru/cpp-beginners/thread1490879.html
1)Вывести ошибку в консоль, если в символ пользователь пытается вбить строку. 2)Вывести ошибку в консоль, если строка не является символом, а если является перевести в int. Большое спасибо!
C++ Ссылка на указатель на указатель void TEST( int **&refptr, int const &N); int main() { int const N = 10; int i{ 0 }, b{ 2 }, *ptr{ &i, &b }; filling_ptr_array(ptr, N);//ОШИБКА _getch(); } http://www.cyberforum.ru/cpp-beginners/thread1490846.html
В каждой строке файла удалить среднее слово C++
В каждой строке файла удалить среднее слово, результат записать в файл Например, в строке 7 слов - удалить 4 слово Если 6 слов, то удалить третье Помогите сделать задание
C++ Управление курсором в консоли
Всем привет. Интересует вопрос: можно ли управлять курсором в консоли, то есть управлять положением вывода или ввода информации, с помощью ассемблера?
C++ Чтение текста из файла [VC++] http://www.cyberforum.ru/cpp-beginners/thread1490828.html
Здравствуйте, уважаемые знатоки) С толкнулся с проблемой чтения текста из файла (вроде бы задача легкая), но я буквально недавно начал изучать С++ (так как паскаль (аля делфи) порядком надоел своей...
C++ Калькулятор: обратная польская запись Всем доброго времени суток! Решил написать для себя калькулятор, который бы решал сложные выражения с учетом скобок, каких-либо функций и т.д. В дальнейшем хотел прикрутить свой класс больших чисел,... подробнее

Показать сообщение отдельно
MrShootex
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 3

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

01.07.2015, 01:13. Просмотров 260. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru