Configurando Windows para Desenvolvimento de Jogos em C
Table of Contents
Configurar um ambiente para programar pode ser uma tarefa chata, mas é necessário.
Hoje eu vou compartilhar os passos que uso para configurar o Windows para o desenvolvimento de jogos em C da maneira que aprendi e que funciona bem.
Você pode seguir passo a passo para ter a mesma configuração que a minha ou usar ela como ponto de partida para ter a sua própria configuração.
Eu também fiz uma versão para o macOS que você pode acessar aqui Configurando MacOS para Desenvolvimento de Jogos
1. Linha de comando (terminal)
O primeiro passo que todo programador faz - ou deveria fazer - é configurar seu ambiente de desenvolvimento com ferramentas leves e direto ao ponto, especialmente a linha de comando.
Isso inclui configurar as fontes, cores, teclas de atalho e a janela onde você passará a maior parte do seu tempo.
Agora, ninguém gosta de programar sem o seu toque único. Eu costumo configurar o estilo do meu terminal/cmd com cores que me agradam ao estilo retrô ou o clássico tema escuro com textos em branco.
Abra a linha de comando - CMD ou Terminal - com a tecla de atalho Windows + R e digite cmd.
Clique no ícone do prompt de comando, no canto superior a esquerda, acesse as propriedades do menu e personalize as fonte e cores de sua preferência.
A configuração acima utiliza a cor R=237 G=196 B=100 e a fonte Liberation Mono.
A ideia não é perder muito tempo com esses detalhes, precisa ser objetivo e direto, porque usaremos o prompt de comando apenas para gerenciar nosso projeto, rodar scripts e compilar o programa.
Só isso!
2. Disco local virtual
Um disco virtual simula a posição física do disco como c:\Users\yourname\somefolder para um ponto novo.
Podemos fazer isso para ter acesso rápido como por exemplo w: quando o caminho do projeto está em outra parte do disco físico.
Para criar um disco virtual, você pode usar o comando subst.
Com o parâmetro de ajuda, temos as opções disponíveis: subst /?.
Então, caso queiramos criar um ambiente virtual apontando para o w: fazemos desta forma abaixo:
subst w: c:\<pasta>
Agora, para que isso persista, vamos criar o arquivo startup.bat que irá executar este comando ao inicializar o Windows.
Abra esse arquivo com o atalho Windows + R e digite shell:startup.
Nesta pasta, caso não tenha o startup.bat, crie-o.
Abra-o com notepad e escreva:
@echo off REM @echo off remove the output of command echo echo configuring local disk w: subst w: c:\game
Isso irá configurar o disco local virtual.
- @echo off desativa a saída de cada linha a seguir para não poluir o console
- REM é o comentário em um batchfile
Agora você pode acessar diretamente o ambiente de trabalho do seu jogo com cd w:.
Uma outra abordagem seria usar o caminho padrão
c:\como seu diretório HOME. Você não precisa usar seu User se você tem controle total do seu PC.
Definindo onde estará nosso projeto, c: ou w: via subst, vamos ao compilador.
3. Compilador
Para começar a programar um jogo em C, precisamos de um compilador. Existem diversos compiladores de C. Neste projeto para o Windows vamos usar o MSVC - Microsoft Visual C++.
Para ter acesso ao compilador cl é necessário baixar e instalar o Visual Studio e ativar no cmd para compilar por lá.
Faremos isso com o batchfile vcvarsall.bat.
Este script vive dentro do diretório do Visual Studio.
Eu não posso descrever exatamente onde encontrá-lo porque varia de versão para versão, mas vou adicionar o caminho da minha versão atual para que tenha como referência.
No meu caso está em c:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat
Se você rodar esse programa no seu terminal com o parâmetro x64, notará que o compilador ficará disponível como o comando cl para compilar em 64 bits.
Para não ter que encontrar toda vez esse script durante o trabalho, vamos criar nossos próprios scripts batchfile.
4. Editor de Texto
Eu uso Emacs há mais de 10 anos. O Emacs foi criado em 1976 por Richard Stallman e talvez você esteja pensando: "Nossa, este editor é antigo!".
Mas funciona para mim!
Eu, pessoalmente, sempre usei o Vim desde o meu primeiro ano como programador. Mesmo durante o meu estágio, meu chefe me "ensinou" - leia-se obrigou - programar e navegar rapidamente em qualquer editor. Foi difícil no começo, mas hoje vejo que valeu 100% o esforço em aprendê-lo.
Mas depois de anos usando o Vim (e depois neovim), eu conheci o Emacs e simplesmente decidi ir para esse lado da força.
Configurei bastante, gastando muitas semanas, talvez até meses - no qual hoje me arrependo ter me dedicado tanto aos detalhes e ao perfeccionismo, deveria ter focado mais em programar - e agora ele se tornou meu editor favorito. Gosto de combinar o poder do Emacs com o Vim através do Evil Mode para simular as combinações de teclas do Vim dentro do Emacs.
Então, caso queira seguir o meu workflow atual, instale o Emacs no Windows. A versão que baixei enquanto escrevo o texto foi emacs-30.1, mas você pode usar a mais recente disponível.
O Emacs funciona com Elisp escrito no arquivo .emacs que deve ficar na pasta HOME ~/ para inicialização.
Como o Windows não possui um HOME da mesma forma como unix, eu adiciono na variável de ambiente HOME=c:\. Assim, o Emacs olha para c:\ para procurar o arquivo .emacs.
Você pode encontrar minha versão do arquivo .emacs e da pasta .emacs.d em meu dotfiles.
No .emacs.d inclui temas, snippets de códigos, scripts e muito mais.
A propósito, caso queira conhecer o tema que criei para a IDE da JetBrains - alerta nerd - com algumas cores que uso no próprio Emacs, vou deixar o link aqui de referência. Eu o chamei de Terminator Theme.
Contudo, há uma pegadinha aqui. Nos dias atuais, o Windows não permite que o Emacs escreva arquivos diretamente no c: a menos que se seja um usuário Admnistrador. Logo, eu gosto de desativar qualquer "exigência" de privilégios para meu próprio computador.
"Mas Tiago, isso não deixa vunerável a virus?"
Se você souber onde acessa, o melhor antivirus, é você!
Eu desativo o UAC pelo Registry Editor o que permite acessar c: com todos os privilégios.
5. Desativando o UAC Registry Editor (opcional)
Abra novamente o atalho Windows + R e digite regedit.
Navegue até essa sub-chave:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Policies\system
No painel à direita da chave System, encontre EnableLUA DWORD a troque ele para o valor zero.
Reinicie o PC para aplicar as modificações após salvar.
6. Batchfile shell
Como dito, encontrar o script vcvarsall.bat toda vez é chato, então vamos criar um outro que nos ajude e que fique fácil de acessar a partir do projeto.
Crie um script com algum nome, como shell.bat e coloque ele onde preferir, seja no diretório do seu game como em \misc ou no próprio c:\bin por exemplo.
Geralmente eu crio o diretório
c:\binonde eu posso adicionar qualquer script que ficará visível pelo PATH do sistema operacional.
@echo off REM @echo off remove the output of command echo echo "configure shell for w: (c:\game)" REM configure compiler call "c:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 REM configure emacs IF NOT EXIST "c:\bin" mklink /d "c:\bin" "c:\dotfiles\bin" IF NOT EXIST "c:\.emacs.d" mklink /d "c:\.emacs.d" "c:\dotfiles\.emacs.d" IF NOT EXIST "c:\.emacs" mklink "c:\.emacs" "c:\dotfiles\.emacs" type nul > "c:\.emacs-custom.el" REM scripts on path set PATH=w:\misc;%PATH%
O script basicamente irá:
- chamar o vcvarsall para ativar o compilador;
- configurar o Emacs (editor de texto que falarei mais a frente), criando arquivos e links simbólicos;
- colocar o diretório \misc do projeto no PATH para rodar scripts - pode ser o c:\bin se preferir;
Os meus scripts e arquivos de configuração ficam no meu dotfiles que você pode acessar e copiar para o seu diretório do game \misc.
7. Batchfile emacs
Também crie o script emacs.bat dentro do mesmo diretório do shell.bat caso queira iniciar o emacs direto pela linha de comando.
@echo off REM @echo off remove the output of command echo call "C:\Program Files\Emacs\emacs-30.1\bin\runemacs.exe"
8. Inicializador do cmd/terminal
Você pode fazer o seu atalho do cmd iniciar o seu script shell.bat se preferir.
No atalho, acesse "Properties" > "Target Field" e adicione o argumento na caixa do atalho: /k w:\misc\shell.bat - ou o caminho que você definiu seu shell.bat.
Agora, sempre que o cmd abrir, ele vai configurar todo Emacs, compilador e o PATH para rodar os scripts que estão em w:\misc
9. Primeiro Programa
Temos tudo que precisamos para começar.
- Terminal
- Compilador
- Editor de Texto
Agora, crie a pasta src dentro do diretório raiz do projeto com os arquivos win32_<project_name>.cpp e build.bat.
Eu aprendi a adicionar o nome do projeto no arquivo para evitar conflitos de nomes com bibliotecas de terceiros no C. Por exemplo, um platform.h pode haver em diversos lugares, logo eu usaria <project_name>_platform.h.
build.bat
Você só precisa do arquivo batchfile para compilar o programa.
Você pode desconsiderar ferramentas como cmake, make e outras ferramentas de compilação. Em vez disso, escreva um arquivo shell simples em myproject/src/build.bat.
Isso facilita muito nossos sistema de build - nem sei se posso chamar de sistema de tão enxuto que ele é.
Isso é possível porque vamos utilizar o método de compilação com um único translation unit.
Muito bem, dentro do arquivo shell script, adicione uma flag de debugging para o compilador com /Zi, crie um novo diretório build para gerar os executáveis e adicione ao linker a flag para compilar com a biblioteca de GUI do Windows user32.lib.
@echo off REM @echo off remove the output of command echo IF NOT EXIST ..\build mkdir ..\build pushd ..\build cl /nologo /Zi /Fegame ..\src\win32_game.cpp user32.lib popd
- mkdir: Cria um novo diretório se ele não existir;
- pushd/popd: Navega e persiste no histórico como pilha;
- cl: Compilador C;
- -/Zi: A flag de debugging;
- /Fe: Nome do executável de saída;
- /nologo: Desativa entulho de saída do compilador;
- user32.lib: Uma biblioteca estática para criar janelas. O linker vai usar para encontrar a implementação de componentes como MessageBox, Window, entre outras.
Se estiver usando o meu .emacs, pode compilar diretamente de dentro do Emacs com o atalho M-x m (alt+m) ou chamar o script build.bat no terminal.
Main (entry-point)
Crie o ponto de entrada em win32_<project_name>cpp com WinMain e use a macro MessageBox.
O conteúdo da API deve ser consultado sempre com a referência oficial do MSDN documentation.
#include <windows.h>
#include <stdio.h>
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
printf("Hello world\n");
MessageBoxA(NULL, "Game", "My Game", MB_OK|MB_ICONINFORMATION);
return 0;
}
O MessageBoxA força a mensagem sair com texto ANSI, ao invés de usar a macro que definirá UNICODE ou ANSI, MessageBoxW e MessageBoxA respectivamente.
O Windows usa a Hungarian notation no seu código. Eu particularmente não gosto disto, mas é interessanto saber, isso porque a documentação do MSDN será repleta dessa notação.
Executando o Programa com Debugging
Você pode executar o executável a partir do terminal no caminho build\<project_name>.exe ou usando o devenv para fins de depuração com o Visual Studio como ferramenta de debugging.
Como compilamos nosso programa com flags de debugging, o Visual Studio reconhece o código-fonte.
Crie uma pasta na raiz chamada data. Esta pasta será útil ao executar o jogo no futuro como caminho relativo.
Com o Visual Studio aberto, clique com direito em solution > properties > Working Directory e atribua o path para w:\data.
O F5 roda o programa com ponto de parada e o F11 pára na primeira linha do main.
A primeira linha de código que é executada no windows não é o nosso arquivo cpp. O arquivo é
crt0.c. Ele é carregado pelo sistema operacional através do C Runtime Library (CRT). Logo o verdadeiro inicializador é omainCRTStartup(). Depois disto, o processo é dispachado para o nosso WinMain.
10. Key repeat (opcional)
Por padrão, ao digitar no teclado há um atraso na saída do editor. Você pode alterar a velocidade de output de cada caracter ajustando o controle de entrada do teclado.
Acesse Windows + R > control keyboard e altere a velocidade do input.
Conclusão
Os passos podem parecer grande, mas não é. Ao seguir o passo a passo, você notará que esse fluxo de trabalho é muito simples, rápido e produtivo.
Você só precisa:
- Abrir o terminal;
- Abrir o Emacs;
- Escrever o código;
- Compilar;
- Testar com Debugging;
A estrutura final é bem simples.
project_name
├── data
├── misc
├── build
└── src
├── build.bat
└── win32_project_name.cpp
Meu Acesso Rápido
- Configurar o terminal com fontes e cores
- Configurar disco local virtual com
substestartup.bat - Instalar o Visual Studio
- Instalar o Emacs e configurar
.emacsno diretório c:\ - Configurar Privilégios do Windows e atribuir HOME c:\ nas variáveis de ambiente
- Criar o
shell.batpara ativar compilador e o PATH c:\bin - Criar o
emacs.batpara iniciar Emacs pelo cmd - Configurar o atalho do cmd para iniciar o shell.bat
- Escrever o
build.batpara compilar o programa - Escrever o arquivo principal com o ponto de entrada
WinMaine um 'Hello World' com MessageBox - Configurar a pasta
datapara diretório de funcionamento do Visual Studio - Testar a depuração com Visual Studio