2016-07-31 6 views
-2

Ich versuche es mit SDL_RenderCopy() Aber ich bekomme nur eine Blackbox. Das ist mein Code.Wie bekomme ich einen Teil der Textur in SDL2?

static SDL_Texture* GetAreaTextrue(SDL_Rect rect, SDL_Renderer* renderer, SDL_Texture* source) 
{ 
    SDL_Texture* result = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, rect.w, rect.h);   
    SDL_SetRenderTarget(renderer, result); 
    SDL_RenderCopy(renderer, source, &rect, NULL); 
    SDL_RenderPresent(renderer);   
    return result; 
} 

Was ist der richtige Betrieb?

Antwort

0

EDIT:

Was wollen Sie hier zu tun ist, einen Teil der Textur auf den Bildschirm übertragen.

Es gibt einen Weg, dies zu tun, indem Sie SDL_RenderCopy verwenden, aber indem Sie dies tun, "nehmen" Sie einfach den Teil, den Sie von Ihrer Textur wünschen und "schlagen" Sie auf Ihren Bildschirm.

Was Sie (nach meinem Verständnis) wollen, ist ein Teil einer Textur zu nehmen und speichern Sie es in eine andere Textur-Variable, die anschließend auf dem Bildschirm gerendert werden kann.

Die erste Lösung für das Problem geht so:

// load your image in a SDL_Texture variable (myTexture for example) 
// if the image is (256,128) and you want to render only the first half 
// you need a rectangle of the same size as that part of the image 

SDL_Rect imgPartRect; 
imgPartRect.x = 0; 
imgPartRect.y = 0; 
imgPartRect.w = 32; 
imgPartRect.h = 32; 

// and the program loop should have a draw block looking like this: 

SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF); 
SDL_RenderClear(renderer); 
SDL_RenderCopy(renderer, myTexture, &imgPartRect, NULL); 
SDL_RenderPresent(renderer); 

Der Ansatz, den Sie hat eine mittlere Textur zu verwenden versuchen, die Sie auf machen und Sie danach, dass die Textur auf den Bildschirm übertragen. Das Problem hierbei ist, dass Sie den Renderer so einstellen, dass er auf der soeben erstellten Textur basiert, aber Sie den Renderer nie zurücksetzen, um das Standardziel (den Bildschirm) zu verwenden.

Wie Sie in der SDL-Dokumentation here sehen können, erhält der zweite Parameter die Textur, die der Verarbeiter zeichnen soll, oder NULL, wenn Sie ihn auf das Standardziel (den Bildschirm) zurücksetzen möchten.

int SDL_SetRenderTarget (SDL_Renderer * Renderer, SDL_Texture * Textur)

Wo:

  • Renderer

die Rendering-Kontext

  • Textur

die gezielte Textur, die mit der SDL_TEXTUREACCESS_TARGET Flagge oder NULL für die Standard-Renderziel

erstellt werden muss Läßt das gleiche Beispiel wie zuvor verwenden:

// first off let's build the function that you speak of 
SDL_Texture* GetAreaTextrue(SDL_Rect rect, SDL_Renderer* renderer, SDL_Texture* source) 
{ 
    SDL_Texture* result = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, rect.w, rect.h);   
    SDL_SetRenderTarget(renderer, result); 
    SDL_RenderCopy(renderer, source, &rect, NULL); 
    // the folowing line should reset the target to default(the screen) 
    SDL_SetRenderTarget(renderer, NULL); 
    // I also removed the RenderPresent funcion as it is not needed here  
    return result; 
} 

// load your image in a SDL_Texture variable (myTexture for example) 
// if the image is (256,128) and you want to render only the first half 
// you need a rectangle of the same size as that part of the image 

SDL_Rect imgPartRect; 
imgPartRect.x = 0; 
imgPartRect.y = 0; 
imgPartRect.w = 32; 
imgPartRect.h = 32; 

// now we use the function from above to build another texture 

SDL_Texture* myTexturePart = GetAreaTextrue(imgPartRect, renderer, myTexture); 

// and the program loop should have a draw block looking like this: 

SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF); 
SDL_RenderClear(renderer); 
// here we render the whole newly created texture as it contains only a part of myTexture 
SDL_RenderCopy(renderer, myTexturePart, NULL, NULL); 
SDL_RenderPresent(renderer); 

ich nicht tun wissen, was Sie tun wollen, aber ich empfehle den ersten Weg.

Verwandte Themen