C++ SDL,将图像粘贴到屏幕的一部分

C++ SDL,将图像粘贴到屏幕的一部分,c++,sdl,C++,Sdl,我有一个棋盘游戏,内部使用矩阵。我为它创建了一个非常简单的图形用户界面,它包含在使用矩形生成的板中。board函数gimprimir()详细说明如下:它获取矩阵,并在需要时将其转换为创建不同类型的矩形 现在我需要在屏幕的一部分插入一个图像。到目前为止,我没有找到任何教程。其中一些已经过时(不适用于SDL2),或者根本没有考虑将图像放在屏幕的一部分的可能性。例如,本教程: 教您如何将图像放在屏幕上,而不是如何将其加载到屏幕的某个部分 每当我试图修改它时,就会出现分段错误 我想保持简单。图像格式为

我有一个棋盘游戏,内部使用矩阵。我为它创建了一个非常简单的图形用户界面,它包含在使用矩形生成的板中。board函数gimprimir()详细说明如下:它获取矩阵,并在需要时将其转换为创建不同类型的矩形

现在我需要在屏幕的一部分插入一个图像。到目前为止,我没有找到任何教程。其中一些已经过时(不适用于SDL2),或者根本没有考虑将图像放在屏幕的一部分的可能性。例如,本教程:

教您如何将图像放在屏幕上,而不是如何将其加载到屏幕的某个部分

每当我试图修改它时,就会出现分段错误

我想保持简单。图像格式为.bmp

这是我当前的代码:

bool loadMedia();                               
void close();                                  
SDL_Texture* loadTexture( std::string path );   
SDL_Window* gWindow = NULL;                     
SDL_Renderer* gRenderer = NULL;

const int SCREEN_WIDTH = 1200;
const int SCREEN_HEIGHT = 680;

int main(int argc, char* args[]){
  nodo a;
 if( !init() ){
        cout << "Failed to initialize!\n" ;
 }
 else{
        if(!loadMedia()){
                cout << "Failed to load media!\n";
        }
        else{
                bool quit = false;      // flag ciclo principal
                SDL_Event e;            // variables manejo de eventos
                SDL_Event t;
                gimprimir(a);
        }
}

}
我想把这两个都放在屏幕上。其思想是首先加载图像,使其永远留在屏幕的一部分,然后更新用gimprimir()生成的矩形

是用于从一个曲面复制到另一个曲面的SDL函数,它有两个参数,srcrect表示源,dstrect表示目标

从SDL1.2到SDL2,SDL_BlitSurface没有太大变化,因此,使用它的旧示例应该仍然有效

获取屏幕上的图像
示例中,您建议将空指针用于src和dst rect,空rect意味着将整个src曲面复制到
顶部的目标中,左=0,0
,最大大小等于目标大小(如果源更大,则应裁剪)

要blit部分映像,只需指定src和dst rect:

        SDL_Rect srcrect = { 0, 0, 100, 100 };
        SDL_Rect dstrect = { 50, 50, 100, 100 };

        //Apply the image
        SDL_BlitSurface( gHelloWorld, &srcrect, gScreenSurface, &dstrect );
在这种情况下,从源表面(
gHelloWorld
)到目标表面(
gScreenSurface
)的
top,left=0,0
,宽度为100,100
)的
top,left=50,50

如何将其与其他类型的对象一起加载

抱歉,我不清楚您所说的其他类型的对象是什么意思

SDL_BlitSurface(),但由于您使用的是SDL2,您可能主要使用的是SDL_纹理,而不是SDL_曲面。如果是这种情况,将一个纹理复制到另一个纹理或屏幕上的最简单方法是使用keltar提到的
SDL\u RenderCopy()
。使用SDL_纹理的优点如下所述:

如本文所述,
SDL\u RenderCopy()
接受四个参数:指向SDL\u渲染器的指针、指向源纹理的指针、指向源矩形的指针和指向目标矩形的指针。默认情况下,纹理将复制到屏幕上,但您可以通过使用SDL_SetRenderTarget()设置目标纹理来复制到其他纹理上


关于源矩形和目标矩形的所有内容都来自SDL_BlitSurface。

不太清楚您在问什么。您可能需要的是。因此,如果我想将整个图像粘贴到屏幕的一部分,我可以使用
SDL_Rect srcret=NULL
SDL_Rect dstrect={50,50,100,100}好,现在我可以在屏幕的一部分加载图像。问题是如果我加载它并添加
SDL\u RenderPresent(gRenderer)//应用图像SDL_BlitSurface(cont、NULL、gscreensSurface和dstrect);SDL_更新内表面(gWindow)在gimprimir()dissapear中创建的矩形。我想把这两个都放在屏幕上。其思想是首先加载图像,使其永远留在屏幕的一部分,然后更新用gimprimir()生成的矩形@d1x1。绘制gimprimir矩形,2。点击图片,3。renderpresent然后是4。updatewindowsurface,应work@D1X很高兴它起作用了。如果你想解释其他类型的对象,也许我可以帮你(你是说其他类型的图像文件吗?)是的,我指的是其他类型的图像文件,但我找到了一个教程来介绍它。再次感谢你。
    void gimprimir(nodo aa){

 //Clear screen
 SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
 SDL_RenderClear( gRenderer );
 int i,j;
 for (i=1; i<=17; i++){
    if (i%2==1){
        for (j=1; j<=17 ; j++){
            if (j%2==1){
                if (aa.p1[0]==i && aa.p1[1]==j){  // FICHA 1
                    SDL_Rect fillRect = {(50+SCREEN_WIDTH/11)+(SCREEN_WIDTH/11)*(j-1)/2+34, (SCREEN_HEIGHT/11)+(SCREEN_HEIGHT/11)*(i-1)/2+34, SCREEN_WIDTH/12, SCREEN_HEIGHT/12};
                                    SDL_SetRenderDrawColor( gRenderer, 0xff, 0xcc, 0x66, 0xFF );
                                SDL_RenderFillRect( gRenderer, &fillRect );
                }
                else{
                                if (aa.p2[0]==i && aa.p2[1]==j){   // FICHA 2
                                        SDL_Rect fillRect = {(50+SCREEN_WIDTH/11)+(SCREEN_WIDTH/11)*(j-1)/2+34, (SCREEN_HEIGHT/11)+(SCREEN_HEIGHT/11)*(i-1)/2+34, SCREEN_WIDTH/12, SCREEN_HEIGHT/12};
                                        SDL_SetRenderDrawColor( gRenderer, 0x6E, 0x2C, 0x67, 0xFF );
                                        SDL_RenderFillRect( gRenderer, &fillRect );
                                }
                    else{                   // CASILLA VACÍA
                        SDL_Rect fillRect = {(50+SCREEN_WIDTH/11)+(SCREEN_WIDTH/11)*(j-1)/2+34, (SCREEN_HEIGHT/11)+(SCREEN_HEIGHT/11)*(i-1)/2+34, SCREEN_WIDTH/12, SCREEN_HEIGHT/12};
                                        SDL_SetRenderDrawColor( gRenderer, 0x8B, 0x45, 0x13, 0xFF);
                                        SDL_RenderFillRect( gRenderer, &fillRect );
                    }
                }
            }
        }
    }
}
                SDL_RenderPresent( gRenderer );

}
bool loadMedia()
{
        //Loading success flag
        bool success = true;

        //Nothing to load
        return success;
}
        SDL_Rect srcrect = { 0, 0, 100, 100 };
        SDL_Rect dstrect = { 50, 50, 100, 100 };

        //Apply the image
        SDL_BlitSurface( gHelloWorld, &srcrect, gScreenSurface, &dstrect );