Anúncio

Tutorial: Como Colo...
 
Notifications
Clear all

[Resolvido] Tutorial: Como Colocar a Imagem de Introdução em Tela Cheia

2 Posts
1 Usuários
3 Reactions
35 Visualizações
Lou
 Lou
(@lou)
Posts: 25
Mentor Respeitado
Topic starter
 

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 : 02/07/2025 3:52 pm
potras18 and Raka reacted
Lou
 Lou
(@lou)
Posts: 25
Mentor Respeitado
Topic starter
 

Postado por: @lou

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 

Eu tinha me esquecido de por a print de como fica: 

 

 
Postado : 02/07/2025 7:58 pm
potras18 reacted
Compartilhar:

Anúncio