1 / 1 / 0
Регистрация: 10.09.2023
Сообщений: 22
1

Полосы при отрисовке окна SDL2

25.01.2024, 14:33. Показов 910. Ответов 0

Author24 — интернет-сервис помощи студентам
Всем добрый день. Делаю задание - написать игру на SDL2. Столкнулся с проблемой: при рендере поверх окна появляются каие-то странные полоски. Когда передвигаю окно, за этими полосками виднеются спрайты, которые я отрисовываю как это и должно быть. Скриншоты прикрепил. До этого никогда не работал с SDL2. В гугле не смог найти решение.


Код функции main:
C++
1
2
3
4
5
6
#include "Game.hpp"
 
int main(int argc, char* argv[])
{
    return run(new Game);
}
Класс Game:
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
#include "Game.hpp"
 
Game::Game() : w(800), h(600), fullscr(false) {}
 
Game::Game(int width, int height, bool fullscreen) : w(width), h(height), fullscr(fullscreen) {}
 
void Game::PreInit(int& width, int& height, bool& fullscreen)
{
    width = w;
    height = h;
    fullscreen = fullscr;
}
 
bool Game::Init()
{
    doodle = createSprite("../assets/doodle/blue-lik-left.png");
    background = createSprite("../assets/bck.png");
    platform = createSprite("../assets/platform.png");
 
 
    // Random placement of platforms
    int plat_width{}, plat_height{};
    getSpriteSize(platform, plat_width, plat_height);
    srand(time(0));
    for (std::size_t i = 0; i < 10; ++i)
    {
        plat[i].x = rand() % w - plat_width;
        plat[i].y = rand() % h - plat_height;
    }
 
    return true;
}
 
void Game::Close()
{
    destroySprite(doodle);
    destroySprite(background);
    destroySprite(platform);
}
 
bool Game::Tick()
{
    drawTestBackground();
 
    drawSprite(background, 0, 0);
    drawSprite(doodle, doodle_pos.x, doodle_pos.y);
 
    for (std::size_t i = 0; i < 10; ++i)
        drawSprite(platform, plat[i].x, plat[i].y);
 
    return false;
}
 
void Game::onMouseMove(int x, int y, int xrelative, int yrelative)
{
}
 
void Game::onMouseButtonClick(FRMouseButton button, bool isReleased)
{
}
 
void Game::onKeyPressed(FRKey k)
{
}
 
void Game::onKeyReleased(FRKey k)
{
}
 
const char* Game::GetTitle()
{
    return "Doodle Jump";
}

Функция run:
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
static SDL_Renderer *g_renderer;
static int g_width = 800;
static int g_height = 600;
static int g_framework_initialized = false;
 
FRAMEWORK_API int run(Framework* framework)
{
    SDL_Window *window;
    Uint32 flags;
    int done;
    SDL_Event event;
 
    for (int i = 0; i < (int)FRKey::COUNT; ++i)
    {
        GKeyState[i] = false;
    }
 
    Framework* GFramework = framework;
 
    bool fullscreen;
    GFramework->PreInit(g_width, g_height, fullscreen);
    
    flags = SDL_WINDOW_HIDDEN;
    if (fullscreen) {
        SDL_ShowCursor(0);
        flags |= SDL_WINDOW_FULLSCREEN;
    }
 
    if (SDL_Init(SDL_INIT_VIDEO) == -1) {
        fprintf(stderr, "SDL_Init(SDL_INIT_VIDEO) failed: %s\n", SDL_GetError());
        return(2);
    }
 
    if (SDL_CreateWindowAndRenderer(0, 0, flags, &window, &g_renderer) < 0) {
        fprintf(stderr, "SDL_CreateWindowAndRenderer() failed: %s\n", SDL_GetError());
        return(2);
    }
 
    {
        /* Show the window */
        SDL_SetWindowTitle(window, GFramework->GetTitle());
        SDL_SetWindowSize(window, g_width, g_height);
        SDL_ShowWindow(window);
 
        g_framework_initialized = true;
 
 
        if (!GFramework->Init())
        {
            fprintf(stderr, "Framework::Init failed\n");
            SDL_Quit();
            exit(1);
        }
 
        done = 0;
        while ( ! done ) {
            while ( SDL_PollEvent(&event) ) {
                switch (event.type) {
                    case SDL_KEYUP:
                        switch (event.key.keysym.sym) {
                            case SDLK_RIGHT:
                            case SDLK_LEFT:
                            case SDLK_DOWN:
                            case SDLK_UP:
                            {
                                int key_index = (event.key.keysym.sym - SDLK_RIGHT);
                                if (GKeyState[key_index])
                                {
                                    GFramework->onKeyReleased((FRKey)key_index);
                                    GKeyState[key_index] = false;
                                }
                                break;
                            }
                            case SDLK_ESCAPE:
                                done = 1;
                            break;
                            default:
                                break;
                        }
                        break;
                    case SDL_KEYDOWN:
                        switch (event.key.keysym.sym) {
                        case SDLK_RIGHT:
                        case SDLK_LEFT:
                        case SDLK_DOWN:
                        case SDLK_UP:
                        {
                            int key_index = (event.key.keysym.sym - SDLK_RIGHT);
                            if (!GKeyState[key_index])
                            {
                                GFramework->onKeyPressed((FRKey)key_index);
                                GKeyState[key_index] = true;
                            }
                        }
                            break;
 
                        default:
                            break;
                        }
                        break;
                    case SDL_MOUSEBUTTONDOWN:
                        if (event.button.button <= SDL_BUTTON_RIGHT) {
                            GFramework->onMouseButtonClick((FRMouseButton)(event.button.button - SDL_BUTTON_LEFT), false);
                        }
                        break;
                    case SDL_MOUSEBUTTONUP:
                        if (event.button.button <= SDL_BUTTON_RIGHT) {
                            GFramework->onMouseButtonClick((FRMouseButton)(event.button.button - SDL_BUTTON_LEFT), true);
                        }
                        break;
                    case SDL_MOUSEMOTION:
                        GFramework->onMouseMove(event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel);
                        break;
                    case SDL_QUIT:
                        done = 1;
                        break;
                    default:
                        break;
                }
            }
 
            SDL_RenderClear(g_renderer);
 
            SDL_Rect viewport;
            SDL_RenderGetViewport(g_renderer, &viewport);
 
            /* Draw a gray background */
            SDL_SetRenderDrawColor(g_renderer, 0xA0, 0xA0, 0xA0, 0xFF);
            SDL_RenderClear(g_renderer);
 
            done |= GFramework->Tick() ? 1 : 0;
 
            SDL_RenderPresent(g_renderer);
 
            SDL_Delay(1);
        }
    }
 
    GFramework->Close();
 
    SDL_DestroyRenderer(g_renderer);
    SDL_DestroyWindow(window);
 
    g_framework_initialized = false;
 
    /* We're done! */
    SDL_Quit();
    return(0);
}
Я вообще в функции run() ничего менять не должен. Это как бы часть фреймворка. И вот не понимаю что за фигня)) Кто-то знает в чем тут дело? Спасибо заранее за помощь.
Миниатюры
Полосы при отрисовке окна SDL2   Полосы при отрисовке окна SDL2  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2024, 14:33
Ответы с готовыми решениями:

При увеличении окна до максимального появляются чёрные полосы
Без разницы, максимизирую или в ручную растягиваю . case WM_SIZE: { RECT rect;...

Проблема с созданием окна в SDL2
Установил себе библиотеку SDL2-2.0.12 с официального сайта. Вроде как даже сделал это правильно....

SDL2 создание диалогов окна
Здравствуйте. Встал вопрос как создать форму с полем ввода текста в SDL2. Что то вроде....

При отрисовке всё внутри окна перечёркивается большим красным крестом
Здравствуйте! Помогите, пожалуйста, с проблемой, очень нужно. Можете сказать, почему при...

0
25.01.2024, 14:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2024, 14:33
Помогаю со студенческими работами здесь

Не могу найти ошибку в отрисовке своего окна
для особых нужд я написал аналог Listview. он состоит из заголовкового окна и окна содержимого....

Изменение размера окна приводит к чёрному экрану, SDL2 + OpenGL
Здравствуйте! Собственно, вот такая проблема. Есть некоторое приложение, рисующее несколько...

Помощь при отрисовке
Есть программа скринмейт, программа нарезает изображения и тп, но когда заходит на второй круг, то...

Ошибка при отрисовке
Всем привет, не могу разобраться в коде, а точнее в ошибке,которую выдает программа. Очень буду...

Прозрачность при отрисовке
Проблема заключается в следующем: Создал простейшее окно и нарисовал там обычный квадрат красного...

Ошибка при отрисовке кадра
Создал сеть: два прямоугольных узла соеденил дорогой. Запускаю, а он мне вот такое говорит. ...

Ошибка при отрисовке линии
Добрый день гении! Пытаюсь разобраться с QPainter, QPaintEvent для того, чтобы рисовать собственно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru