sdl image redimensionar imagem [RESOLVIDO]

1. sdl image redimensionar imagem [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 26/07/2017 - 22:36h

Olá, estou aprendendo sobre sdl no c++ e estou tentando redimensionar uma imagem mas não estou conseguindo informação de como fazer isso.

SDL_Surface *fundo, *carregaFundo;
carregaFundo = IMG_Load("sprite.png");
fundo = SDL_DisplayFormat(carregaFundo);
SDL_FillRect(tela, NULL, 0);
SDL_BlitSurface(fundo, NULL, tela, NULL);


Até ai tudo bem, mas gostaria que fosse possivel com a mesma imagem, que o jogo funcione com várias resoluçoes de tela..
Ou vou ter que preparar uma imagem pra cada resolucao de tela existente? Isso seria ruim deixaria o jogo bem maior, seria mais simples se tivesse como fazer um rezise, se alguem souber

Na internet encontrei muita coisa a respeito
por exemplo
No codigo antes do while

SDL_Rect clip, clip2, clip3, clip4;
clip.x=0;
clip.y=0;
clip.w=800;
clip.h=600;

Dentro do while

.....
SDL_BlitSurface(fundo, &tela, tela, NULL);
....


Mas esse código não resolveu meu problema, ele não redimensiona a foto, o que ele faz é tipo cortar ela, e o que quero é reduzir ela..

Alguns lugares dizem que isso não é possivel, mas poxa? Como é que faz pro jogo ter várias resoluções?


  


2. MELHOR RESPOSTA

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 27/07/2017 - 00:21h

Desculpe a demora, minha internet caiu. É que, por padrão, o SDL (tanto 1.2 como o 2) só carrega bmp. Mas se quiser mais suporte de imagem use a lib SDL-image, é do mesmo jeito que você usa no SDL1.2, muda só um tiquinho, exemplo de uso:

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

#include <cstdio>
//compile com g++ -o exemplo exemplo.cpp -lSDL2 -lSDL2_image

int main (int argc, char **args)
{
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("SDL_error: %s\n", SDL_GetError());
return 1;
}

if (IMG_Init(IMG_INIT_PNG) == 0)
{
printf("IMG_Init: %s\n", IMG_GetError());
return 1;
}

// cira uma janela com nome Teste, na posição X=10,Y=20 da tela do monitor com tamanho 640 por 480
SDL_Window * tela = SDL_CreateWindow("Teste", 10,20,640,480, SDL_WINDOW_SHOWN);
if (tela == NULL)
{
printf("SDL_Error: %s\n", SDL_GetError());
return 1;
}
//cria um renderer para desenhar na tela
SDL_Renderer * renderer = SDL_CreateRenderer(tela, 0, SDL_RENDERER_ACCELERATED);
if (renderer == NULL)
{
printf("SDL_Error: %s\n", SDL_GetError());
return 1;
}

// cria uma textira (imagem) para desenhar na tela
SDL_Texture * textura = IMG_LoadTexture(renderer, "COLOQUE A IMAGEM AQUI.png");
if (textura == NULL)
{
printf("IMG_Error: %s\n", IMG_GetError());
return 1;
}

SDL_Rect fonte = {0,0,32,32};
SDL_Rect destino = {0,0,128,128};
SDL_RenderCopy(renderer, textura, &fonte, &destino);//cola a imagem no buffer
SDL_RenderPresent(renderer);//joga o buffer na tela

SDL_Delay(5000);

SDL_DestroyTexture(textura);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(tela);
IMG_Quit();//libera a SDL-image
SDL_Quit();//libera o sdl

return 0;
}


Ainda vou atualizar o artigo de SDL que fiz aqui, na época que fiz tava perto do SDL1.2 "se vencer".

3. Re: sdl image redimensionar imagem [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 26/07/2017 - 23:03h

desde o comeco queria estar usando sdl2. É que todos exemplo que testei de sdl2 eles usam esse formato bmp ai, e eu quero png.. e o exemplo mais facil de entender que encontrei foi pra sdl


4. Re: sdl image redimensionar imagem [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 27/07/2017 - 01:43h

Consegui, to tentando colocar o loop agora, só que veio algumas duvidas...
Qual desses comandos realmente grava a imagem?
SDL_RenderCopy(renderer, textura, &fonte, &destino);
SDL_RenderPresent(renderer);//joga o buffer na tela

No sdl eu usava FillRect pra tudo, mas agora só isso basta? RenderPresent?

E se eu quiser colocar uma outra imagem, só que uma imagem na qual eu nao precise redimensionar? Ou terei de usar outro comando, ou o RenderPresent dá pra colocar uma imagem direto na tela?


5. Re: sdl image redimensionar imagem [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 27/07/2017 - 02:01h

Deu certo, rs, ficou assim:

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

#include <cstdio>

int main(int argc, char **argv)
{
SDL_Init(SDL_INIT_VIDEO);
IMG_Init(IMG_INIT_PNG);

SDL_Window * tela = SDL_CreateWindow("Teste", 10,20,1000,750, SDL_WINDOW_SHOWN);
SDL_Renderer * renderer = SDL_CreateRenderer(tela, 0, SDL_RENDERER_ACCELERATED);

SDL_Texture * textura = IMG_LoadTexture(renderer, "sprite.png");
SDL_Texture * textura2 = IMG_LoadTexture(renderer, "0.png");

SDL_Rect fonte = {0,0,1000,750};
SDL_Rect fonte2 = {0,0,30,41};
SDL_Rect destino = {0,0,800,600};
SDL_Rect destino2 = {0,0,30,41};


bool executando = true;

while(executando)
{
SDL_Event evento;
while(SDL_PollEvent(&evento))
{
switch(evento.type)
{
case SDL_QUIT:
executando=false;
break;
case SDL_KEYDOWN:
switch(evento.key.keysym.sym)
{
case SDLK_ESCAPE:
executando=false;
break;

}

}
}
SDL_RenderCopy(renderer, textura, &fonte, &destino);
SDL_RenderCopy(renderer, textura2, &fonte2, &destino2);
SDL_RenderPresent(renderer);//joga o buffer na tela

if(executando) SDL_Delay(200);
}
SDL_DestroyTexture(textura);
SDL_DestroyTexture(textura2);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(tela);
IMG_Quit();//libera a SDL-image
SDL_Quit();//libera o sdl

}



6. Re: sdl image redimensionar imagem [RESOLVIDO]

shoujo
shoujo

(usa Slackware)

Enviado em 27/07/2017 - 02:21h

Estava procurando por um clear para limpar a tela, lembro que no javascript tinha que fazer isso, não sei se no sdl precisa, e então?
Encontrei esse comando SDL_RenderClear, será que é ele






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts