Ich habe gerade mit SDL2 begonnen, las ein paar Artikel darüber und war in der Lage, das Testprogramm zu kompilieren, das ich auf Arch Linux mit Erfolg geschrieben habe. Das einzige Problem, das scheinbar auftritt, ist, dass das Fenster, das erstellt wird, das Bild nicht rendert. Ich habe versucht, den gleichen Code auf dem Mac auszuführen, was zu dem erwarteten führt. Ich verwende CLion, was nicht der Übeltäter ist, weil das Kompilieren mit g ++ über CLI dasselbe ergibt.SDL2 auf Arch Linux: Fenster rendert, was auf dem Bildschirm dahinter ist
Mein Arch Linux installieren:
OS: Arch Linux x86_64
Kernel Release: 4.6.2-1-ARCH
Hier ist der Code ist ich kompilieren:
#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;
}
Meine CMakeLists.txt Datei (verwendet von CLION):
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})
Und der Unix-Befehl, den ich verwendet habe, um es mit g ++ zu kompilieren:
g++ main.cpp -w -lSDL2 -o prog
Wie es aussieht, wenn Sie den Code auf Arch läuft:
sollte ich beachten Sie, dass es nur Kopien, was einmal auf dem Bildschirm ist, und nicht den Fensterinhalt aktualisieren. Wenn ich das Fenster verschiebe, bleibt das, was im Fenster gerendert wird, gleich.
Auf Mac:
haben herausgefunden, ein paar Artikel auch bei diesem Thema anspielend, aber die Lösungen für diese Artikel für mich nicht funktionieren. Insbesondere rede ich über diese Artikel.
SDL - window doesn't show anything
https://bbs.archlinux.org/viewtopic.php?id=188412
Hoffnung, dass ich genügend Informationen zur Verfügung gestellt haben, und dass es jemanden gibt, die das gleiche Problem und konnte es lösen erlebt hat. Danke im Voraus!
bearbeiten nach keltar's comment (noch nicht tut, was es soll):
#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;
//}
1. nicht frei Fensterfläche, und 2. - in den meisten Fällen (in der Regel mit Compositing Window Manager beteiligt) können Sie nicht erwarten, dass Bild durch einfaches Warten erscheint. Fügen Sie eine Schleife hinzu, die die Ereigniswarteschlange löscht, anschließend Ihr Bild zeichnet und dann wiederholt. – keltar
... und ich habe die 'close'-Funktion wieder vergessen. Bitte tu das nicht. http://StackOverflow.com/Questions/31482117/SDL-Event-Handling-Not-Working – keltar
Danke für die Tipps, ich werde über sie nachdenken, wenn ich fließender mit dem Framework bin. Im Moment folge ich nur diesem Tutorial, wie du vielleicht schon gesagt hast: http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php Das Ändern deiner Vorschläge hat nichts daran geändert, dass es tatsächlich nichts gibt von dem, was ich dafür verlangte, gerendert zu werden. Die Hauptsache, die ich jetzt versuche, ist, die Diskrepanz zwischen der Ausführung dieses Codes auf Arch Linux und der Ausführung unter OS X zu beheben. –