2013-11-27 28 views
0

我正在嘗試在Visual Studio 2012上製作遊戲。我正在使用SDL,並且已將所有設置正確設置,因此教程:http://sdltutorials.com/sdl-tutorial-basics在Visual Studio 2012上使用SDL加載.BMP圖像時,它只顯示一幀

我曾在google上尋找其他解決方案:(1)將圖像文件放置在項目文件中。並且,(2)用.exe程序放置圖像。一個窗口顯示,但它的黑色沒有圖像。這兩種解決方案都失敗了。我現在放棄使用Visual Studio 2012做任何事情。至於代碼,我在上面發佈的鏈接中獲得了源代碼。謝謝:)

編輯:

當我生成項目,它的成功。

我也使用SDL-devel-1.2.15/SDL版本1.2.15。

我的os系統是Windows 8.1,如果有幫助。

下面是這個例子中的一個短版的代碼:

#include "SDL.h" 

int main(int argc, char* args[]) 
{ 
    //The images 
    SDL_Surface* hello = NULL; 
    SDL_Surface* screen = NULL; 

    //Start SDL 
    SDL_Init(SDL_INIT_EVERYTHING); 

    //Set up screen 
    screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); 

    //Load image 
    hello = SDL_LoadBMP("hello.bmp"); 

    //Apply image to screen 
    SDL_BlitSurface(hello, NULL, screen, NULL); 

    //Update Screen 
    SDL_Flip(screen); 

    //Pause 
    SDL_Delay(2000); 

    //Free the loaded image 
    SDL_FreeSurface(hello); 

    //Quit SDL 
    SDL_Quit(); 

    return 0; 
} 

的圖像顯示。這是我發佈的網站的代碼示例。任何人都可以找出他的代碼有什麼問題(而不是我在這裏發佈的代碼。我在網站中共享的代碼示例)?

+0

也許這是你的代碼? –

+0

爲您的代碼添加一些錯誤檢查,找出發生了什麼錯誤,然後在此處發佈您的代碼以解釋這一點。 –

+0

@退休的忍者:一切都編譯正確。當我編譯並查看我的項目目錄stderr.txt時,我確實得到了這個文件。 – cyberspace009

回答

1

任何人都可以找出什麼毛病他的代碼(不是我這裏貼的代碼。

在教程中(您鏈接的代碼Win32_Sources.zip)永遠不會調用SDL_Flip所以,即使你在屏幕上畫東西,你永遠不會看到它

另一個問題是,這傢伙沒有閱讀SDL文檔,並試圖釋放幀緩衝區(與SDL_SetVideoMode分配)與SDL_FreeSurface。Accordi you shouldn't do that,因爲framebuffer是由SDL_Quit發佈的。 (意見)除此之外,我認爲他的編碼風格非常差 - 「讓我們爲所有事物做一個班級」(即他喜歡OOP太多)的問題,以至於有些新手已經有了。爲單個函數創建單獨的* .cpp對我來說不是一個好主意(對於****來說,它是10..15行代碼),我不完全同意他的選擇CodeBlocks用於項目的IDE /編譯系統,代碼也讓我想起了MFC或Microsoft編碼示例(其中類名爲CSomething等)。總的來說,這個人看起來像另一個新手我,所以我不認爲從他那裏學習是一個好主意。(/意見)

我建議閱讀SDL文檔,而不是以下教程(如這個)。SDL本身相當簡單,其文檔包含通常用C語言編寫的簡短/簡單示例,這意味着在這個人的例子中不會出現面向對象的瘋狂。我建議使用Visual Studio express(而不是codeblocks),但是你也應該學習一些像CMake或qMake這樣的跨平臺構建工具(Qt 4或Qt的一部分) 5)。學習這些工具將使你的生活更輕鬆,如果你決定過渡到Linux或類似的東西。

對於一個很好的/乾淨的C++編碼風格,你應該看看Qt 4/5源代碼,教程和例子。如果你需要GUI工具包,Qt也會很有用。另外考慮嘗試OpenGL。如果你想要做MS-Dos風格的演示或軟件渲染器,純SDL是很好的,但是OpenGL可以更快地完成某些事情。

1

你可能會考慮升級到SDL2並使用不同的設置像這樣的教程,不看太糟糕的:http://twinklebeardev.blogspot.com/p/sdl-20-tutorial-index.html

如果沒有,你可以使用相同的代碼GetCurrentDirectory弄清楚什麼目錄被期待文件。

下面是一個簡單的SDL2示例,用於加載和顯示位圖。您可以在錯誤檢查代碼中放置斷點,以便在錯誤檢查代碼中發現錯誤。確保你正在構建一個控制檯風格的程序,以便錯誤可以打印出來。

#include <Windows.h> 
#include <iostream> 
#include <string> 

#include "SDL.h" 

#pragma comment(lib, "sdl2.lib") 
#pragma comment(lib, "sdl2main.lib") 

int main(int argc, char* args[]) 
{ 
    const std::string bmpFilename("test.bmp"); 

    SDL_Init(SDL_INIT_EVERYTHING); 

    SDL_Window* window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN); 
    if(!window) 
    { 
     std::cerr << "Could not create window!\n"; 
     return 0; 
    } 

    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); 
    if(!renderer) 
    { 
     std::cerr << "Could not create renderer!\n"; 
     return 0; 
    } 

    SDL_Surface* bmp = SDL_LoadBMP(bmpFilename.c_str()); 
    if(!bmp) 
    { 
     char workingDirectory[_MAX_PATH]; 
     GetCurrentDirectory(sizeof(workingDirectory), workingDirectory); 
     std::string fullPath(std::string(workingDirectory) + "\\" + bmpFilename); 
     std::cerr << "Could not load " << fullPath << "!\n"; 
     return 0; 
    } 
    SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, bmp); 
    if(!texture) 
    { 
     std::cerr << "Could not create texture!\n"; 
     return 0; 
    } 
    SDL_FreeSurface(bmp); 

    SDL_RenderClear(renderer); 
    SDL_RenderCopy(renderer, texture, NULL, NULL); 
    SDL_RenderPresent(renderer); 

    SDL_Delay(2000); 

    SDL_DestroyTexture(texture); 
    SDL_DestroyRenderer(renderer); 
    SDL_DestroyWindow(window); 

    SDL_Quit(); 
    return 0; 
} 
+0

SDL2會提供更多的教程嗎?我聽說SDL2是新的,並沒有太多的教程。 – cyberspace009