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;

}

雪碧.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

你忘了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 回答
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 回答