Turma 2025/2 6 de outubro de 2025
Programação de Computadores II
Instalação e Uso da Biblioteca Raylib
1. Instalação da biblioteca Raylib
A Raylib é uma biblioteca C para desenvolvimento de jogos e aplicações gráficas. A seguir temos o passo a
passo para instalar e usar a Raylib no Windows (com o ambiente MSYS2) e no Linux.
1.1 Instalação no Windows com o MSYS2
Baixe o instalador do MSYS2 ([Link] e siga as instruções de instalação. Em seguida, instale
o GCC e a Raylib no terminal MSYS2 UCRT64 com o gerenciador de pacotes pacman:
pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-raylib
Para testar, crie um arquivo teste_raylib.c com o código de exemplo (item 2), compile com o GCC no
mesmo terminal (MSYS2 UCRT64) e execute o programa (o diretório padrão é C:/msys64/home/user):
gcc main.c -o main -lraylib -lwinmm -lgdi32 -lopengl32
./teste_raylib.exe
1.2 Instalação no Linux com o gerenciador de pacotes
Instale o GCC e a Raylib com o gerenciador de pacotes (Ubuntu/Debian e derivados):
sudo apt update
sudo apt install build-essential
sudo apt install libraylib-dev
Para testar, crie um arquivo teste_raylib.c com o código de exemplo da Raylib, compile com o GCC e
execute o programa:
gcc main.c -o main -lraylib -lm -lpthread -ldl -lrt -lX11
./teste_raylib
2. Código de exemplo
A seguir temos um exemplo de código usando a Raylib que exibe um texto diferente dependendo da tecla
(seta) pressionada. Crie um arquivo teste_raylib.c com o conteúdo abaixo:
#include "raylib.h"
#include <string.h>
#define LARGURA 800
#define ALTURA 450
int main(void){
char texto[50] = "Pressione uma seta"; // Texto inicial
//Inicializações
InitWindow(LARGURA, ALTURA, "Teclas"); //Inicializa janela (tamanho e título)
SetTargetFPS(60);// Ajusta a execução do jogo para 60 frames por segundo
Turma 2025/2 6 de outubro de 2025
//Laço principal do jogo
while (!WindowShouldClose()) // Detecta botão de fechamento da janela ou ESC
{
// Trata entrada do usuário e atualiza estado do jogo
if(IsKeyPressed(KEY_RIGHT)) strcpy(texto,"Direita");
if(IsKeyPressed(KEY_LEFT)) strcpy(texto,"Esquerda");
if(IsKeyPressed(KEY_UP)) strcpy(texto,"Cima");
if(IsKeyPressed(KEY_DOWN)) strcpy(texto,"Baixo");
// Atualiza a representação visual a partir do estado do jogo
BeginDrawing(); //Inicia o ambiente de desenho na tela
ClearBackground(RAYWHITE); //Limpa a tela e define cor de fundo
DrawText(texto, 300, 200, 40, RED); //Desenha texto, posição, tamanho e cor
EndDrawing(); //Finaliza o ambiente de desenho na tela
}
CloseWindow(); // Fecha a janela e o contexto OpenGL
return 0;
}
A seguir, compile e execute o código conforme as instruções no item 1. Pressione as setas direcionais para
observar o funcionamento do programa.
3. Atividade
A partir do código de exemplo, desenvolva um novo programa cujo objetivo é mover um quadrado pela tela:
O quadrado deve ter lado com 20 pixels comprimento (quadrado de 20 X 20) e deve ser preenchido
com a cor vermelha.
O usuário deve utilizar as teclas (setas) para mover o quadrado pela tela.
O movimento do quadrado deve ser de 20 pixels a cada passo, na direção que o usuário pressionou a
tecla. Com isso, o efeito gerado é o movimento do quadrado por células do mesmo tamanho que ele,
em passos discretos.
Quando o quadrado sair da tela, a janela deve ser fechada.
Configure a janela para ter 800 X 800 pixels de tamanho.
A janela deve ter como título o texto “Movimento”.
O quadrado deve começar na posição (400, 400). Opcionalmente, ele pode iniciar em uma posição
aleatória dentro dos limites da janela.
Observe que para realizar esta tarefa você deve manter informações no programa que representam a posição
atual do quadrado, e esta informação deve ser atualizada de acordo com as ações do usuário. O resultado
deve ser parecido com este:
Turma 2025/2 6 de outubro de 2025
4. Desafio
Faça uma versão do programa anterior, mas incluindo obstáculos no cenário e realizando a detecção de
colisão (impedindo o personagem de estar na mesma célula do obstáculo na movimentação). O programa
deve usar uma matriz de inteiros para indicar se há ou não um obstáculo em uma célula. Tarefas:
Declare uma matriz 40 X 40 (onde cada célula vai representar uma sub-célula de 20 X 20 pixels na
tela). Esta matriz vai representar se uma célula possui ou não um obstáculo.
Inicialize a matriz aleatoriamente com valores que podem ser zero ou um. Zero indica célula livre
(pela qual o personagem pode se mover) e um indica obstáculo (posição que o personagem não
pode ocupar). A inicialização deve ser realizada uma única vez, antes do loop principal do jogo.
Realize a movimentação verificando sempre se o personagem pode ou não se mover para a célula
que o usuário indicou com a tecla.
Adapte o programa de acordo para que a estratégia funcione como deve.
Explore a biblioteca para incrementar este programa (usando diferentes cores, formas, etc).
Funções interessantes da Raylib para utilizar no desafio:
A documentação da bibloteca com exemplos pode ser acessada em [Link] A seguir,
serão fornecidas algumas funções úteis para este desafio (e para o trabalho prático).
InitWindow(<largura>, <altura>, <título>): Inicializa a janela gráfica com uma largura, uma
altura e um título.
SetTargetFPS(<valor>): Define o frame rate (taxa de atualização da tela) do jogo.
WindowShouldClose(): Retorna verdadeiro se a janela for fechada, ou se a tecla ESC for pressionada.
IsKeyPressed(<tecla>): Retorna verdadeiro caso a tecla tenha sido pressionada. Se usada para
movimento, o elemento gráfico apenas se a cada vez que o usuário pressiona a tecla.
BeginDrawing(): Define o início do contexto de desenho gráfico da raylib.
EndDrawing(): Define o fim do contexto de desenho gráfico da raylib.
ClearBackground(<cor>): Limpa a tela e define uma cor de fundo.
DrawRectangle(<posição x>, <posição y>, <largura>, <altura>, <cor>): Desenha um
retângulo cujo ponto superior direito está localizado na posição informada, com a <altura> e <largura>
informados e com a cor definida. Note que além de retângulos, a biblioteca permite desenhar outras
formas básicas também.
CloseWindow(): Fecha a janela e finaliza o contexto OpenGL.
IsKeyDown(<tecla>): Retorna verdadeiro caso a tecla esteja sendo pressionada. Se usada para
movimento, o elemento gráfico permanece em movimento enquanto a tecla estiver sendo pressionada.
Note que para usar esta estratégia de movimentação, deve-se pensar na combinação dos tamanhos dos
passos dos personagens e no frame rate para não ficar muito rápido. Além disso, a detecção de colisão,
neste caso, é mais complexa do que simplesmente verificar se dois objetos estão na mesma célula.