Anúncio
[Resolvido] Tutorial: Como Colocar a Imagem de Introdução em Tela Cheia
Salve, família! Eu vi que algumas pessoas estavam com dúvida sobre como colocar a imagem do logo em tela cheia, assim como todas as imagens de carregamento. Por isso, venho aqui com um tutorial simples e explicativo para mostrar como fazer isso.
Passo 1: Entender o Problema no Código Original
Antes de corrigir, é bom entender por que isso acontece.
No seu código original, você tá usando uma função do Windows chamada BitBlt. Essa função funciona tipo um “carimbo”: ela pega um pedaço da imagem e cola em outro lugar, mas sempre mantendo o tamanho original. O código calcula o centro da tela e “carimba” a sua imagem de 800x600 lá. Por isso que ela fica pequena e centralizada em resoluções maiores.
A nossa ideia aqui é trocar esse “carimbo” por uma função mais forte, chamada StretchBlt, que é tipo um “projetor” — ela consegue esticar ou reduzir a imagem pra ocupar direitinho o espaço que a gente definir.
Passo 2: Achar a Função e o Arquivo Certo
Toda a lógica pra mostrar a imagem de introdução tá dentro de uma função só, no arquivo principal do cliente.
Vai até a pasta: SrcGame/src/
Abre o arquivo: Winmain.cpp (ou outro com nome parecido que tenha a função WinMain)
Procura (Ctrl+F) pela função chamada LoadScreen. É essa que a gente vai mexer.
Passo 3: Trocar o Código Antigo pelo Novo
Agora é só substituir a parte antiga de desenhar a imagem pela nova, usando o StretchBlt.
Seleciona a sua função LoadScreen inteira e cola o código novo no lugar. Os comentários vão explicando o que cada parte faz.
// Esta função substitui a sua versão original de LoadScreen void LoadScreen(char* filename, HINSTANCE hInst, HWND hWnd) { // Primeiro, carregamos a imagem do ficheiro. // Usamos 0, 0 para que a imagem seja carregada com o seu tamanho original, o que é mais eficiente. HBITMAP hBitmap = (HBITMAP)LoadImage(hInst, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // Verificação de segurança: se a imagem não for encontrada, exibe uma mensagem e sai. if (!hBitmap) { MessageBox(NULL, "Erro ao carregar a imagem de introdução.", "Erro de Imagem", MB_OK); return; } // Obtemos as informações (como largura e altura) do bitmap que acabámos de carregar. BITMAP myBitmap; GetObject(hBitmap, sizeof(myBitmap), &myBitmap); // Pegamos a "superfície de desenho" da nossa janela principal (hWnd). HDC WinDC = GetDC(hWnd); // Criamos um "contexto de dispositivo na memória", que é como uma tela de pintura temporária. HDC ImageDC = CreateCompatibleDC(WinDC); // Associamos o nosso bitmap a essa tela de pintura temporária. SelectObject(ImageDC, hBitmap); // --- A Magia Acontece Aqui: A Correção para Tela Cheia --- // 1. Obter o tamanho real e atual da janela do jogo. RECT windowRect; GetClientRect(hWnd, &windowRect); int windowWidth = windowRect.right - windowRect.left; int windowHeight = windowRect.bottom - windowRect.top; // 2. Usar StretchBlt para desenhar, esticando a imagem para preencher a janela. // Em vez de BitBlt, usamos StretchBlt. StretchBlt( WinDC, // Onde vamos desenhar (a nossa janela). 0, 0, // Coordenadas do destino: começa no canto superior esquerdo (X=0, Y=0). windowWidth, // Largura do destino: ocupa toda a largura da janela. windowHeight, // Altura do destino: ocupa toda a altura da janela. ImageDC, // De onde vamos copiar (a nossa imagem em memória). 0, 0, // Coordenadas da fonte: começa a copiar do canto superior esquerdo da imagem original. myBitmap.bmWidth, // Largura da fonte: usa a largura total da imagem original. myBitmap.bmHeight, // Altura da fonte: usa a altura total da imagem original. SRCCOPY // Operação de cópia direta de pixéis. ); // --- Fim da Correção --- // É crucial libertar os recursos que usámos para evitar vazamentos de memória. ReleaseDC(hWnd, WinDC); // Liberta a superfície de desenho da janela. DeleteDC(ImageDC); // Deleta a nossa "tela de pintura" temporária. DeleteObject(hBitmap); // Deleta o objeto bitmap da memória. }
Passo 4 (Importante): Conferir a Chamada do ReleaseD3D()
No código original que você me mandou, tinha uma chamada pro ReleaseD3D() dentro da LoadScreen. Essa função basicamente desliga todo o motor gráfico do jogo — e ela nunca deve ser chamada aqui.
Dá uma olhada se tem essa linha ReleaseD3D();
dentro da sua função LoadScreen. Se tiver, pode apagar sem medo. Essa função só deve rodar uma única vez, lá no final da WinMain, quando o jogo for fechado de verdade.
Passo 5: Recompilar o Cliente
Depois de trocar a função e garantir que tirou o ReleaseD3D(), salva o arquivo Winmain.cpp.
Abre o seu projeto no Visual Studio.
Vai lá no menu Compilar (Build).
Clica em Recompilar Solução (Rebuild Solution).
Resultado Final:
Agora é só rodar o seu cliente do jogo. A imagem logo.bmp vai aparecer esticadinha, ocupando a tela toda, deixando a introdução bem mais bonita e profissional pra quem for jogar.
Futuramente trago mais tutoriais pra vcs
Postado por: @louSalve, família! Eu vi que algumas pessoas estavam com dúvida sobre como colocar a imagem do logo em tela cheia, assim como todas as imagens de carregamento. Por isso, venho aqui com um tutorial simples e explicativo para mostrar como fazer isso.
Passo 1: Entender o Problema no Código Original
Antes de corrigir, é bom entender por que isso acontece.No seu código original, você tá usando uma função do Windows chamada BitBlt. Essa função funciona tipo um “carimbo”: ela pega um pedaço da imagem e cola em outro lugar, mas sempre mantendo o tamanho original. O código calcula o centro da tela e “carimba” a sua imagem de 800x600 lá. Por isso que ela fica pequena e centralizada em resoluções maiores.
A nossa ideia aqui é trocar esse “carimbo” por uma função mais forte, chamada StretchBlt, que é tipo um “projetor” — ela consegue esticar ou reduzir a imagem pra ocupar direitinho o espaço que a gente definir.
Passo 2: Achar a Função e o Arquivo Certo
Toda a lógica pra mostrar a imagem de introdução tá dentro de uma função só, no arquivo principal do cliente.Vai até a pasta: SrcGame/src/
Abre o arquivo: Winmain.cpp (ou outro com nome parecido que tenha a função WinMain)
Procura (Ctrl+F) pela função chamada LoadScreen. É essa que a gente vai mexer.
Passo 3: Trocar o Código Antigo pelo Novo
Agora é só substituir a parte antiga de desenhar a imagem pela nova, usando o StretchBlt.Seleciona a sua função LoadScreen inteira e cola o código novo no lugar. Os comentários vão explicando o que cada parte faz.
// Esta função substitui a sua versão original de LoadScreen void LoadScreen(char* filename, HINSTANCE hInst, HWND hWnd) { // Primeiro, carregamos a imagem do ficheiro. // Usamos 0, 0 para que a imagem seja carregada com o seu tamanho original, o que é mais eficiente. HBITMAP hBitmap = (HBITMAP)LoadImage(hInst, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // Verificação de segurança: se a imagem não for encontrada, exibe uma mensagem e sai. if (!hBitmap) { MessageBox(NULL, "Erro ao carregar a imagem de introdução.", "Erro de Imagem", MB_OK); return; } // Obtemos as informações (como largura e altura) do bitmap que acabámos de carregar. BITMAP myBitmap; GetObject(hBitmap, sizeof(myBitmap), &myBitmap); // Pegamos a "superfície de desenho" da nossa janela principal (hWnd). HDC WinDC = GetDC(hWnd); // Criamos um "contexto de dispositivo na memória", que é como uma tela de pintura temporária. HDC ImageDC = CreateCompatibleDC(WinDC); // Associamos o nosso bitmap a essa tela de pintura temporária. SelectObject(ImageDC, hBitmap); // --- A Magia Acontece Aqui: A Correção para Tela Cheia --- // 1. Obter o tamanho real e atual da janela do jogo. RECT windowRect; GetClientRect(hWnd, &windowRect); int windowWidth = windowRect.right - windowRect.left; int windowHeight = windowRect.bottom - windowRect.top; // 2. Usar StretchBlt para desenhar, esticando a imagem para preencher a janela. // Em vez de BitBlt, usamos StretchBlt. StretchBlt( WinDC, // Onde vamos desenhar (a nossa janela). 0, 0, // Coordenadas do destino: começa no canto superior esquerdo (X=0, Y=0). windowWidth, // Largura do destino: ocupa toda a largura da janela. windowHeight, // Altura do destino: ocupa toda a altura da janela. ImageDC, // De onde vamos copiar (a nossa imagem em memória). 0, 0, // Coordenadas da fonte: começa a copiar do canto superior esquerdo da imagem original. myBitmap.bmWidth, // Largura da fonte: usa a largura total da imagem original. myBitmap.bmHeight, // Altura da fonte: usa a altura total da imagem original. SRCCOPY // Operação de cópia direta de pixéis. ); // --- Fim da Correção --- // É crucial libertar os recursos que usámos para evitar vazamentos de memória. ReleaseDC(hWnd, WinDC); // Liberta a superfície de desenho da janela. DeleteDC(ImageDC); // Deleta a nossa "tela de pintura" temporária. DeleteObject(hBitmap); // Deleta o objeto bitmap da memória. }Passo 4 (Importante): Conferir a Chamada do ReleaseD3D()
No código original que você me mandou, tinha uma chamada pro ReleaseD3D() dentro da LoadScreen. Essa função basicamente desliga todo o motor gráfico do jogo — e ela nunca deve ser chamada aqui.Dá uma olhada se tem essa linha
ReleaseD3D();
dentro da sua função LoadScreen. Se tiver, pode apagar sem medo. Essa função só deve rodar uma única vez, lá no final da WinMain, quando o jogo for fechado de verdade.
Passo 5: Recompilar o Cliente
Depois de trocar a função e garantir que tirou o ReleaseD3D(), salva o arquivo Winmain.cpp.Abre o seu projeto no Visual Studio.
Vai lá no menu Compilar (Build).
Clica em Recompilar Solução (Rebuild Solution).
Resultado Final:
Agora é só rodar o seu cliente do jogo. A imagem logo.bmp vai aparecer esticadinha, ocupando a tela toda, deixando a introdução bem mais bonita e profissional pra quem for jogar.Futuramente trago mais tutoriais pra vcs
Eu tinha me esquecido de por a print de como fica:
- 15 Fóruns
- 83 Tópicos
- 308 Posts
- 1 Online
- 102 Membros