Blocky Bee — Specs v3¶
Status: em andamento.
Descrição¶
A v3 renomeia o jogo para Blocky Bee — o personagem sempre foi uma abelha, e "Bird" era herança do gênero — ataca quatro problemas que sobraram da v2, todos ligados à experiência real no Android, e acrescenta boas práticas de Git/GitHub esperadas de um projeto Python público.
Aproveitamento de tela. A v2 desenhava numa janela de 480×720 centralizada na tela do aparelho, o que deixava barra preta nos quatro lados. A v3 cria o display em tela cheia e adota um canvas lógico com a proporção real da tela, mantendo a área jogável fixa em 480×720 de mundo. Nenhuma constante de física ou de bioma muda, então a dificuldade calibrada na v1 continua exatamente a mesma em qualquer aparelho — o que sobra de tela vira faixa decorativa: céu estendido e terra mais funda num celular alongado, corte transversal do subsolo nas laterais de um monitor. A área jogável passa a ser lida como um poço vertical cortado na terra, com mobs do universo Minecraft (creeper, enderman, ghast e outros seis) povoando as faixas sem interagir com o jogo. As faixas são cenário, mas não são zona morta: tocar ou clicar sobre elas vale como toque na área jogável, para que num celular alongado o polegar não precise mirar na coluna estreita do meio da tela.
Desempenho. O jogo passa a ser renderizado com aceleração por GPU por padrão, via
pygame._sdl2.video, com cascata de três níveis para compatibilidade (acelerado → driver
escolhido pelo SDL → o caminho de superfície da v2). Todo conteúdo estático — chão, colunas,
parallax, faixas, sprites rotacionados, texto — é pré-renderizado uma vez na inicialização e
enviado à GPU como textura, derrubando ~96 desenhos por frame para menos de 15. Some-se a
isso disciplina de alocação, ajuste do coletor de lixo e a remoção da escrita em disco de
dentro do frame.
Independência de taxa de quadros. A v2 aplicava a física uma vez por frame desenhado, o que fazia o jogo rodar em câmera lenta num aparelho que não sustentasse 60 FPS. A v3 usa timestep fixo com acumulador: o aparelho lento perde fluidez de imagem, nunca velocidade de jogo. Quando nem isso basta, a qualidade adaptativa mede o FPS real e reduz o cenário em níveis — sempre só o que é decorativo, nunca uma regra de jogo.
Rigor de SDD. Sendo este projeto principalmente um exemplo de Spec Driven Development, a
v3 fecha o ciclo: docstring obrigatória em toda classe e função verificada em CI, site de
documentação publicando a API e os specs de todas as versões no mesmo lugar, matriz de
rastreabilidade ligando cada critério de aceitação ao design, à task e ao teste que o
prova — vigiada por um teste que quebra o build se um requisito ficar sem rastreio — e
cobertura mínima no CI. O README.md passa a explicar a motivação do projeto e a trazer um
prompt de exemplo, para que o método seja reproduzível por quem está começando.
Boas práticas de Git e GitHub. As convenções de branch, commit e tag já em uso
informalmente (main/release/vN/feature/<slug>, commits imperativos citando a task,
tags vMAJOR.MINOR.PATCH) passam a estar documentadas em CONTRIBUTING.md. O projeto ganha
LICENSE (MIT), CHANGELOG.md, hooks de pre-commit que espelham o gate de CI (ruff, ty)
mais checagens básicas de higiene — rodados também no próprio CI, para valer mesmo sem
instalação local —, .editorconfig/.gitattributes para final de linha consistente entre o
desenvolvimento no Windows e o CI no Linux, Dependabot para as dependências Python e as
GitHub Actions, permissions de menor privilégio em todo workflow, e um template de Pull
Request.
Conteúdo desta pasta¶
requirements.md— requisitos R1–R35 em formato EARS. R1–R13 são o jogo base (v1); R14–R17 são a entrega Android e R18–R21 os aumentos de escopo da v2; R22–R35 são da v3 (identidade, tela e orientação, preservação da dificuldade, faixas decorativas, GPU, desempenho, timestep, qualidade adaptativa, instrumentação, documentação, rastreabilidade, motivação/método, entrada em toda a área visível e boas práticas de Git/GitHub).design.md— arquitetura técnica. Parte I (seções 1–18) é o jogo base; Parte II (19–25) é Android; Parte III (26–28) é qualidade; Parte IV (29) é o ícone; Parte V (30–44) é a v3.tasks.md— plano incremental. Tasks 1–19 são o histórico da v1; 20–41 são a v2; tasks 42–79 são a v3.traceability.md— matriz critério → design → task → teste, verificada portests/test_traceability.py.
O que muda em relação à v2¶
| Problema na v2 | Correção na v3 |
|---|---|
set_mode sem FULLSCREEN: janela de 480×720 centralizada, barra preta nos quatro lados |
Tela cheia na resolução nativa, canvas lógico com a proporção real do aparelho |
| Barra preta inevitável por descompasso de proporção (2:3 contra ~0,45 no celular e ~1,78 no monitor) | O que sobra vira faixa decorativa temática, em vez de barra |
| Tentativas anteriores de preencher a tela mudavam a dificuldade (task 39) ou cortavam a cena (task 40) | Área jogável fixa em 480×720 de mundo; só o canvas ao redor é elástico |
| Toque fora dos 480×720 era descartado (barra de letterbox, zona morta) | A tela inteira é superfície de entrada: qualquer ponto faz voar, só o ícone de mudo é exceção |
| ~96 desenhos por frame, todos em CPU, nenhuma superfície convertida | Render acelerado por GPU com todo conteúdo estático pré-renderizado |
| Física por frame: aparelho lento roda o jogo em câmera lenta | Timestep fixo com acumulador; aparelho lento perde só fluidez |
| ~40 objetos descartados por frame; escrita de JSON dentro do frame | Retângulos e listas persistentes, gc.freeze(), persistência no fim da partida ou ao ir para segundo plano |
| Sem instrumentação: otimização só por percepção | Sobreposição de diagnóstico no aparelho e benchmark headless reproduzível |
| Docstrings esparsas, sem site de documentação, sem rastreabilidade formal | Gate de docstring no CI, MkDocs Material + mkdocstrings, matriz de rastreabilidade verificada por teste |
Riscos e limites conhecidos¶
- Maior risco:
pygame._sdl2.videoé marcado como experimental no pygame-ce. A API usada aqui (Window.from_display_module,Renderer,Texture,logical_size,coordinates_from_window) está presente e estável na 2.5.7, que é a versão fixada tanto nopyproject.tomlquanto na receita local do p4a — mas uma atualização futura de pygame-ce pode exigir ajuste. A cascata de compatibilidade (design seção 33.3) limita o dano: o pior caso é o jogo cair para o caminho de superfície da v2, não deixar de abrir. - A troca de
package.nameparablockybeeé uma quebra deliberada: o Android trata o novo identificador como outro aplicativo, então quem tiver a v2 instalada fica com dois ícones e o recorde antigo não é migrado. O sandbox do Android impede a migração sem armazenamento compartilhado e permissão, o que seria um preço alto por um inteiro. Decisão registrada no design, seção 31. - Verificação: o que depende de aparelho Android real (ausência de barra preta, trava de orientação, FPS sustentado, aparência das faixas e dos mobs) não é verificável no ambiente de desenvolvimento. O checklist de
tasks.mdsepara explicitamente o automatizável do que precisa de celular. - A escolha de onde vai o espaço que sobra (até duas fileiras de bloco no chão, o resto no céu) é uma decisão visual, não analítica. O limite existe para que uma tela muito alongada não vire uma tira fina de jogo sobre um bloco de terra gigante; o valor exato foi escolhido por inspeção.
- Com céu visível acima do teto invisível da abelha, o limite superior do voo fica menos evidente do que na v2, onde coincidia com a borda da tela. Posicionar o HUD nessa faixa ajuda a lê-la como área de interface; se incomodar na validação em aparelho, a saída é uma fileira de blocos marcando o limite.
Sobre esta versão¶
Esta pasta é um retrato completo e autocontido dos specs da v3 — cobre o jogo inteiro,
não só as mudanças desta versão. A v1 e a v2 permanecem intactas em specs/v1/ e
specs/v2/ como histórico, inclusive com o nome antigo do jogo, que era o correto
quando foram escritas. Veja specs/README.md para o padrão de versionamento.