2016-09-13 60 views
0

爲了使按鈕,創建和渲染紋理方式:SDL 2.0放大質地

typedef struct{ 
    SDL_Rect pos; 
    SDL_Texture* texture; 
    int hovered; 
} button; 

button getButton(int x, int y, char * label, TTF_Font* font, SDL_Color color){ 
    button btn; 
    btn.hovered = false; 
    btn.pos.x = x; 
    btn.pos.y = y; 
    SDL_Surface* surface = TTF_RenderText_Solid(font, label, color); 
    btn.pos.w = surface->w; 
    btn.pos.h = surface->h; 
    btn.texture = SDL_CreateTextureFromSurface(renderer, surface); 
    SDL_FreeSurface(surface); 
    return btn; 
} 

void drawButton(button btn){ 
    SDL_RenderCopyEx(renderer, btn.texture, NULL, &btn.pos, 0, NULL, SDL_FLIP_NONE); 
    if(btn.hovered){ 
     SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0x00); 
     SDL_RenderDrawRect(renderer, &btn.pos); 
} 

的問題是,我得到的紋理,其大小等於標籤之一。我怎樣才能增加紋理像素的大小而不拉伸它即在它的側面添加空白空間?

+1

到目前爲止您嘗試過了什麼?哪個版本的SDL?渲染按鈕的代碼在哪裏? –

+0

@ E_net4編輯的問題來表示渲染和版本。的SDL。沒有真正嘗試過任何東西,因爲不能提出任何想法 – osamurai

回答

0

喜歡的東西

void drawButton(button btn){ 
    SDL_RenderCopyEx(renderer, btn.texture, NULL, &btn.pos, 0, NULL, SDL_FLIP_NONE); 
    if(btn.hovered){ 
     int padding = 10; 
     SDL_Rect pos = {btn.pos.x - padding, btn.pos.y - padding, 
         btn.pos.w + 2*padding, btn.pos.h + 2*padding }; 
     SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0x00); 
     SDL_RenderDrawRect(renderer, &pos); 
    } 
} 

這樣只有矩形的大小而變化,很明顯,我只是拉10填充的大小憑空的,你會想挑事適當自己。

+0

謝謝你的回答!我正在考慮類似的方式,但這會導致處理鼠標移動時遇到一些麻煩,所以我將不得不在我的結構中添加另一個SDL_Rect字段,這在我看來是錯誤的 – osamurai

+0

@osamurai兩件事,我只是修復了我發佈的代碼中的一個錯誤,和兩個,沒有按鈕結構中的'SDL_Rect'沒有被改變,所以這將始終呈現在相同的地方。這個錯誤是我忘記改變'SDL_RenderDrawRect()'使用臨時的'SDL_Rect' – Spudd86

+0

其他地方(在鼠標處理函數中)的代碼是這樣的: 'if((x> = btn.pos.x && x < = btn.pos.x + btn.pos.w)&& ...))btn.hovered = true;'這意味着我將不得不復制這個臨時變量 – osamurai

0

找到了一個方法來做到這一點。要放大紋理,請創建代表按鈕背景的曲面,然後將它們合併:

button getButton(int x, int y, char * label, TTF_Font* font, SDL_Color color){ 
    button btn; 
    btn.hovered = false; 
    btn.pos.x = x; 
    btn.pos.y = y; 

    SDL_Surface* surface = TTF_RenderText_Solid(font, label, color); 
    SDL_Surface* back = SDL_CreateRGBSurface(0, surface->w+10, surface->h+10, 
              32, 0, 0, 0, 0);// create a black background 
    SDL_Rect t = {5, 5, back->w, back->w}; // place in a background to place label 
    SDL_BlitSurface(surface, NULL, back, &t); // combining surfaces 
    btn.pos.w = back->w; 
    btn.pos.h = back->h; 

    btn.texture = SDL_CreateTextureFromSurface(renderer, back); 
    SDL_FreeSurface(surface); 
    return btn; 
}