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
即可正确显示纹理。
我正在制作一个带有 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
即可正确显示纹理。