【问题标题】:Renderer troubles with SDL2 and XcodeSDL2 和 Xcode 的渲染器问题
【发布时间】:2018-10-17 23:31:22
【问题描述】:

我尝试使用 SDL2 用 C 语言编写一些东西,但渲染器遇到了一些问题。

我的代码是:

#include <stdbool.h>
#include "main.h"

#define WND_WIDTH   800
#define WND_HEIGHT  600

void displayText(SDL_Renderer *rdr,TTF_Font *font,char *str,SDL_Color *color,SDL_Rect *text_coo) 

{
SDL_Surface *text=TTF_RenderText_Blended(font,str,*color);
SDL_Texture *tx_text=SDL_CreateTextureFromSurface(rdr,text);
SDL_QueryTexture(tx_text,NULL,NULL,&text_coo->w,&text_coo->h);
text_coo->x=(WND_WIDTH-text_coo->w)/2;
text_coo->y=(WND_HEIGHT-text_coo->h)/2;
SDL_RenderCopy(rdr,tx_text,NULL,text_coo);
SDL_RenderPresent(rdr);
SDL_DestroyTexture(tx_text);
SDL_FreeSurface(text);
}

int main(int argc,char *argv[]) 
{
  SDL_Window *wnd;
  SDL_Renderer *rdr;
  SDL_Rect text_coo;

  SDL_Init(SDL_INIT_VIDEO);
  TTF_Init();
  TTF_Font *font=TTF_OpenFont("/Users/coldpe/Documents/SDLProject2/SDLProject/Batang.ttf",24);
         wnd=SDL_CreateWindow("Noname",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WND_WIDTH,WND_HEIGHT,SDL_WINDOW_HIDDEN);

rdr=SDL_CreateRenderer(wnd,-1,SDL_RENDERER_ACCELERATED);
SDL_ShowWindow(wnd);
SDL_SetRenderDrawColor(rdr,64,64,64,0xff);
SDL_RenderClear(rdr);
SDL_SetRenderDrawColor(rdr,128,128,128,0xff);
SDL_Rect r={WND_WIDTH/2-100,WND_HEIGHT/2-100,200,200};
SDL_RenderFillRect(rdr,&r);
SDL_SetRenderDrawColor(rdr,64,64,64,0xff);

SDL_Color normal_color={0,0,255,0xff};
SDL_Color selected_color={0,255,0,0xff};
SDL_Color *pc=&normal_color;
displayText(rdr,font,"Hello",pc,&text_coo);
bool done=false;

while(!done) {
    SDL_Event event;
    if(SDL_PollEvent(&event)) {

        if(event.type==SDL_QUIT)
            done=true;

        if(event.type==SDL_MOUSEMOTION) 
{
            if(event.motion.x>=text_coo.x && event.motion.x<=text_coo.x+text_coo.w &&
               event.motion.y>=text_coo.y && event.motion.y<=text_coo.y+text_coo.h) {
                if(pc!=&selected_color) {
                    pc=&selected_color;
                    displayText(rdr,font,"Hello",pc,&text_coo);
                }
            }
            else
                if(pc!=&normal_color) {
                    pc=&normal_color;
                    displayText(rdr,font,"Hello",pc,&text_coo);
                }
        }
    }
}

SDL_DestroyRenderer(rdr);
SDL_DestroyWindow(wnd);
TTF_CloseFont(font);
TTF_Quit();
SDL_Quit();

return(0);
}

我已经尝试在其他论坛的网站寻求帮助,我应该在文本中没有鼠标的情况下获得此图像:

还有这张图片用鼠标在文字上:

但是,由于我不知道的原因,这是我真正用鼠标而不是在文本上获得的图像:

这是我用鼠标在文本上获得的结果:

为什么当鼠标在文本上时,“背景”是黑色的?

我确信这不是代码的问题,因为此代码适用于其他人... 供您参考,我在 Xcode 9 中(Xcode 10 与 OpenGL 有一些错误)。

有人有答案吗?

【问题讨论】:

    标签: c xcode sdl


    【解决方案1】:

    我认为这里的问题是您只用所需的颜色清除后缓冲区一次。渲染下一帧时,旧的后台缓冲区内容消失了,因此您需要再次重绘它。那就是displayText应该以

    开头
    SDL_SetRenderDrawColor(rdr,64,64,64,0xff);
    SDL_RenderClear(rdr);
    SDL_SetRenderDrawColor(rdr,128,128,128,0xff);
    SDL_Rect r={WND_WIDTH/2-100,WND_HEIGHT/2-100,200,200};
    SDL_RenderFillRect(rdr,&r);
    SDL_SetRenderDrawColor(rdr,64,64,64,0xff);
    

    【讨论】:

    • 我完全同意你的看法。但是,这段代码是一个非常短的“测试”代码。使用此代码,我只想“重绘”屏幕的一部分。我用更长的代码尝试了另一个程序,我遇到了这个问题。因此,您的解决方案效果很好,但我不想清除屏幕并“重绘”所有内容,因为这里没有太多要重绘的东西,但是使用更复杂的代码,那会很痛苦。我不确定我是否很清楚,但总而言之,我只想重绘屏幕的一部分(例如在游戏中,对话框框或游戏“上方”的菜单框)。
    • @Coldpe 然后您可以渲染到纹理,然后将该纹理复制到后台缓冲区。
    • 是的,我认为这是“不太糟糕”的解决方案。 SDL 的文档讲述了 SDL_RenderPresent :“每次出现后应该认为后缓冲区无效”。我认为这就是为什么我不应该按照我想要的方式进行的原因。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多