0

これは私のmain.cppです

#include <cstdlib>
#include <iostream>

#include "Sprite.h"
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include "SDL/SDL_mixer.h"

#undef main

SDL_Surface* m_pScreen;
SDL_Surface* bg_image;

int main(int argc, char* argv[]){

        SDL_Event evt;
        bool p_running = true;

        // initialize SDL
        SDL_Init(SDL_INIT_EVERYTHING);
        SDL_EnableUNICODE( SDL_ENABLE );
        TTF_Init();

        // set the title bar text
        SDL_WM_SetCaption("test1", NULL);

        // create the screen surface
        m_pScreen = SDL_SetVideoMode(500, 400, 32, SDL_DOUBLEBUF);

        bg_image = NULL;

        bg_image = Sprite::Load("images/bg.png");

        Sprite::Draw(m_pScreen, bg_image, 0, 0);


        while(p_running)
        {
          SDL_WaitEvent(&evt);
          if(evt.type == SDL_QUIT)
            p_running = false;
        }

        SDL_Quit();

       system("pause");
       return 0;

}

Sprite.h:

#ifndef  _SPRITE_H_
#define _SPRITE_H_

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

class Sprite
{
    public:

             Sprite();

             static SDL_Surface* Load(char* pFile);

             static bool Draw( SDL_Surface* dest, SDL_Surface* src, int x, int y );

             static bool Draw( SDL_Surface* dest, SDL_Surface* src, int x, int y, int x2,
              int y2, int width, int height );
};



// constructor
Sprite::Sprite() {}

SDL_Surface* Sprite::Load( char* File )
{
    SDL_Surface* temp = NULL;
    SDL_Surface* optimized = NULL;

    if(( temp = IMG_Load(File)) == NULL )
    {
          return NULL;
    }

    optimized = SDL_DisplayFormatAlpha(temp);

    SDL_FreeSurface(temp);

    //Uint32 colorkey = SDL_MapRGB( optimized->format, 0xFF, 0x80, 0xC0 );//0xFF, 0x04, 0xC1 );
    //SDL_SetColorKey( optimized, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );

    return optimized;
}

bool Sprite::Draw( SDL_Surface* dest, SDL_Surface* src, int x, int y )
{
      if(dest == NULL || src == NULL)
       {
                  return false;
       }

       SDL_Rect  destR;

       destR.x = x;
       destR.y = y;

       SDL_BlitSurface(src, NULL, dest, &destR);

        return true;
}




#endif

images という名前のフォルダーを作成し、その中に bg.png 500x400 というファイルを追加しました。黒い背景と白い線がいくつかあるので、それを背景として設定できます...

問題は、ロードしようとする画像ではなく、常に黒い画面が表示されることです

4

2 に答える 2

1

通常、メインループで画面をクリアし、スプライトを描画してから、バッファを反転させます。これは、ループを少し変更するだけで、既存のコードを使用して非常に簡単に実行できます。

while(p_running)
{
  SDL_PollEvent(&evt); // Poll for new events
  if(evt.type == SDL_QUIT)
  {
    p_running = false;
    break;
  }

  SDL_FillRect(m_pScreen, NULL, 0); // Clear the screen

  // Perform "game" logic here, like moving the sprite

  Sprite::Draw(m_pScreen, bg_image, 0, 0); // Draw the sprite

  SDL_Flip(m_pScreen); // Flip the buffers

}

この変更を行う場合は、ループの前にDraw呼び出しを削除する必要があることに注意してください。

于 2012-11-11T18:14:55.333 に答える
1

あなたは忘れたSDL_Flip()

while(p_running)
{
  SDL_WaitEvent(&evt);
  if(evt.type == SDL_QUIT)
    p_running = false;
  SDL_Flip(m_pScreen);
  ^^^^^^^^^^^^^^^^^^^^
}

そしておそらくあなたのIDEはアプリケーションの作業ディレクトリを変更します。その場合、フルパスで画像を開こうとします。

于 2012-11-11T18:03:26.843 に答える