【问题标题】:Problems blitting surface in SDL from vector of SDL_Rect从 SDL_Rect 的向量中的 SDL 中的 blitting 表面问题
【发布时间】:2011-08-24 23:36:11
【问题描述】:
#include "main.h"

SDL_Surface* screen; //The screen Surface
SDL_Surface* Snake_Body; //The snake surface (shape to draw)

SDL_Rect rectangle1; //Red border
SDL_Rect rectangle2; //Black Board

SDL_Event event;    //Keyboard handling
direction facing;

std::vector<SDL_Rect> snake (3); //Snake body locations



SDL_Surface *LoadSnake()
{
    SDL_Surface* temporary;

    Uint32 rmask,gmask,bmask,amask;

    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
        rmask = 0xff000000;
        gmask = 0x00ff0000;
        bmask = 0x0000ff00;
        amask = 0x000000ff;
    #else
        rmask = 0x000000ff;
        gmask = 0x0000ff00;
        bmask = 0x00ff0000;
        amask = 0xff000000;
    #endif

    temporary = SDL_CreateRGBSurface(SDL_SWSURFACE,5,5,32,rmask,gmask,bmask,amask); //Make an empty surface

    SDL_FillRect(temporary,NULL,SDL_MapRGB(screen->format,0,255,0)); //Fill it with color

    return temporary; //return it
}


bool init()
{
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1 )
        return false;

    screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);

    if(!screen)
        return false;

    SDL_WM_SetCaption("Snake v0.1",NULL);

    Snake_Body = LoadSnake();

    rectangle1.x = 0;  //Red border
    rectangle1.y = 0;
    rectangle1.w = 500;
    rectangle1.h = 500;

    rectangle2.x = 25; //Black background
    rectangle2.y = 25;
    rectangle2.w = 450;
    rectangle2.h = 450;

    return true;
}

SDL_Surface *loadImage(const char* filename)
{
    SDL_Surface *loadedImage = NULL;
    SDL_Surface *optimizedImage = NULL;

    loadedImage = SDL_LoadBMP(filename);

    if (loadedImage)
    {
        optimizedImage = SDL_DisplayFormat(loadedImage);
        SDL_FreeSurface(loadedImage);
    }

    return optimizedImage;
}

void pollInput()
{
    while(SDL_PollEvent(&event))
    {
        if(event.type == SDL_QUIT)
        {
            end = true;
        }

        if(event.type == SDL_KEYUP)
        {
            switch(event.key.keysym.sym)
            {
            case SDLK_ESCAPE:
                end = true; break;
            case SDLK_UP:
                facing = up; break;
            case SDLK_DOWN:
                facing = down; break;
            case SDLK_RIGHT:
                facing = right; break;
            case SDLK_LEFT:
                facing = left; break;
            }
        }
    }
}

void Update()
{
    for(unsigned int i = 1; i < snake.size(); i++)
    {
        snake[i] = snake[i-1];
    }

    switch(facing)
    {
    case up:
        snake[0].y -= 5; break;
    case down:
        snake[0].y += 5; break;
    case left:
        snake[0].x -= 5; break;
    case right:
        snake[0].x += 5; break;
    }

}

void SetUp()
{
    snake[0].x = 250;
    snake[0].y = 250;


    snake[1].x = 250 + 15;
    snake[1].y = 250;

    snake[2].x = 250 + 15 + 15;
    snake[2].y = 250;
}

void Draw()
{
    unsigned short i;
    int x;

    SDL_FillRect(screen,&rectangle1,SDL_MapRGB(screen->format,255,0,0)); //Red Border

    SDL_FillRect(screen,&rectangle2,SDL_MapRGB(screen->format,0,0,0)); //Black Board

    for(i = 0; i < snake.size(); i++)
    {
        assert(SDL_BlitSurface(Snake_Body,NULL,screen,&snake[i]) == 0);
    }

    SDL_Flip(screen);
}

void Finish()
{
    SDL_FreeSurface(Snake_Body);

    SDL_Quit();
}

我有这段代码,这是我正在研究的用 SDL 编写的蛇游戏,但是,我似乎遇到了问题。

SDL 可以很好地绘制背景,但由于某种原因它不会绘制蛇。 我在那里设置了一个断言来检查 SDL_BlitSurface 函数是否成功,它返回一个正常值 (0),即使屏幕上什么也没有显示。

我将蛇节点的纹理设置为单个绿色矩形 Snake_Body,并将需要在 std::vector 容器中绘制的位置编码,因此我可以调用 SDL_BlitSurface() 函数向量中的每个元素,我已经跟踪了这些值并且它们正在正确更改,但由于某种原因,图像仍然没有被绘制。我还尝试用相同位置的 SDL_FillRect() 替换我的 SDL_BlitSurface() 函数,但它没有任何改变。

编辑:我在此编辑下方添加了我的主循环:

#include "main.h"

bool end = false;
Uint32 time;

int main(int argc,char* argv[])
{
    if(!init())
        return 1;

    SetUp();

    time = SDL_GetTicks();

    while(!end)
    {
        if(time+1000<SDL_GetTicks())
        {
            Update();
            time = SDL_GetTicks();
        }

        pollInput();
        Draw();
    }

    Finish();

    return 0;
}

【问题讨论】:

    标签: c++ visual-studio-2010 stl sdl


    【解决方案1】:

    您似乎没有对蛇的位置进行任何边界检查以确保它停留在屏幕上。因此,当它离开屏幕时,它会保持关闭状态并且永远不会回来。我的猜测是你没有正确调节帧速率,或者你根本没有调节它(我需要看到你的主循环),所以蛇从屏幕上移动得太快,你甚至看不到它。

    如果不调用Update 函数会怎样?

    【讨论】:

    • 我在 while 循环中尽可能多地绘制,并每 1000 毫秒更新蛇的位置(提前 5 个像素),但我不进行任何边界检查。但是,我确实添加了边界检查,只允许蛇移动到屏幕边缘,并删除了背景绘图,但仍然没有发生任何事情。
    • @Amiskoh:我还是想看看你的主循环。
    • 没什么,但是我已经确定问题出在我的表面创建上,因为当我在绘制的相同坐标处将 SDL_BlitSurface 替换为 SDL_FillRect 时,知道我可能错在哪里吗?
    【解决方案2】:

    如果您发布了整个代码,则缺少对 SetUp 的调用。这不会设置蛇,它可能在屏幕之外的某个地方,因为向量包含垃圾。此外,即使 SDL_BlitSurface 忽略 dstrect 宽度和高度,最好将它们初始化为一些有意义的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多