terça-feira, 20 de agosto de 2019

Parte 3 - Criando um Sprite


Hoje vou falar da coisa mais importante de um jogo das gerações antigas, o Sprite.

Para isso, vamos lembra que nossas medidas funcionam assim:
- A menor imagem num jogo é um Pixel (Picture Element) que é equivalente a um ponto na Tela.
- Um bloco de 8 pixels horizontal (linha X) por 8 pixels vertical (linha Y) chamamos de Tile, pensar que um Tile pode ser repetir na Tela várias vezes (é consolador para o desenvolvedor economizar seu esforço). 
- Um Sprite é um grupo de Tiles que tem movimento na Tela. Geralmente eram os heróis, vilões e ferramentas e armas nos jogos 2D.

Conforme avançamos nos comandos, vou incluindo o Glossário dos 40 e poucos Comandos do BEX.

Vamos tentar desenhar uma Navinha, é o exemplo mais simples:

PARTE 1
Primeiro desenho uma nave qualquer com o SGTD. Para uma nave pequena, lembre de usar o Set Tile Width para 1x1 Tile (as setas vermelhas horizontal e vertical).

Após o desenho feito, clique nas opções Export Tile Data e Pallette Tile Data para colher os códigos. Este trecho não tem mistério. Aparecerá o código numa tela. Mantenha o Format Basic Escolha o tamanho do Tile a partir de 0  (1 único Tile significa escolher Start Tile e End Tile 0) depois o ícone de copiar (Copy Text Data Clipboard). Para a Paleta, clique no círculo de cores e clique em Generate Data, depois repita a operação, escolhendo o número de Paletas usadas, de 0 a 3. Só usaremos a Pallette 0:

Apareceu pra mim, os seguintes códigos :

DATAINT $0EEE,$00EE,$0E0E,$000E,$0EE0,$00E0,$0E00,$0888 '  Pallette: 0
DATAINT $0CCC,$0088,$0808,$0008,$0880,$0080,$0800,$0000


DATALONG $80000008 '  Tile: 0
DATALONG $87000078
DATALONG $87088078
DATALONG $878CC878
DATALONG $878CC878
DATALONG $87088078
DATALONG $87000078
DATALONG $80000008
DATALONG $00000000 '  Tile: 1
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000 '  Tile: 2
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000 '  Tile: 3
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000


Lembre de colocar o Label antes (usarei respectivamente paleta e navinha). Um detalhe importante é a primeira cor da Paleta ser o Branco ($0EEE) no SGTD, que vamos alterar aqui para transparente ($0000). Na prática, usamos 15 cores.  Para inserir na memória do Mega Drive, usamos o comando Loadtiles <label>, <nº de tiles usados>, <posição da memória de vídeo onde ficará alocado>. Ficando Assim:

Loadtiles navinha,1,256

A posição 256 que iniciará. Pois de 0 a 255 ficam reservados à tabela ASCII. As cores serão registrada no comando Pallettes. Que é montado com os seguintes parâmetros: Pallettes <label>,<nº da paleta>, <nº das cores utilizáveis>. Fica mais ou menos assim:

Pallettes paleta,0,0,16

Os dados estarão salvos na Memória de Vídeo. Caso fosse uma imagem comum, tipo cenário, podiamos desenha-lo na tela com Drawtile. É montado com drawtile <endereço do tile>,<posição X na tela>,<posição Y na tela>. Para mim, ficou assim:

drawtile 256,20,20

Considerem que a posição da imagem renderizada é diferente da imagem que nos aparece na TV. A tela do Mega tem 40 Tiles na Horizontal (X) e 28 na Vertical (Y)   O Sprite desenhado fica assim:     

        loadtiles navinha,1,256
        pallettes paleta,0,0,16

drawtile 256,20,20


paleta:
DATAINT $0000,$00EE,$0E0E,$000E,$0EE0,$00E0,$0E00,$0888 '  Pallette: 0
DATAINT $0CCC,$0088,$0808,$0008,$0880,$0080,$0800,$0000


navinha:
DATALONG $80000008 '  Tile: 0
DATALONG $87000078
DATALONG $87088078
DATALONG $878CC878
DATALONG $878CC878
DATALONG $87088078
DATALONG $87000078
DATALONG $80000008
DATALONG $00000000 '  Tile: 1
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000 '  Tile: 2
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000 '  Tile: 3
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000


Se apareceu uma navinha como a do Star Wars, parabéns, você conseguiu mais rápido que eu fazer algo. Minha sugestão é usar sua imaginação pra fazer Sprites e Tiles variados.

PARTE 2

Agora que criamos um Sprite, vamos situar uma posição pra ele. Para isso usaremos a Função addsprite que recebe dois parâmetros entre parênteses com Y e X. (altura,largura) é que desenhará no lugar do drawtile. Cuidado porque a maioria dos comandos é X e Y (eu fiquei dias errando isso depois de aprender). Também o comando propstrite que uso nome, a posição de memória e quantos serão. Ficando:

       sprite_1=addsprite(4,4) 
       prosprite sprite_1,256,0

Agora, por que 256? Porque as posições 0 a 255 são reservadas à tabela ASCII (se usa-la aparecerá seus caracteres). O Mega Drive tem espaço entre 256 a 1343 posições.

PARTE 3

Agora, vamos dar um pouco de emoção, e por a Nave em movimento!
Criaremos um Loop de movimento com o Comando Movesprite. 


      do
      movesprite sprite_1,128,128
      x++
      if x>448 then x=128
      sleep 1
      loop

Agora, entendendo o que fizemos. do e loop definem o laço de repetição. 128 é a posição da tela em que o sprite já é visível na Tela. O Operador X++, indica movimento x (horizontal) no sentido da Direita. O Comando If (Se) garante que o sprite saia de lado da tela e rapidamente volte pelo outro: Quando o movimento horizontal (x) ultrapassar (>) o limite da Tela direito (448), então (then) ele retorna ao início horizontal (128).
O comando Sleep controla a velocidade do movimento. O valor 1 é equivalente a 1/60.  Enfim temos:

        loadtiles navinha,1,256
        pallettes paleta,0,0,16

drawtile 256,20,20

       sprite_1=addsprite(4,4) 
       prosprite sprite_1,256,0

      do
      movesprite sprite_1,128,128
      x++
      if x>448 then x=128
      sleep 1
      loop

paleta
DATAINT $0000,$00EE,$0E0E,$000E,$0EE0,$00E0,$0E00,$0888 '  Pallette: 0
DATAINT $0CCC,$0088,$0808,$0008,$0880,$0080,$0800,$0000


navinha:
DATALONG $80000008 '  Tile: 0
DATALONG $87000078
DATALONG $87088078
DATALONG $878CC878
DATALONG $878CC878
DATALONG $87088078
DATALONG $87000078
DATALONG $80000008
DATALONG $00000000 '  Tile: 1
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000 '  Tile: 2
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000 '  Tile: 3
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000
DATALONG $00000000



Se a nave se move, então voilá!  Caso não consiga, verifique se os espaços estão corretos. Você conseguirá mover a nave pro lado oposto caso troque X++ por X--. Até a próxima. 


GLOSSÁRIO:

Loadtiles: Carrega os Tiles na memória de vídeo (VRAM).
DATALONG: Dados do Tipo Long. No caso, o conjunto de 8 códigos que forma o Tile.  
Pallette: Carrega as paletas de Cores, além do comando Ink.
DATAINT: Dados do Tipo Integer. No caso, a Paleta de Cores de 0 a 3.
Drawtile: Desenha um Tile na tela em X e Y.
Propsprite: Define os Tiles e a paleta de cores de um Sprite.
Movesprite: Altera os locais de um Sprite em X e Y. Valores abaixo de 128 serão ocultos na tela.
Addsprite: função  que cria um nov Sprite a ser exibido. Aqui em definido em Y e X, não o oposto.

quinta-feira, 15 de agosto de 2019

Parte 2 - Entrando no BasiEgaXorz


CONFIGURANDO O ESPAÇO DO DESENVOLVIMENTO
Enfim, encontrei um Programa pra me ajudar no Mega Drive.  Ele se chama BasiEgaXorz ou simplesmente BEX, desenvolvido por Joseph Norman e encontra-se no Site: http://devster.monkeeh.com/sega/basiegaxorz/.

segunda-feira, 5 de agosto de 2019

Parte 2 - Conceitos de programação

E aqui vou eu de novo, no entendimento de programação. Mas para isso, tento aprender alguns conceitos.

O site www.smspower.com possui um tutorial bem basico pra programar os jogos de Master System, com informações bem genéricas.

  • Comentários - Textos que o Assembly ignora. Sâo suas anotações. Usamos ; antes pra escrever numa linha ou entre / * e */ num bloco. No Mega, uso um '
  • Numeros - Nós compreendemos os números de maneira decimal. O computador funciona com linguagem binária e usamos os comandos com linguagem hexadecimal (Por isso, os consoles serem 8, 16, 32 bits; os jogos serem 1,2,4 Mega; as cores serem 64 e 512 no Mega e Master, etc) é útil usar a calculadora cientifica pra transformar os números se pintar duvida.
  • Directs - Oferece controle  como o Assembler entende o Código. São comandos para  Assembler. Os layouts de memoria comuns tem as terminações: .org e .bank (diz onde a saída deve ser colocada); .memorymap (onde a RAM e ROM aparecem no ponto de vista da CPU); .rombankmap (informa como o arquivo ROM é estruturado em mapeamento); .section e .slot (passa devisões sobre codigo de dados); .ramsection (estrutura uso da memoria de maneira flexivel)
  • Labels - Ou rótulos. Sequencias de texto que permitem executar linhas de código ou dados em vez de numeros.
  • Opcodes - Instruções que serão executadas pelo Z80. Tem mais de 1000, 158 tipos de instrução.
  • Memória - quem já está acostumado com Games já ouviu falar de memoria RAM e ROM. A ROM é "Read Only Memory" referente ao  software. A RAM é "Randomic Acess Memory" referente ao hardware. No Master tem 8KB.
  • Registers - Tipo especial de memoria. Onde mantemos os dados. Usados em RAM e ROM. Tem aproximadamente 22 registers.
  • Ports - comunicação com o mundo externo.

O texto em breve, será editado alguns acrescimos, até ser possivel usa-lo como consulta.



Aproveito e dou uma olhada tambem na paleta de 64 cores do Master e seus códigos, o valor hexadecimal e o valor RGB (Red-Green-Blue). Afinal, preciso aprender como fazer a Arte do jogo.



segunda-feira, 29 de julho de 2019

Parte 1 - Preparativos e Ferramentas...


Enfim, peguei coragem e comecei a tarefa....
Uma vez iniciado desejo de montar/modificar um Game SEGA, me dediquei a conhecer bem o que eu ia trabalhar: o programa, embora conhecia alguma coisa como jogador. Boa parte dos meus conhecimentos eram sobre as Cores, o limite de Megas (bits e não bytes como confundem muitos gamers de hoje) e os canais de áudio. Eu sabia que o Master usava o Zilog (Z80), e o Mega além do Z80, usava o Motorola (MC68000).
Na Wikipedia e outros sites encontrei as especificações do Master System: 

  • CPU: Zilog Z80 8-bit 3 579 545 Hz (3.58 MHz) em PAL/SECAM e NTSC
  • Gráficos: Chip customizado da SEGA baseado do modelos Texas Instruments TMS9918/9928 com adições
  • 384 Kbits ROM, jogos usam método de mudar páginas (cada página é 128Kbit) para ter acesso a toda a área do cartucho
  • Som: Texas Instruments SN76489 4 canais mono (chip FM YM2413 disponível apenas no aparelho Japonês)
  • 8KB RAM
  • 16KB Video RAM
  • 16 cores simultâneas de 64 disponíveis (é possível usar o maximo de 32).
  • Resolução de tela de 256x192 (modelos mais recentes também suportam outras resoluções, 256x224 e 256x240)
  • 3 geradores de som quadrado + 1 gerador de som de Ruído branco



No Mega Drive, seu processamento inclui tudo isso mais estas especificações:

  • CPU: Motorola MC68000, 7,68 MHz (Virtua Racing conseguiu 13,4 MHz)
  • Gráficos: Chip VPD
  • 384 Kbits ROM, jogos usam método de mudar páginas (cada página é 128Kbit) para ter acesso a toda a área do cartucho
  • Som: chip FM YM2612  
  • 64 KB RAM
  • 64KB Video RAM
  • 4 paletas de 16 cores simultâneas de 512 disponíveis (é possível usar técnicas pra aumentá-las).
  • Resolução de tela de 256x192 e 320 x224 (pode ampliar pra 320x512)
  • 9 geradores de som 


Bem, parece fácil de entender! (ironia on!) Mas é importante saber na hora de fazer os cálculos dos limites do jogo programado. 
Agora para começar a jornada fui pesquisando o que precisaria.

Para o Master System, encontrei no site SMS Power (www.smspower.com), as dicas do Maxim, e vi na lista:
  •  um compilador de texto
  • um montador
  • um emulador
  • Suportes como Editor de Tiles
O Maxim sugeriu alguns programas pra cada caso. Fiquei com a lista assim:
  • O editor  ConTEXT
  • O montador  WLA DX
  • MEKA(que eu já possuía. É antigo mas sempre bem lembrado)
  • O editor  BMP2Tile
Eu confesso que li muito as dicas pra aprender a programação para Master System. Algo aqui foi entendido, algo ali... porque o Z80 é arcaico. Tentei usar um Editor de Tiles pra fazer um simples Hack gráfico, o Master Tile Converter e o Tile Molester, mas fiquei perdido com cores estranhas que apareceram na tela. 
Mas quando procurei instruções para Mega Drive, ficou mais fácil à primeira vista. Eis o que vi na própria Wikpedia:

  • O Editor de Imagens ImaGenesis 
  • O montador  BasiEgaXorz
  • O emulador Gens (que parece muito mais suave na execução que o Meka)
  • O editor SGTD.
Ainda encontrei que era útil um HexEdit para carregar o som dos jogos. Só espero que com tanto programa, meu PC não exploda... Com estas ferramentas a coisa foi andando mais rápido, e simplesmente não "entrava por um ouvido e saía por outro", mas eu vi resultados pequenos. E é deles que vou falar na próxima postagem.  
   

sábado, 27 de julho de 2019

Estreando com muita Dúvida...

A quem se interessar! =)
Este Blog foi criado criado por um sujeito que gosta de escrever histórias em contos e livros, e adora videogames antigos. Sou fã de jogos SEGA, em especial o Master System e o Mega Drive, é meu sonho de infância e adolescência foi criar seu próprio jogo.  

É mais um diário pra registrar os sucessos e fracassos. Talvez mais os fracassos, mas está gostoso aprender cada dia um pouco mais sobre programação e romhacking. 

O desejo de escrever num Blog, mesmo que não tenhamos qualquer preocupação em divulgar, é tornar fácil e acessível também o caminho para outros que iniciam e estejam pesquisando por aí, facilitar dúvidas minhas dúvidas pode ser facilitar as dúvidas de outros.

Damos o Start agora e vamos embora!