【问题标题】:SDL_surface that contains several images包含多个图像的 SDL_surface
【发布时间】:2012-11-26 04:11:22
【问题描述】:

假设我有一个SDL_Surface,它只是一张图片。 如果我想让SDL_Surface 拥有该图像的三个副本,一个在另一个之下怎么办?

我想出了这个功能,但它没有显示任何内容:

void ElementView::adjust() 
{
    int imageHeight = this->img->h;
    int desiredHeight = 3*imageHeight;

    int repetitions =  desiredHeight / imageHeight ;
    int remainder = desiredHeight % imageHeight ;

    SDL_Surface* newSurf = SDL_CreateRGBSurface(img->flags, img->w, desiredHeight, 32, img->format->Rmask, img->format->Gmask, img->format->Bmask,img->format->Amask);

    SDL_Rect rect;
    memset(&rect, 0, sizeof(SDL_Rect));
    rect.w = this->img->w;
    rect.h = this->img->h;

    for (int i = 0 ; i < repetitions ; i++) 
    {
        rect.y = i*imageHeight;
        SDL_BlitSurface(img,NULL,newSurf,&rect);
    }
    rect.y += remainder;
    SDL_BlitSurface(this->img,NULL,newSurf,&rect);

    if (newSurf != NULL) {
        SDL_FreeSurface(this->img);
        this->img = newSurf;
    }
}

【问题讨论】:

  • 有什么理由不能只对原始图像进行多次 blit 处理吗?
  • @Xymotech,我不应该触摸实际将表面绘制到屏幕上的代码。
  • 我认为问题在于img 不够大,无法在其中保存 3 个自身的副本。看起来没有创建任意大小的新表面的好方法。为什么不能触摸实际绘图的代码?
  • 我尝试使用SDL_CreateRGBSurface 创建一个与img 相同但具有所需高度的新表面,然后在其上进行blitting,但它显示的是一个空图像。

标签: c++ sdl


【解决方案1】:

我认为你应该

  • 创建一个长度是初始曲面的 3 倍的新曲面
  • 使用与您所拥有的 (SDL_BlitSurface) 类似的代码从 img 复制到新表面,但将目标作为新表面
  • 原始img 上的 SDL_FreeSurface
  • 将您的新表面分配给img

编辑:这是一些示例代码,虽然没有时间测试它...

void adjust(SDL_Surface** img)
{
    SDL_PixelFormat *fmt = (*img)->format;
    SDL_Surface* newSurf = SDL_CreateRGBSurface((*img)->flags, (*img)->w, (*img)->h * 3, fmt->BytesPerPixel * 8, fmt->Rmask, fmt->Gmask, fmt->Bmask, fmt->Amask);

    SDL_Rect rect;
    memset(&rect, 0, sizeof(SDL_Rect));
    rect.w = (*img)->w;
    rect.h = (*img)->h;

    int i = 0;
    for (i ; i < 3; i++) 
    {
        SDL_BlitSurface(*img,NULL,newSurf,&rect);
        rect.y += (*img)->h;
    }

    SDL_FreeSurface(*img);
    *img = newSurf;
}

【讨论】:

  • @l19 你确定你真的改变了真实的形象,而不仅仅是你的指针吗?您可能释放了正确的图像,然后忘记保存新图像。提示:您需要一个双指针才能正确执行此操作。
  • SDL_Surface* surface = SDL_CreateRGBSurface(....); SDL_BlitSurface(img,NULL,surface,&amp;rect); if (surface != NULL) { SDL_FreeSurface(img); img = surface; }
  • @l19 就像 Xymotech 说的,传递一个指向您的 SDL_Surface* img 的指针,所以 SDL_Surface** img 或引用,您需要更改它指向的位置!
  • @l19 不不不!按照我给你的步骤,在你复制数据之前你不能释放,使用 SDL_BlitSurface
  • @emartel,查看我之前的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多