2016-12-28 6 views
0

私は単純な2Dプラットフォームを作成する方法を学ぶためにSDL2を使用しています。 私はSDLのゲーム開発とLazy Fooのチュートリアルを読み始めています。ウィンドウを開いて面を描き、ウィンドウ上にその表面をblitすることができます(これは従来のSDLで行われたとおりです)。 Renderer関数を使用してハードウェアアクセラレーションを実行しても同じことを表示しません! 私はWindows 10で動作しています。アプリケーションを起動すると、空のウィンドウが表示されます。私はいくつかのデバッグ行を印刷しようとしましたが、ビットマップを開いてテクスチャを作成するようですが、私がQueryTextureで取得する長方形の寸法を印刷すると、0と0が返されます。SDL2 SLD_RenderCopyに何も表示されない

//Game.cpp: 
#include <SDL.h> 
#include <SDL_image.h> 
#include "Game.h" 
#include <iostream> 

bool Game::init(const char *title,int x,int y,int width,int height,int flags) 
{ 
    if (SDL_Init(SDL_INIT_VIDEO) < 0) 
     return false; 
    m_pWindow = SDL_CreateWindow(title,x,y,width,height,flags); 
    if (m_pWindow == NULL) 
     return false; 
    m_pRenderer = SDL_CreateRenderer(m_pWindow,-1,0); 
    if (m_pRenderer == NULL) 
     return false; 
    SDL_SetRenderDrawColor(m_pRenderer,0,0,0,255); 
    return true; 
} 

void Game::handle_events() 
{ 
    SDL_Event event; 
    while (SDL_PollEvent(&event) != 0) 
    { 
     switch (event.type) 
     { 
      case SDL_QUIT: 
       m_bRunning = false; 
       break; 
      default: 
       break; 
     } 
    } 
} 

void Game::render() 
{ 
    SDL_RenderClear(m_pRenderer); 
    SDL_RenderCopy(m_pRenderer,m_pTexture,&m_sourceRectangle,&m_destinationRectangle); 
    SDL_RenderPresent(m_pRenderer); 
} 

void Game::clean() 
{ 
    SDL_DestroyWindow(m_pWindow); 
    SDL_DestroyRenderer(m_pRenderer); 
    SDL_Quit(); 
} 

bool Game::loadImage() 
{ 
    SDL_Surface *surface = SDL_LoadBMP("logo.bmp"); 
    if (surface == NULL) 
     return false; 
    SDL_Texture *texture = SDL_CreateTextureFromSurface(m_pRenderer,surface); 
    if (texture == NULL) 
     return false; 
    SDL_FreeSurface(surface); 
    SDL_QueryTexture(m_pTexture,NULL,NULL,&m_sourceRectangle.w,&m_sourceRectangle.h); 
    m_destinationRectangle.x = m_sourceRectangle.x = 0; 
    m_destinationRectangle.y = m_sourceRectangle.y = 0; 
    m_destinationRectangle.w = m_sourceRectangle.w; 
    m_destinationRectangle.h = m_sourceRectangle.h; 
    return true; 
} 



// main.cpp: 
#include <SDL.h> 
#include "Game.h" 
#include <iostream> 
#include <Windows.h> 

Game *g_game = NULL; 

int main(int argc,char **argv) 
{ 
    AllocConsole(); 
    freopen("CON","w", stdout); 

    g_game = new Game(); 
    if (g_game->init("my 2D platform game!",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,800,600,SDL_WINDOW_SHOWN) != true) 
     return 1; 
    if (g_game->loadImage() != true) 
     return 2; 
    g_game->render(); 

    while (g_game->running()) 
    { 
     g_game->handle_events(); 
     g_game->update(); 
    } 

    g_game->clean(); 

    return 0; 
} 

答えて

2

問題は、あなたが Game::loadImage()機能で正しくテクスチャを割り当てないということです。ライン

SDL_Texture *texture = SDL_CreateTextureFromSurface(m_pRenderer,surface); 

で作成されたテクスチャは関数の終了時にスコープ外 行くローカルポインタ変数に割り当てられます。代わりに、クラス変数に 質感をASSINGする必要があります。注意点としては

m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer,surface); 

、あなたが にC++の機能を駆使していないリソースを管理します。 の時間を投資して、たとえば C++ Core Guidelinesなどの推奨プラクティスについて学ぶことをお勧めします。

+0

ああ!それは愚かだった...私は埋め込みCプログラミングから来て、私は少し前にOOPの少しを学んだし、今私はC + +とすべてのクラスの種類のものを勉強している。しかしそれはそれにもかかわらずひどい間違いだった:D – Luca

+0

私は同意しない:)。私はまだ のC++のすべての複雑さについて学んでいますが、実際には取るべきことがたくさんあります。乾杯。 – Meyer

+0

ありがとう! ;) – Luca

関連する問題