2015-06-02 2 views
0

Сегодня я начал клонировать C++/SDL2 Snake, и я искал способы сделать мой код более аккуратным, особенно с классами. Я попытался поместить весь SDL-код, используемый для окна/отображения в классе. Когда я запускаю код, окно закрывается мгновенно. Из тестов ошибок, которые я установил в display.cpp, он также сообщает мне через консоль, что SDL_UpdateWindowSurface() (в display.update()) всегда возвращает -1. Почему это происходит, когда я меняю свой код таким образом?SDL UpdateWindowSurface() возвращает -1, если вызван из класса (в отдельном файле)

С помощью этого кода загружаю изображение в main() и показываем его через функцию класса applySurface(). Идея состоит в том, чтобы иметь классы/объекты для сетки/доски игры, змеи и т. Д. - каждый вызов applySurface() для собственных изображений. Не стесняйтесь сказать мне, если это плохая идея.

main.cpp:

#include <SDL.h> 
#include "display.h" 

SDL_Event event; 
SDL_Surface* image = nullptr; 

int main(int argc, char* args[]) 
{ 
    Display display; 
    display.loadImage("image.bmp"); 

    if (SDL_Init(SDL_INIT_EVERYTHING) == -1) 
     return false; 

    bool quit = false; 

    while (!quit) 
    { 
     while (SDL_PollEvent(&event)) 
     { 
      if (event.type == SDL_QUIT) 
       quit = true; 
     } 

     display.applySurface(0, 0, image, display.windowSurface); 
     display.update(); 
    } 

    SDL_FreeSurface(image); 
    SDL_Quit(); 
    return 0; 
} 

display.h:

#pragma once 
#include <SDL.h> 
#include <string> 
#include <iostream> 

class Display 
{ 
public: 
    SDL_Window* window; 
    SDL_Surface* windowSurface; 

    Display(); 
    SDL_Surface *loadImage(std::string fileName); 
    void applySurface(int x, int y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *clip = nullptr); 
    void update(); 
    ~Display(); 
private: 
    const int WINDOW_WIDTH = 612; 
    const int WINDOW_HEIGHT = 632; 
    const int SCREEN_BPP = 2; 
}; 

display.cpp:

#pragma once 
#include "display.h" 

Display::Display() 
{ 
    window = SDL_CreateWindow("Snake", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); 

    if (window == NULL) 
     std::cout << "Error: SDL_CreateWindow failed." << std::endl; 

    windowSurface = SDL_GetWindowSurface(window); 
} 

SDL_Surface* Display::loadImage(std::string fileName) 
{ 
    SDL_Surface* loadedImage = NULL; 
    SDL_Surface* optimizedImage = NULL; 

    loadedImage = SDL_LoadBMP(fileName.c_str()); 

    if (loadedImage != NULL) 
    { 
     optimizedImage = SDL_ConvertSurface(loadedImage, windowSurface->format, 0); 

     SDL_FreeSurface(loadedImage); 

     if (optimizedImage != NULL) 
      SDL_SetColorKey(optimizedImage, SDL_TRUE, SDL_MapRGB(optimizedImage->format, 255, 255, 255)); 
    } 

    return optimizedImage; 
} 


void Display::applySurface(int x, int y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *clip) 
{ 
    SDL_Rect offset; 

    offset.x = x; 
    offset.y = y; 

    SDL_BlitSurface(source, clip, destination, &offset); 
} 

void Display::update() 
{ 
    if (SDL_UpdateWindowSurface(window) == -1) 
     std::cout << "Error: SDL_UpdateWindowSurface() failed." << std::endl; 
} 

Display::~Display() 
{ 
    SDL_FreeSurface(windowSurface); 
    windowSurface = NULL; 

    SDL_DestroyWindow(window); 
    window = NULL; 
} 
+1

'SDL_Init' должен вызываться перед любыми другими функциями' SDL_', но вызываются '' Display :: Display() 'и' Display :: loadImage (std :: string) 'до вызова' SDL_Init' в вашем 'main'. Вероятно, вы должны переместить 'SDL_Init' в начало' main() '. – Frxstrem

ответ

2

Это правильное использование о f классов для структурирования вашего кода. SDL_Init должен появиться перед любыми другими функциями SDL, что означает, что вам лучше всего переместить SDL_Init в начало страницы или добавить его в конструктор дисплея. Если вы добавите его в начало конструктора дисплея, это означает, что вы можете иметь только один объект класса отображения, работающий одновременно, что, вероятно, будет в этом случае прекрасным.

+0

О, это было глупо от меня. Спасибо! –

+0

Проблема теперь заключается в том, что изображение не появится на экране. Я просто получаю черный фон окна. Я не вижу никакой причины для этого, - изображения, похоже, загружаются/оптимизируются. –

+0

Вы пробовали определить offset.h и offeset.w? Также может помочь перемещение координат изображения в точку, отличную от точки происхождения. –

 Смежные вопросы

  • Нет связанных вопросов^_^