Pular para conteúdo

Blog

Esse blog contém principalmente a minha coleção de projetos pessoais, mas também pode vim a conter alguns artigos sobre assuntos que eu esteja interessado em discutir. O melhor método de navegação é pela seção Categorias na aba lateral.

Animated Pokémon

GitHub DaviAMSilva/AnimatedPokemon YouTube Steam Downloads Steam Inscrições Steam Favoritos

Um sou um fã dos jogos de Pokémon, especialmente os clássicos que ainda tinham toda a apresentação em pixel art (1). Um dia enquanto eu estava jogando Pokémon Black eu imaginei quão interessante seria ter um papel de parede animado de um Pokémon utilizando as animações de pixel art presentes especificamente nesse jogo e no jogo seguinte.

  1. O meu jogo favorito é o Pokémon Emerald, que eu tive oportunidade de jogar em cartucho pela primeira vez após comprar o equipamento para o meu projeto de faculdade Arcade Mania.

A partir disso eu me perguntei se não seria possível criar de maneira automática um papel de parede animado para cada Pokémon existente. Na época existiam um pouco menos de mil Pokémon distintos, mas com o lançamento de Pokémon Scarlet e Pokémon Violet em 2022 esse número já foi superado.

Nesse mesma época eu tinha começado a utilizar a ferramenta Wallpaper Engine em meu computador pois eu gostava dos planos de fundos animados que ele conseguia produzir e não estava muito preocupado com o efeito dela na performance do sistema. Um dos modos de funcionamento dessa engine é baseado em HTML e JavaScript o que era perfeito para um projeto desse tipo.

O projeto envolve duas partes, a primeira delas sendo um script escrito em Python responsável por encontrar, baixar e organizar as informações dos Pokémon desejados utilizando a API PokéAPI construída e mantida por fãs da franquia. O script inclusive salva tais informações em um cache local. Isso foi preciso pois as informações necessárias precisam ser obtidas utilizando quase mil buscas distintas isso era absolutamente necessário. O resultando desse script era um arquivo JavaScript contendo todos os Pokémon em uma lista para ser importada no papel de parede em si.

A segunda parte é composta de uma simples página HTML contendo um local para inserir alguns dados do Pokémon, um local para inserir a sua imagem animada e um plano de fundo colorido de acordo com os tipos do Pokémon. A verdadeira complexidade estava no JavaScript da página devido ao fato que ele precisava interagir com o framework disponibilizado pela Wallpaper Engine para fornecer diversas opções de customização para o usuário final do wallpaper, como tempo para a troca de Pokémon, opções de cores, entre outras.

Animated Pokémon - Ícone contendo Pikachu

Dessa forma eu fui capaz de publicar meu papel de parede no Steam Workshop onde ele teve um sucesso moderado e foi bem recebido. Eu o utilizei como meu papel de parede principal por todo o tempo restante em que eu estive utilizando o Microsoft Windows. Entretanto, atualmente o sistema operacional que estou utilizando exclusivamente é o Linux Pop_OS!, sendo que não tenho mais a vontade de ter um papel de parede animado, ambos motivos porque eu não tenho mais vontade de atualizar e melhorar esse projeto.

codinStruct


GitHub codinStruct/codinStruct Website codinStruct Website codinStruct Next

É o projeto mais moderno que eu já desenvolvi durante o quarto semestre da minha graduação na Doctum. Foi parte de um trabalho em grupo com tema livre em que nossa motivação foi:

O trabalho é uma plataforma que oferece um repertório de informação sobre linguagens de programação, apresentadas de diferentes formas tal que facilite o aprendizado dos usuários através de um portal que agrupa esses conhecimentos em um só lugar.

Quase todo brasileiro que busca aprender programação percebe a escassez de conteúdo nacional de qualidade sobre a área, e quando existe costuma estar em um lugar obscuro.

Conhecemos bastante as dificuldades e necessidades do possível usuário, pois passamos pelas mesmas. Isso é uma fonte de inspiração e motivação que nos mostra a utilidade de nosso projeto e transcende retorno financeiro, mas não descartamos a possibilidade de monetização.

No fim o projeto incorporou uma documentação das linguagens C, JavaScript e Python.

O projeto contêm três partes principais: O site em si, para apresentar o conteúdo; o conteúdo escrito em markdown; e um conversor de markdown para o html que seria importado pelo site.

Em retrospectiva é claro como esse trabalho é similar a projetos como MkDocs, GitBook e Jekyll, mas na época nós queríamos desenvolver tudo nós mesmos.

Quando o site foi desenvolvido nos o hosteamos na plataforma Heroku, no plano grátis, mas depois de alguns anos a plataforma essencialmente anunciou o fim do plano grátis, e como esse era apenas um projeto escolar simples não tomamos ação para manter o site funcionando pelo Heroku.

Felizmente um dos meus colegas nesse trabalho, Luiz, pessoalmente criou uma versão do conteúdo para estar acessível por meio do GitHub Pages utilizando a ferramenta mdBook, disponível em codinStruct. Adicionalmente ele também criou uma versão utilizando a ferramenta Next.js, disponível em codinStruct Next.

Arcade Mania

GitHub DaviAMSilva/Arcade_Mania GitHub DaviAMSilva/Arcade_Mania Release:latest


Esse foi um projeto que eu realizei individualmente durante o segundo semestre da minha graduação na Doctum. Ele envolvia a criação de um jogo para a plataforma Game Boy Advance da empresa Nintendo, lançado em 2001.

O projeto era de escolha livre, desde que utilizasse a linguagem C. Os motivos que me levaram a essa escolha foram basicamente:

  1. Os jogos desenvolvidos para o GBA, oficiais ou criados por fãs, são desenvolvidos em C, apesar de possivelmente utilizarem partes específicas escritas em Assembly.
  2. Eu gosto de jogos eletrônicos e não discrimino jogos clássicos ou retro.
  3. Eu possuo um Game Boy Advance SP (variação do GBA original) e poderia usar o trabalho como incentivo para comprar um aparelho e um cartucho capazes de gravar ROMs de jogos para serem jogados em hardware original.

A plataforma só está disponível para desenvolvimento amador devido ao trabalho de várias pessoas que realizaram e continuam realizando engenharia reversa no dispositivo e jogos para documentar as técnicas de desenvolvimento hoje existentes. Alguns dos projetos utilizados durante o desenvolvimento foram devkitPro, Tonc, grit, GBATek e CowBite.

Devido a essa complexidade técnica da plataforma e como ela me forçou a ser muito mais atento com o código que eu desenvolvia eu até hoje considero esse como o projeto do qual eu tenho mais orgulho de ter realizado. Para mim é um dos projetos mais organizados e completos que eu já criei devido a todas as ferramentas internas que eu tive de criar para suportar o desenvolvimento e compilação do projeto, includindo o melhor makefile que eu já criei. No final tudo valeu a pena quando eu tive a oportunidade de jogar meu jogo finalizado no meu GBA SP original, que foi uma experiência quase surreal.

Como experimentar

Baixe a release mais recente do arquivo Arcade_Mania.gba e instale um emulador do GBA (eu recomendo o mGBA). Por fim abra o arquivo no emulador e aproveite.

Esse projeto originalmente compunha apenas 2 jogos Snake e Memory Raid, mas após algum tempo depois da entrega do trabalho eu tive a vontade de implementar um porte do jogo Wordle, quando ele estava ganhando popularidade na internet. O motivo do uso desses jogos inicialmente baseia-se parcialmente do fato que Snake pode ser melhor criado usando tiles, enquanto para Memory Raid o ideal é utilizar sprites, sendo os dois principais sistemas gráficos do GBA.

  • Snake

    Snake Tela Inicial Snake Exemplo 1

    É uma versão bem simples do jogo clássico, apenas contendo a adição de um coelho que se move aleatoriamente e um power-up que te deixa invencível e aumenta a velocidade do jogo. Apesar da simplicidade ele é divertido divertido devido ao movimento errático do coelho e ao controle super rápido da cobra em si.

  • Memory Raid

    MemoryRaid Tela Inicial MemoryRaid Exemplo 1 MemoryRaid Exemplo 2

    Esse é um jogo de memorização de padrões de cores e direções de ataques que precisam ser bloqueados. É baseado em uma luta contra o personagem Undyne do jogo UNDERTALE, mas envolve a memorização em 8 direções, ao invés de reação rápida em 4 direções. Infelizmente eu não cheguei em um bom balanço do jogo, ou ele era muito rápido e difícil, ou devagar e chato, e portanto não há muito interesse de continuar jogando.

  • Wordle

    Wordle Tela Inicial Wordle Exemplo 1

    Apesar de ter sido implementado por último é o jogo mais interessante da lista, visto que é baseado diretamente em um jogo já popular e que não requer muito do aspecto gráfico. A lista de palavras utilizadas é a mesma utilizada pela versão original do New York Times.

Bibliotecas em C


GitHub DaviAMSilva/Estruturas_de_Dados GitHub DaviAMSilva/Searches GitHub DaviAMSilva/Sorts

Essas bibliotecas se referem a três conjuntos de funções e tipos de dados que eu desenvolvi enquanto estava cursando o curso de Ciência da Computação na Doctum para acelerar o desenvolvimentos das atividades. Esses projetos são:

  • Estruturas de Dados:

    Contém as estruturas de dados do tipo pilha, fila e lista e métodos para criar, acessar e modificar tais estruturas. O tipo de dado armazenado nessas estruturas é dinâmico e definido pelo usuário.

  • Searches:

    Contém diversos algoritmos de pesquisa em tipos de dados quaisquer, definidos pelo usuário.

  • Sorts:

    Contém diversos algoritmos de ordenação em tipos de dados quaisquer, definidos pelo usuário.

Eu criei essas bibliotecas durante os semestres em que cada um desses tópicos foi apresentado na faculdade. Minha principal motivação é que bem no início eu percebi o quanto eu reutilizava código pois atividades diferentes requeriam as mesmas estruturas, apenas a situação da atividade eram alteradas. Por causa disso, apesar de essas bibliotecas não terem muito utilidade prática no mundo externo, para mim elas foram de uma ajuda enorme.

A maneira como elas funcionam em geral é que elas permitem o uso de qualquer tipo de dados por meio de alocação dinâmica e conversão de ponteiros. O usuário apenas precisa definir o tamanho do tipo de dados no início e definir as funções necessárias para interagir com as bibliotecas utilizando os mesmos tipos de dados definidos.

Além disso outra vantagem é que as bibliotecas foram feitas de tal forma que o código fonte podia ser copiado para cada atividade necessária e continha um makefile para compilar cada arquivo para um arquivo de biblioteca estática (extensão .a) que poderia ser importada para os arquivos próprios da atividade por meio de outro makefile.

DIRS    := build/ lib/
SOURCES := $(wildcard source/*.c)
OBJECTS := $(patsubst source/%.c,build/%.o,$(SOURCES))
LIBS    := $(patsubst source/%.c,lib/lib%.a,$(SOURCES))

all: $(LIBS)
dirs: $(DIRS)

.PHONY: all dirs clean
.SECONDARY: $(OBJECTS)

build/%.o: source/%.c include/%.h | $(DIRS)
    gcc -c $< -Wall -O3 -o $@ -I include/

lib/lib%.a: build/%.o | $(DIRS)
    ar cr $@ $<

$(DIRS):
    mkdir -p $@

clean:
    rm -fr build/ lib/
.PHONY: all clean eds
all: $(patsubst %.c,bin/%,$(wildcard *.c))


libs := lista pilha
args := -Ieds/include -Leds/lib $(addprefix -l,$(libs))


bin/%: %.c | bin eds
    gcc $^ $(args) -O3 -Wall -Wno-unused-result -Wno-discarded-qualifiers -o $@


bin:
    mkdir -p bin/


eds:
    $(MAKE) -C eds


clean:
    rm -fr bin/

Pontos Mais Próximos

GitHub DaviAMSilva/Pontos-mais-proximos Website Pontos Mais Próximos


Esse foi um algoritmo bem simples que eu desenvolvi cujo o objetivo é encontrar os dois pontos mais próximos dentro de uma coleção qualquer utilizando o algoritmo de divisão e conquista.

Tradicionalmente o algoritmo de par de pontos mais próximos tem tempo de execução representado por \(O\left(n^2\right)\), mas utilizando a estratégia acima é possível reduzir o tempo necessário para \(O\left(n \log n\right)\), sendo muito mais eficiente.

Eu desenvolvi esse algoritmo enquanto estava cursando o curso PENSAMENTO COMPUTACIONAL, PROGRAMAÇÃO E APLICAÇÕES EM MATEMÁTICA ofertada pelo ProMO 2019 por ter sido premiado por uma medalha de prata na OBMEP 2018.