SDL_Texture 渲染不正确

SDL_Texture not rendering properly

我正在制作一个带有 3D 数组的游戏板,它存储项目的位置(游戏板上每个 descrete x,y 位置的项目向量)。每个项目类型(项目的 Subclass)都有一个关联的精灵,它存储为一个纹理。下面给出存储纹理的代码

void render(){
        int x = 0;
        //for each row in the array
        for(vector<vector<Item*>> row : items){
            int y = 0;
            // for each column in the row
            for(vector<Item*> col : row){
                //Graphical positons
                int pos_x = x * CELL_WIDTH;
                int pos_y = y * CELL_HEIGHT;

                //Initalise the rectangle
                SDL_Rect rect;
                rect.x = pos_x;
                rect.y = pos_y;
                rect.w = CELL_WIDTH;
                rect.h = CELL_HEIGHT;
                // if the the list of items is empty
                

                if(col.size() > 0){
                    for(Item* item: col){
                        SDL_Texture *texture = NULL; 
                        texture = textureMap[item->typestring];
                        SDL_SetRenderDrawColor(renderer, 0, 0 ,0, 0);
                        SDL_RenderCopy(renderer, texture, nullptr, &rect);
                        SDL_RenderFillRect(renderer, &rect);
                    
                    }

                }
                else{
                    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
                    SDL_RenderFillRect(renderer, &rect);

                }
                SDL_RenderFillRect(renderer, &rect);
                y++;
                
            }
            x++;
            
        }
        SDL_RenderPresent(renderer);
        
    }

但是 none 的 sprite 渲染并且有一个空白屏幕。值得一提的是,如果将尝试用精灵填充矩形的代码更改为仅显示彩色方块,它就可以工作:

        void render(){
        int x = 0;
        //for each row in the array
        for(vector<vector<Item*>> row : items){
            int y = 0;
            // for each column in the row
            for(vector<Item*> col : row){
                //Graphical positons
                int pos_x = x * CELL_WIDTH;
                int pos_y = y * CELL_HEIGHT;

                //Initalise the rectangle
                SDL_Rect rect;
                rect.x = pos_x;
                rect.y = pos_y;
                rect.w = CELL_WIDTH;
                rect.h = CELL_HEIGHT;
                // if the the list of items is empty
                

                if(col.size() > 0){
                    for(Item* item: col){
                        SDL_SetRenderDrawColor(renderer, 100, 100, 100, 0);
                        SDL_RenderFillRect(renderer, &rect);
                
                    }

                }
                else{
                    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
                    SDL_RenderFillRect(renderer, &rect);

                }
                SDL_RenderFillRect(renderer, &rect);
                y++;
                
            }
            x++;
            
        }
        SDL_RenderPresent(renderer);
        
    }

此游戏屏幕中的结果,项目应位于的位置带有灰色方块

这里是从每个 class 中存储的 .png 文件路径字符串创建纹理并将其存储在 Map.

中的代码
            for(vector<vector<Item*>> row : items){
            for(vector<Item*> col : row){
                for(Item* item: col){
                    if(textureMap.find(item->typestring) == textureMap.end()){

                        SDL_Texture* texture = NULL;
                        SDL_Surface* temp = IMG_Load(item->imgpath);
                        
                        texture = SDL_CreateTextureFromSurface(renderer, temp);
                        SDL_FreeSurface(temp);
                        textureMap.insert({item->typestring, texture});
                        
                        
                        
                    }
                    
                }
            }

        }

我是 C++ 和 SDL2 的新手,有人能看出 SDL_Texture 的呈现方式有任何明显的问题吗?

这是因为您在 SDL_RenderCopy 之后使用了 SDL_RenderFillRect

SDL_RenderCopy 执行您想在屏幕上获得纹理的操作。但是 SDL_RenderFillRect 会用一种颜色填充一个区域。如果在同一个地方填充之前复制,颜色会覆盖纹理。

只需删除 SDL_RenderFillRect 即可正确显示纹理。