#gamedev

Configurando Windows para Desenvolvimento de Jogos em C

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.

1727034196.png

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:\bin onde 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.

  1. Terminal
  2. Compilador
  3. 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 é o mainCRTStartup(). 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:

  1. Abrir o terminal;
  2. Abrir o Emacs;
  3. Escrever o código;
  4. Compilar;
  5. 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 subst e startup.bat
  • Instalar o Visual Studio
  • Instalar o Emacs e configurar .emacs no diretório c:\
  • Configurar Privilégios do Windows e atribuir HOME c:\ nas variáveis de ambiente
  • Criar o shell.bat para ativar compilador e o PATH c:\bin
  • Criar o emacs.bat para iniciar Emacs pelo cmd
  • Configurar o atalho do cmd para iniciar o shell.bat
  • Escrever o build.bat para compilar o programa
  • Escrever o arquivo principal com o ponto de entrada WinMain e um 'Hello World' com MessageBox
  • Configurar a pasta data para diretório de funcionamento do Visual Studio
  • Testar a depuração com Visual Studio