2016-06-29 2 views
4

방금 ​​SDL2로 시작했고, 몇 가지 기사를 읽고, 내가 성공적으로 Arch Linux에서 작성한 테스트 프로그램을 컴파일 할 수있었습니다. 유일한 문제는 생성되는 창이 이미지를 렌더링하지 않는다는 것입니다. Mac에서 동일한 코드를 실행 해 보았습니다. 예상되는 결과가 발생했습니다. CLIion을 통해 g ++로 컴파일하면 같은 결과를 낳기 때문에 나는 암컷이 아닌 CLion을 사용하고 있습니다.Arch Linux의 SDL2 : 창 뒤에있는 내용을 렌더링하는 창

내 아치 리눅스 설치 :

#include <iomanip> 
#include <SDL2/SDL.h> 
using namespace std; 

const int WIDTH = 640; 
const int HEIGHT = 480; 

bool init(); 
bool loadMedia(); 
int close(); 

SDL_Window* window = NULL; 
SDL_Surface* surface = NULL; 
SDL_Surface* image = NULL; 

int main(int argc, char** argv) { 
    if(init()) 
     if(loadMedia()) 
      printf("Media loaded"); 
    SDL_BlitSurface(image, NULL, surface, NULL); 
    SDL_UpdateWindowSurface(window); 
    SDL_Delay(5000); 
    return close(); 
} 

bool init() { 
    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { 
     printf("Error initializing SDL: %s", SDL_GetError()); 
     return false; 
    } else { 
     window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN); 
     if(window == NULL) { 
      printf("Error creating window: %s", SDL_GetError()); 
      return false; 
     } 
     else 
      surface = SDL_GetWindowSurface(window); 
    } 
    return true; 
} 

bool loadMedia() { 
    image = SDL_LoadBMP("/home/me/ClionProjects/SDLTest/test.bmp"); 
    if(image == NULL) { 
     printf("Error loading in image: %s", SDL_GetError()); 
     return false; 
    } 
    return true; 
} 

int close() { 
    SDL_FreeSurface(surface); 
    SDL_FreeSurface(image); 
    SDL_DestroyWindow(window); 
    SDL_Quit(); 
    return 0; 
} 

내 CMakeLists.txt 파일 (CLion에서 사용) : 여기

OS: Arch Linux x86_64 
Kernel Release: 4.6.2-1-ARCH 

내가 컴파일하고있어 코드의

cmake_minimum_required(VERSION 3.5) 
project(SDLTest) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -w -lSDL2") 

set(SOURCE_FILES main.cpp) 
add_executable(SDLTest ${SOURCE_FILES}) 

그리고 g ++로 컴파일 할 때 사용한 Unix 명령 :

이 아치에 코드를 실행할 때 보이는 무엇
g++ main.cpp -w -lSDL2 -o prog 

는 :

Code run on Arch Linux

나는주의해야한다 한번 화면에, 그리고 윈도우의 콘텐츠를 업데이트하지 않습니다 무엇 만 복사. 그래서 창을 옮길 때 창에 렌더링되는 것은 그대로 유지됩니다. 맥에

:

enter image description here

유무 기사의 부부도이 문제를 암시하지만, 그 기사에 대한 솔루션은 나를 위해 작동하지 않습니다 발견했다. 특히, 나는이 기사에 대해 이야기하고있다.

https://bbs.archlinux.org/viewtopic.php?id=188412

https://gamedev.stackexchange.com/questions/117792/why-does-sdl-render-the-background-from-the-operating-system-to-the-window

내가 충분한 정보를 제공하고, 같은 문제가 발생하고이를 해결 할 수 있었다 거기에 누군가가 거기에 그 한 희망

SDL - window doesn't show anything

. 미리 감사드립니다!


편집 keltar's comment (아직이에 해야하는 일을하지 않음) 후 :

나는 아무 문제없이 우분투 14.04에 코드를 실행 한
#include <iomanip> 
#include <SDL2/SDL.h> 
using namespace std; 

const int WIDTH = 640; 
const int HEIGHT = 480; 

bool init(); 
bool loadMedia(); 
//int close(); 

SDL_Window* window = NULL; 
SDL_Surface* surface = NULL; 
SDL_Surface* image = NULL; 

int main(int argc, char** argv) { 
    if(init()) 
     if(loadMedia()) 
      printf("Media loaded"); 
    SDL_BlitSurface(image, NULL, surface, NULL); 
    SDL_UpdateWindowSurface(window); 
    SDL_Delay(5000); 
    SDL_Quit(); 
    return 0; 
} 

bool init() { 
    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { 
     printf("Error initializing SDL: %s", SDL_GetError()); 
     return false; 
    } else { 
     window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN); 
     if(window == NULL) { 
      printf("Error creating window: %s", SDL_GetError()); 
      return false; 
     } 
     else 
      surface = SDL_GetWindowSurface(window); 
    } 
    return true; 
} 

bool loadMedia() { 
    image = SDL_LoadBMP("/home/me/ClionProjects/SDLTest/test.bmp"); 
    if(image == NULL) { 
     printf("Error loading in image: %s", SDL_GetError()); 
     return false; 
    } 
    return true; 
} 

//int close() { 
// SDL_FreeSurface(surface); 
// SDL_FreeSurface(image); 
// SDL_DestroyWindow(window); 
// SDL_Quit(); 
// return 0; 
//} 
+0

1. 대부분의 경우 (일반적으로 창 관리자가 포함 된 경우) 단순히 대기하여 이미지가 나타날 것으로 기대할 수 없습니다. 이벤트 대기열을 비우는 루프를 추가 한 다음 이미지를 그린 다음 반복합니다. – keltar

+0

... 그리고 나는'close' 함수를 잊어 버렸다. 제발 그만 하지마. http://stackoverflow.com/questions/31482117/sdl-event-handling-not-working – keltar

+0

팁을 주셔서 감사합니다. 프레임 워크에 더 익숙해지면 팁을 고려해 보겠습니다. 지금은 이미이 튜토리얼을 따르고 있습니다. 이미 공제 했으므로 http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php 제안 된 내용을 변경해도 실제로는 아무것도 없다는 사실을 변경하지 않았습니다. 내가 요구하는 것을 표현하고있다. 지금 내가하려고하는 주된 작업은이 코드를 아치 리눅스에서 실행하고 OS X에서 실행하는 것 사이에 존재하는 불일치를 수정하는 것입니다. –

답변

1

. 리눅스에서 '렌더링 드라이버'문제가 있는지 확인하려면 내 작은 GPL game을 명령 줄에서 실행하고 콘솔에 표시된 정보를 복사하여 붙여 넣을 수 있습니까?

당신이 뭔가를 볼 수 다음 'SDL_RENDERER_PRESENTVSYNC'플래그가 렌더러에 ON 때 또는

Video drivers (2): 'x11' 'dummy', active = 'x11' 
Screen: 1920 x 1080, game: 1024 x 576 
Rendering drivers (2): 'opengl' 'software', active = 'opengl' 
Render flags = 0x000a | ACCELERATED | TARGETTEXTURE 
Window flags = 0x001a | OPENGL | BORDERLESS 
0 joystick(s) detected 

나는에 CentOS 5에 대한 문제의 동일한 종류를 발견 한 당신이 어떤 질감을 복사하지 않는 한 렌더러에게.

또 다른 아이디어는 어떻게하면됩니까?

for(int i = 0; i < 10; i++) { 
    SDL_BlitSurface(image, NULL, surface, NULL); 
    SDL_UpdateWindowSurface(window); 
    SDL_Delay(500); 
} 
+0

답변 해 주셔서 감사합니다! 이미지 렌더링 함수를 루프에 넣으면 두 번째 반복이 실제로 이미지를 표시합니다. 지속적으로 렌더링해야 할 게임을 만들 계획이므로, 아치를 나의 개발 플랫폼 (선호하는 OS 임)으로 사용하는 데는 문제가 없습니다. 여전히 렌더링 된 첫 번째 호출이 창 뒤에있는 화면의 내용을 복사하는 것은 이상한 일입니다. 그리고 이미지를 렌더링 할 때 그렇게하는 것이 아닙니다. 사각형을 사용하여 빨간색으로 배경색을 지정하려고해도 마찬가지입니다. –

+0

게임을 만들 계획이라면 SDL_UpdateWindowSurface()는 '소프트웨어'로 렌더링하지만 [2D Accelerated Rendering functions] (https://wiki.libsdl.org/CategoryRender) 또는 OpenGL을 사용하면 안됩니다. –