Login

Esqueci minha senha

Últimos assuntos
» [Dúvida] Qual a importância dos "Parênteses"no"if"
por AlexBosquin Hoje à(s) 5:50 am

» [SAIBA O QUE É!] IBR Magazine
por Isquilo_Roedor Ontem à(s) 10:54 pm

» Animação para Jogos
por Roooger Ontem à(s) 10:09 pm

» como mostrar valores em ordem alfabetica
por matheusco Ontem à(s) 5:36 pm

» a procura de dicas e ideias
por Isaque Onix Ontem à(s) 1:29 pm

» [GMBR JAM #01] TNT
por JoaoVanBlizzard Ontem à(s) 1:26 pm

» Contador De Moedas
por Wendryos - Black Horn Ontem à(s) 12:45 pm

» Casa Estilo TDS
por gabriel33245900 Ontem à(s) 12:27 pm

» [AJUDA] Personagem com Sprites divididos
por Roooger Ontem à(s) 10:40 am

» [Android] Square
por caiquerafinha Ontem à(s) 9:25 am

» [Android] Outside Forest
por DooMan Ontem à(s) 9:03 am

» [Dúvida] Trabalhando com objetos animados 3D [GMS]
por Sewer Crawler Ter Dez 16, 2014 8:08 pm

» Baixe Professora game maker 2
por efraim leonardo Ter Dez 16, 2014 8:04 pm

» Opinião: Site sobre etapas do desenvolvimento.
por matheusco Ter Dez 16, 2014 7:27 pm

» Equipe para desenvolvimento de jogos educativos
por Isaque Onix Ter Dez 16, 2014 7:20 pm

» [GMBR Magazine] Vagas para CDC's
por Shafter_ Ter Dez 16, 2014 7:18 pm

» Movimentos por acelerômetro
por WellingtonBecker Ter Dez 16, 2014 6:17 pm

» Vibração para Windows Phone
por wicttor.sullivan.2 Ter Dez 16, 2014 3:57 pm

» IA Básica de TDS por GONÇALVES
por DeeW. Ter Dez 16, 2014 3:16 pm

» Enquete Portal
por PedroX Ter Dez 16, 2014 2:47 pm

» Erro ao exportar APK
por Ronaldo Rodrigues Ter Dez 16, 2014 2:32 pm

» Concurso GMBR 2014: A morte é um novo começo
por Riccardoric Ter Dez 16, 2014 10:54 am

» Gear Clicker!
por theguitarmester Ter Dez 16, 2014 10:48 am

» [Jogo] Codex Vitarum
por matheusco Ter Dez 16, 2014 10:47 am

» [Engine]Inventario
por caiquerafinha Dom Dez 14, 2014 9:14 pm

» Sistema de 3 estrelas - Parte: 1
por caiquerafinha Dom Dez 14, 2014 8:26 pm

» [DICA] Portfólio profissional; Fonte de inspiração
por Roooger Dom Dez 14, 2014 8:13 pm

» Onde encontro um Inventário completo?
por caiquerafinha Dom Dez 14, 2014 7:25 pm

» Instalador com outros arquivos além do executável.
por matheusco Dom Dez 14, 2014 5:31 pm

» (CQ-A)Zinkis Family - "A Morte é um novo começo"
por caiquerafinha Dom Dez 14, 2014 3:28 pm

» [TUTORIAL] Seleção de level com globais
por gabriel33245900 Dom Dez 14, 2014 2:24 pm

» Pergunta pros desenhistas.
por matheusco Dom Dez 14, 2014 12:55 pm

» Problemas com GamePad
por Zero. Dom Dez 14, 2014 10:42 am

» Mapa em Top Down
por PacificoDesigner Dom Dez 14, 2014 7:47 am

» [Resolvido]Arquivos INI - Erro no código.
por matheusco Dom Dez 14, 2014 12:52 am

» Interface Score Online
por WellingtonBecker Sab Dez 13, 2014 9:57 pm

» Como Mudar Views
por Wendryos - Black Horn Sab Dez 13, 2014 7:37 pm

» Como escolher resolução do jogo?
por matheusco Sab Dez 13, 2014 5:07 pm

» [AJUDA] GMS UPGRADE
por matheusco Sab Dez 13, 2014 11:49 am

» Preciso entender a ferramenta GMK-Splitter
por |AoX|-richard Sex Dez 12, 2014 9:52 pm

» [CQ Anual] Reki
por makgamer Sex Dez 12, 2014 8:12 pm

» Arc World
por Kabeção Sex Dez 12, 2014 5:33 pm

» I Walk Alone(20%)
por Wendryos - Black Horn Sex Dez 12, 2014 3:11 pm

» Crio musicas em 8bits para jogos ;D
por Wendryos - Black Horn Sex Dez 12, 2014 2:50 pm

» [Resolvido] Programa que reparte imagem.
por Sewer Crawler Sex Dez 12, 2014 1:03 pm

» [CQ Anual] Devorador
por Zero. Sex Dez 12, 2014 12:55 pm

» Atacando sem parar
por Wendryos - Black Horn Sex Dez 12, 2014 12:38 pm

» MapGen - Pt.1
por Gonçalves Qui Dez 11, 2014 8:47 pm

» Tutorial de gravidade e movimento em rampas
por Isaque Onix Qui Dez 11, 2014 8:29 pm

» Hero (Projeto)
por JoaoVanBlizzard Qui Dez 11, 2014 2:50 pm

» Abrir arquivos em outros programas
por gabriel33245900 Qui Dez 11, 2014 11:38 am

» falta algo no meu código?
por theguitarmester Qui Dez 11, 2014 9:06 am

» [CAMPANHA] Salvem o Chatbox!
por theguitarmester Qui Dez 11, 2014 8:13 am

» [Duvida] Criação do mapa.
por Sewer Crawler Qui Dez 11, 2014 2:00 am

» [Tutorial] Sonoplastia - Instrumento + PC - PT.1
por Dancity Qui Dez 11, 2014 12:11 am

» Como usar o draw_text com duas variaveis juntas
por Isaque Onix Qua Dez 10, 2014 11:28 pm

» Procurando um bom spriter para equipe[PIXELART]
por Isquilo_Roedor Qua Dez 10, 2014 8:26 pm

» [RESOLVIDO]Movimentação para subir/descer rampa
por Isaque Onix Qua Dez 10, 2014 7:51 pm

» Comunidades GM de outras línguas.
por vitorfernandes13 Qua Dez 10, 2014 7:45 pm

» [RESOLVIDO]Problema move towards bug!
por gabriel33245900 Qua Dez 10, 2014 6:31 pm

» [CQ ANUAL] Soul Eternium
por leocc Qua Dez 10, 2014 6:24 pm

» Botão Compartilhar
por tiotolas Qua Dez 10, 2014 5:33 pm

» Sons com tempo de atraso
por marcossfc Qua Dez 10, 2014 2:42 pm

» Engine de plataforma(Naruto)
por Sewer Crawler Qua Dez 10, 2014 12:44 pm

» Smart Snake
por theguitarmester Qua Dez 10, 2014 7:42 am

» Engine simples cheia de codigos para Plataforma!
por Raule Qua Dez 10, 2014 3:12 am

» Centralizar Texto com BUG
por gabrielsch Ter Dez 09, 2014 11:38 pm

» Meu primeiro sprite
por Isquilo_Roedor Ter Dez 09, 2014 10:52 pm

» [RESOLVIDO]Como criar 9 flechas em anglo?
por Sewer Crawler Ter Dez 09, 2014 10:38 pm

» SDK android
por Ronaldo Rodrigues Ter Dez 09, 2014 9:57 pm

» [Aula 06]Criando objeto e programando
por gabriel33245900 Ter Dez 09, 2014 8:48 pm

» Digimon: Digital Tamer - Ultimate Demo Edition
por migueltopsp Ter Dez 09, 2014 6:54 pm

» [Resolvido] Problema com Background fixo
por Riccardoric Ter Dez 09, 2014 6:22 pm

» [Concurso] Ludum Dare #31
por Riccardoric Ter Dez 09, 2014 4:27 pm

» Não consigo visualizar imagens do forum :/
por Riccardoric Ter Dez 09, 2014 1:51 pm

» FutVida - A sua vida de jogador de futebol
por Fernando Monteiro Ter Dez 09, 2014 10:41 am

» Movimentação em tabuleiro
por AxeInline Ter Dez 09, 2014 9:30 am

» Precisando de sprites pixel art
por vitor_liminha123 Ter Dez 09, 2014 8:49 am

» Slot de 1 só objeto!
por AxeInline Ter Dez 09, 2014 7:10 am

» O Palácio de Sucata
por Kabeção Seg Dez 08, 2014 11:33 pm

» Avaliem meu jogo
por Raule Seg Dez 08, 2014 9:57 pm

» Demo Hatfields and MacCoys
por Raule Seg Dez 08, 2014 9:43 pm

» Background estilo sonic(que se move em partes)
por Sewer Crawler Seg Dez 08, 2014 9:33 pm

» Evento recomeçando!
por makgamer Seg Dez 08, 2014 8:30 pm

» [SORTEIO] E-book "Jogos no Japão" + Curso Japonês
por itarodrigo Seg Dez 08, 2014 3:37 pm

» Retornar a room
por matheusco Seg Dez 08, 2014 2:47 pm

» [Resolvido]Faça algo até que
por PedroX Seg Dez 08, 2014 2:18 pm

» Engine Parallax Background [Atualizado]
por theguitarmester Seg Dez 08, 2014 12:00 pm

» Maneira de função atualizada??
por matheusco Seg Dez 08, 2014 9:30 am

» [Resolvido] Ajuda com Create Instance
por matheusco Dom Dez 07, 2014 9:53 pm

» Melhor maneira de criar terreno.
por matheusco Dom Dez 07, 2014 9:51 pm

» [tutorial && engine] Cronometro-Contador regresivo
por tiotolas Dom Dez 07, 2014 6:31 pm

» Problema de slot!
por matheusco Dom Dez 07, 2014 5:21 pm

» O perigoso Projeto! v 1.0.1
por |AoX|-richard Dom Dez 07, 2014 2:39 pm

» GMBR JAM #01 - Resultado
por Lukbebalduke Dom Dez 07, 2014 2:28 pm

» RESOLVIDO Criar 1 sistema de inventario sem array?
por matheusco Dom Dez 07, 2014 4:46 am

» Qualidade e recursos em projetos
por kammer_black Sab Dez 06, 2014 11:11 pm

» [Plataforma]Engine de certas funções:D 2 parte!
por gabriel33245900 Sab Dez 06, 2014 6:56 pm

» TED Quest
por paulovmdutra Sab Dez 06, 2014 6:02 pm


Manipulação binária de arquivos/memória (Game Maker)

Página 1 de 2 1, 2  Seguinte

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Manipulação binária de arquivos/memória (Game Maker)

Mensagem por GameMakerTutoriais em Qua Jan 04, 2012 10:04 pm



Manipulação binária de arquivos/memória

No nosso tutorial anterior sobre operadores bitwise (clique aqui) nós aprendemos quais são as operações usadas para trabalhar com bits. Também vimos que essas operações partem da lógica de comparação entre dois bits e que os operadores são AND, OR, XOR ou NOT. A partir dessa aula nós vamos dividir o conteúdo da matéria para cada linguagem, pois cada uma tem seus pormenores e precisam de uma explicação mais detalhada antes de prosseguirmos. Nessa aula, usaremos o Game Maker. Boa sorte, bons estudos e use o tópico pra perguntar alguma coisa se precisar.

Nós já sabemos que tudo em nosso computador é feito por bits. Uma foto em Jpeg é feita de bits tanto quanto uma música em Mp3, no entanto, o que faz a diferenciação entre seus conteúdos é o software usado para abrir cada um desses arquivos. O leitor de fotos está preparado para decodificar o formato Jpeg e o player de áudio decodificar para o formato Mp3. Porém, alguns arquivos podem ter suas extensões trocadas e ser abertos por programas para os quais eles não foram escritos. É claro que essa experiência será inútil, pois não resultará em nada além de bagunça na interpretação dos dados. Como exemplo, tente abrir uma foto Jpeg em um editor de textos e o resultado será um texto indecifrável!


Isso se deve ao fato de que o computador não se importa com o que significa aquele monte de bits! O que importa de fato é como eles são interpretados pra nós, seres humanos. Aí é que entra o papel do software, que vai decodificar o conteúdo da forma correta e mostrar pra gente nos periféricos, seja monitor, caixa de som, impressora, etc.. Então, para manipularmos esses dados binários nós precisamos saber exatamente o que significam esses valores representados por cada bit ou byte, obedecendo a ordem e estrutura do arquivo que estamos lidando. Precisamos conhecer como o arquivo é montado e onde estão as informações que precisamos.

A maioria dos tipos de arquivos mais conhecidos (bitmap, jpeg, mp3, png, gif, wav...) segue uma ordem predefinida para que os dados sejam gravados em seu conteúdo. Isso é muito bom pois evita erros tanto na escrita quanto na leitura dos dados. Na maioria das vezes, essa ordem é dita por uma espécie de tabela que fica no início do arquivo, partindo do primeiro byte até algum tamanho predefinido (dependendo do tipo do arquivo), que chamamos de cabeçalho. E quase todo tipo de arquivo tem seu próprio cabeçalho. Ele contém várias informações importantes, referentes ao conteúdo e como ele deve ser interpretado pelo software.

Como exemplo, vamos ver como é o cabeçalho de um arquivo Bitmap genérico, sem compressão... É o formato de imagem mais comum que existe e é de fácil manipulação. Foi adotado pela Microsoft até para uso em memória do próprio Windows, por ser simples e depender de muito pouco pré-processamento. Também existem outros formatos de Bitmap que usam um método de compactação chamado de RLE. Inclusive, é a mesma compactação usada em vários outros tipos de arquivos conhecidos que usamos diariamente! Mas, por hora, vamos deixar o RLE um pouco de lado... Ainda teremos matérias especiais sobre compactação em outras ocasiões! Todavia, quando o Bitmap usa RLE, é somente em casos onde o arquivo tem, no máximo, 256 cores (bitmap indexado). No nosso exemplo, o Bitmap usará o padrão True Colors, que é excessivamente grande, mas de fácil compreensão.

O cabeçalho do formato Bitmap possui 54 bytes, sendo que:
2 Os dois primeiros bytes são marcados com os caracteres ASCII “B” e “M”, para identificar o arquivo como sendo um Bitmap.
4 Bytes para identificar o tamanho do arquivo (em bytes).
4 Bytes reservados para futuras implementações no formato. No momento devem ser todos marcados como zero (0).
4 Bytes que indicam onde começam os dados da imagem (dentro do conteúdo binário). No nosso caso será, obviamente, o tamanho do cabeçalho (54, decimal), pois é ele que se deve “saltar” para começarmos a ler/escrever a imagem.
4 Bytes que indicam uma espécie de “sub-cabeçalho”, o valor deve ser 40 (decimal).
4 Bytes que indicam a largura da imagem em pixels
4 Bytes que indicam a altura da imagem em pixels
2 Bytes que indicam o número de camadas da imagem. Marque como “1”
2 Bytes que indicam a quantidade de bits por pixel, no nosso exemplo, deve ser o valor 24
4 Bytes que indicam o tipo de compactação do arquivo. Esse valor pode ser 0 (sem compressão), 1 (RLE 8 bits) ou 2 (RLE 4 bits).
4 Bytes que indicam o tamanho da imagem (exceto o cabeçalho) em bytes. Esse cálculo é igual a (largura x altura x bytes por pixel)
4 Resolução horizontal da imagem
4 Resolução vertical da imagem
4 Bytes para representar o número de cores que a imagem usa. Deixe sempre como 0 para que esse valor corresponda ao máximo permitido, dentro das limitações especificadas no próprio arquivo.
4 Bytes para representar o número de cores importantes. Isso é mais usado quando o arquivo é Bitmap de 8 ou 4 bits. Marque esse campo como zero (0).


Vamos recaptular uma coisa importante agora! Como vimos anteriormente na nossa aula sobre RGB em games (clique aqui), cada pixel do formato True Colors é representado por 3 bytes, um para cada componente de cor. Embora a cor seja dada por Red, Green e Blue (pois segue a ordem real de cores do espectro luminoso), não é necessariamente essa a ordem em que os bytes são dispostos na memória. A ordem correta para trabalhar com eles é Blue, Green e Red (BGR). Portanto, a partir do ponto onde termina esse cabeçalho até o final do arquivo, cada conjunto de 3 bytes será um pixel da imagem.

Até aqui tudo bem, mas nem tudo são flores... No caso do Bitmap, há uma restrição na forma como esses bytes são escritos! Cada linha do Bitmap tem que ser um número de bytes múltiplo de 4. Caso não seja, você deve arredondar o número para o múltiplo mais próximo e preencher esses bytes extras com zero (0). Por exemplo, se a nossa imagem tivesse 295 pixels de largura, escreveríamos 888 bytes (296 x 3) ao invés de 885 bytes (295 x 3), sendo que os 3 últimos bytes dessa linha (888 – 885) serão nulos (0) e não farão diferença na imagem.

Além disso, os pixels da imagem são escritos de baixo para cima. O primeiro pixel corresponderá ao do canto inferior esquerdo e o último pixel será o do canto superior direito. Apesar de parecer complicado, essa forma de escrita torna o processo de manipulação muito mais simples, pois corresponde ao sistema natural de um plano cartesiano.

Sabendo tudo isso agora fica fácil criar um arquivo Bitmap até em scripts Batch. Quem freqüenta a nossa categoria do fórum sobre linha de comando possivelmente já deve ter em mente que bastaria criar um cabeçalho padrão, usar duas variáveis para os valores de largura e altura e escrever um Bitmap em branco. Taí um exemplo que eu fiz pra vocês de um arquivo batch para criar um Bitmap com tamanho preestabelecido. Ele só vai funcionar em sistemas que dão suporte ao Debug para processadores de 32 bits. Infelizmente no Windows 7 ele não funcionará.

Código:

@echo off
rem Script: Cria um bitmap em branco
rem Author: BrendanLS (bl8086)

if "%~1"=="" goto usage
goto initfile

:gethex
   set ntype=0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
   set char=%~1

   for %%a in (%ntype%) do for %%b in (%ntype%) do (
      set /a n=0x%%a%%b
      if !n! equ %char% (
         set hchar=%%a%%b
         goto quit
         )
      )

:hexnumb
   set /a nval=%~2

   for /l %%n in (0,1,3) do (
      set /a "ncalc = (nval >> (%%n * 8)) & 0xff"
      call :gethex !ncalc!
      set %~1%%%n=!hchar!
      )

   goto quit

:initfile
   if "%~2"=="" goto usage
   if "%~3"=="" goto usage

   set /a isreal=%~1
   if %isreal% equ 0 goto usage

   set /a isreal=%~2
   if %isreal% equ 0 goto usage

   set fname=%~3
   setlocal enabledelayedexpansion
   call :hexnumb w %~1
   call :hexnumb h %~2

   (
   echo n %fname:~0,8%.bmp
   echo e 100 42 4D EA 7C 0E 00 00 00 00 00 36 00 00 00 28 00
   echo e 110 00 00 %w0% %w1% %w2% %w3% %h0% %h1% %h2% %h3% 01 00 18 00 00 00
   echo e 120 00 00 B4 7C 0E 00 00 00 00 00 00 00 00 00 00 00
   echo e 130 00 00 00 00 00 00
   echo rcx
   echo 87
   echo w
   echo q
   )|debug > nul 2>&1

   goto quit

:usage
   echo.
   echo Sintaxe:
   echo criabmp [largura] [altura] [arquivo.bmp]


:quit
endlocal

Mas por que o script consegue criar um bitmap grande sem escrever o conteúdo de imagem dele? Embora saibamos que a memória do Debug é limitada a 64KB (portanto não há como escrever o arquivo todo), o que acontece é que o Paint abre esse arquivo lendo somente o cabeçalho (que gasta apenas 54 bytes). E como não há conteúdo da imagem, ele coloca o conteúdo como nulo, ou “tela em branco”. Também teríamos a opção de “sujar” esse bitmap pegando valores que estão na memória Ram no momento em que executamos o debug. Esses valores são aleatórios, podendo criar um Bitmap com conteúdo diferente a cada vez. Nada muito útil, mas não deixa de ser interessante para criar efeitos diferentes! Lembre-se que temos que explorar ao máximo os recursos que temos à mão.

Game Maker - Brincando com conteúdo binário:

Depois de toda aquela chatice sobre lógica e teoria, finalmente chegou a hora de botar a mão na massa! Agora vamos aprender a ler e escrever dados em arquivos usando bits. As operações de escrita e leitura são muito simples e não são diferentes do que você já está acostumado. São funções diretas que procuram um determinado valor de byte em alguma posição no arquivo. No exemplo que criei para o Game Maker, fiz um script que carrega um arquivo bitmap direto para dentro de uma surface, lendo cada pixel individualmente:

Hospedado no 4Shared, 1,1 MB:

Bom, alguns poderão pensar que "lidar com bitmaps no Game Maker usando um script que nós mesmos criamos (e ainda por cima usando surfaces)" será uma tremenda perda de tempo. Afinal, nele temos funções nativas e outras alternativas melhores de arquivos, como o PNG por exemplo. O que eu quero ressaltar aqui é que o interessante pra nós é o aprendizado. Não fique restrito ao script pois ele é só um exemplo básico do que você poderá fazer quando aprender a usar esses recursos. Você poderá criar (por que não?) seus próprios tipos de arquivo onde só o seu software será capaz de decodificar. Ou quem sabe, criar patchs para seus jogos apenas adicionando ou retirando dados binários do executável original. São muitas possibilidades, basta usar a criatividade!

Durante os nossos bate-papos lá no fórum da GMBR, rolou uma ideia de pegar um bitmap de 24 bits e transformar em um de 12 bits! Acabamos criando um arquivo de imagem personalizado de brincadeira. Nesse caso, cada componente de cor usaria um nibble (4 bits) ao invés de um byte (8 bits). A conversão ainda é bem simples, não é nenhum algoritmo robusto mas pelo menos dá pra ter uma noção do ganho de compactação do arquivo. Tudo já está no exemplo que fiz pra vocês. Taí o resultado da brincadeira nas imagens. O arquivo ficou menor e mais leve! O impacto da conversão das cores é o mesmo se usarmos o recurso de Posterizar a imagem no Photoshop usando 16 níveis de cor:


Imagem original: ela é um Bitmap de 24 bits, sem compactação:



Nossa imagem personalizada: ela usa 12 bits por pixel, reduzimos o tamanho do arquivo pela metade!



As funções que utilizaremos:


file_bin_open(fname, mod) - Abre um arquivo para manipulação binária. Fname é o nome do arquivo e seu caminho. Mod é o tipo de tratamento onde os valores podem ser: 0 para apenas leitura, 1 para apenas escrita e 2 para ambos. Essa função retornará um número id que utilizaremos para identificar esse arquivo nas demais funções binárias (como qualquer função que lida com arquivos). Isso é necessário, pois podemos trabalhar com até 32 arquivos simultaneamente. Também é bom lembrar que se o arquivo não existir, ele será criado pela função.

file_bin_close(fileid) - Termina as operações e fecha o arquivo. O id, como disse antes, deve ser especificado. Essa função é muito importante. Lembre-se se que - se tratando de manipulação binária - quando um arquivo está sendo usado no Windows, ele fica restrito para os demais aplicativos até que seja liberado pelo aplicativo que o está manipulando. Apesar de não ser obrigatório, é sempre bom fechar o arquivo para evitar erros.

A partir do momento em que abrimos um arquivo através de file_bin_open(), nós vamos navegar pelo conteúdo dele através de um indicador de posição que chamamos de ponteiro (não confunda com ponteiros de memória em variáveis). Antes de ler ou escrever algum byte no arquivo nós temos que mover o ponteiro para a posição que queremos e então operar com o valor que está lá. As funções a seguir lidam especificamente com isso:

file_bin_position(fileid) - Retorna a posição atual do ponteiro, em bytes. A posição 0 (zero) se refere ao início do arquivo.

file_bin_seek(fileid, pos) - Move o ponteiro para uma posição qualquer, em bytes. Há um fator importante a ser exclarecido aqui. Quando movemos o ponteiro para uma posição maior que o tamanho do arquivo e escrevemos alguma coisa ali, o tamanho do arquivo também será mudado para essa posição, ou seja, aumentará. Por exemplo, se você tiver um arquivo de 1 mb, mover o ponteiro para 700 mb e escrever um dado qualquer, o novo tamanho do arquivo será de 700 mb.

É por isso que não existe a função "append" como há nos arquivos de texto, pois ela é desnecessária. Para fazer um append no arquivo, basta mover o ponteiro até o final dele. Para saber o tamanho do arquivo, há a função file_bin_size(fileid), que retorna o tamanho em bytes.

file_bin_read_byte(fileid) - Lê o valor do byte na posição onde o ponteiro se encontrar.
file_bin_write_byte(fileid, byte) - Escreve um byte na posição onde o ponteiro se encontrar.

Por questão de comodidade, no Game Maker só temos leitura e escrita para bytes e não para bits. Para manipularmos bits, vamos usar a lógica binária que aprendemos no tutorial anterior. Através dela poderemos usar quantos bits quisermos, não importando a quantidade. Poderemos tratar cada bit individualmente ou usar nibbles. Nibble é o nome dado à um conjunto de 4 bits, ou seja, a metade de um byte.

À primeira vista, pode parecer inútil usar nibbles, mas é muito bom racionar de forma inteligente os recursos que temos! Vários hacks de roms de consoles 16bits se baseiam em valores de RGB simplificados, usando 5 bits ao invés de 8 para cada componente de cor. No sistema de cores do Super Nintendo, por exemplo, essa é a forma de armazenar cores: cada componente RGB usa 5 bits, o que abrange um valor de 0 a 31 possibilidades para cada um. Nesse caso, com apenas dois bytes (16 bits) temos um sistema de cores simples, mas eficiente!


Paleta de cores do Snes: 32 x 32 x 32 = 32768 cores

Você pode capturar um snapshot pelo emulador, olhar o valor RGB real da cor que gostaria de alterar, converter para esse sistema de 16bits, localizar o valor binário dentro da rom e modificá-la até mesmo através do Game Maker! É claro que existem outros detalhes, mas falaremos disso em outro tópico!

Até aí tudo bem, mas... Como eu faço pra trabalhar com valores maiores que 1 byte? Bom, é aí que entra o nosso operador bit shift em conjunto com os operadores lógicos, que estudamos no tutorial anterior (clique aqui). Vamos supor que você tenha um número inteiro que está entre 0 e 35.535, ou seja, um valor do tipo Word. Sabendo que ele gasta 2 bytes na memória para ser armazenado, o que vamos fazer é armazenar esses 2 bytes separadamente em um arquivo qualquer. Por exemplo:

Código:
valor := 19822; // Número que desejamos armazenar em arquivo
file_bin_write_byte(arquivo, valor >> 8); // Grava o primeiro byte do valor (77)
file_bin_write_byte(arquivo, valor & $ff); // Grava o segundo byte do valor (110)

Para ler o valor é ainda mais fácil:

Código:
valor := 0;
repeat (2) // Faz um loop com o número de bytes que a variável usa
begin
   valor := valor << 8;
   valor := valor | file_bin_read_byte(arquivo);
end;

A mesma regra vale para qualquer outro tipo de variável, mesmo que seja um valor negativo ou fracionado. Basta organizar bem onde você guarda esses dados no arquivo, e claro, o tamanho correto de cada um. Crie esquemas de tabelas para seus arquivos (como o exemplo do bitmap) para facilitar seu trabalho. Faça rascunhos ou anotações de como a estrutura binária do seu arquivo vai funcionar. Organização é essencial nessas horas! Enfim, acho que por enquanto é só! Se eu puder ajudar a eliminar alguma dúvida, é só perguntar aqui no tópico, vou ficar feliz em responder! Abraços e bons estudos!




Última edição por Borderline em Sex Dez 14, 2012 2:06 pm, editado 4 vez(es)

GameMakerTutoriais

Número de Mensagens: 800
Data de inscrição: 29/01/2011
Versão:
  • Game Maker 8.0
  • Game Maker 8.1

Reputação: 26

Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por thundercats em Qua Jan 04, 2012 10:57 pm

Ninja8086

CARAMBA !!!
aula incrivel !!
aposto que ta cheio de salas secretas esse forum Cool

Editado por Joton
Evite post sem conteúdos na próximo você pode perde warning

thundercats

Número de Mensagens: 161
Idade: 19
Data de inscrição: 20/09/2011
Reputação: 1

Prêmios
   : 0
   : 0
   : 0

http://gamemakerhtml5.blogspot.com/p/jogos.html

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por GameMakerTutoriais em Qua Jan 04, 2012 11:08 pm

Acho que ficou meio grande rsss, tomara que não tenha ficado cansativo! Smile Qualquer dúvida, estamos aí... Valeu!

GameMakerTutoriais

Número de Mensagens: 800
Data de inscrição: 29/01/2011
Versão:
  • Game Maker 8.0
  • Game Maker 8.1

Reputação: 26

Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por PedroX em Qui Jan 05, 2012 9:39 am

Eu li o tutorial inteiro.
Ficou bem interessante.
Foi muito bom você colocar a tabela da estrutura bitmap.
Vou procurar mais tabelas do tipo, para ver como são outros arquivos.
Eu acho que 256^3 cores é muita coisa. Acho que se usassem a metade disso seria o suficiente e as imagens seriam mais leves.
Vou tentar fazer algo aqui e quando surgir alguma dúvida eu posto aqui.

___________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:

PedroX

Ranking: Nota C
Número de Mensagens: 5981
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

Notas recebidas: C+B
Reputação: 273

Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por Convidad em Qui Jan 05, 2012 9:51 am

Realmente,este tutorial merece todo o mérito.Você soube usar bem o código de criar bitmaps,com binário e tals.Me interesso muito por batch e inclusive acho que sou melhor com batch do que com qualquer coisa xD
Este tutorial ficou tão bom que até li ele 2 vezes.

Meus parabéns,e sempre que quiseres postar tutoriais assim,poste,pois aprendo muito contigo Happy

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por GameMakerTutoriais em Qui Jan 05, 2012 12:14 pm



@Pedro

256^3 é muita coisa mesmo! O arquivo vai ficar grande. Como eu tinha comentado antes, dá pra reduzir pra outros esquemas mais leves. Aquele sisteminha de 2 bytes que eu comentei, usa 5 bits pra cada cor (0 a 32), e deixaria o arquivo 1/3 menor em tamanho.

Faz as contas, 32 x 32 x 32 = 32768 cores. É um número muito bom e pra sprites pequenos, fica bem compacto. Essa paleta aqui é a variação de todas as 32768 cores (paleta do Snes):



Mesmo assim ainda dá pra reduzir pra apenas 1 byte, só que o número de cores seria só 256, e a gente teria que ter uma tabela dessas cores. Mas se o camarada fizer uma conversão boa, fica excelente. Essa por exemplo é da Micro$oft:



Aqui é uma imagem com essa paleta da dita cuja:



O Gif usa esse esquema: reduz pra 256 cores e usa compactação LZW. Daí fica pequeno, mas é osso esse algoritmo do LZW... Enfim, jeito tem vários, o lance aí é você saber aproveitar o espaço que vc tem pra guardar o que quer.



@TRFN

Obrigado! Opa, legal saber que vc curte batch script! Também gosto demais! Já participei de um monte de comunidade, um fórum que eu acho excelente é o Batch-Satti. Esse Batch-Satti tem o Boss-Head, é um dos melhores programadores que eu já vi! Fica a dica aí, já que vc gosta! Happy

GameMakerTutoriais

Número de Mensagens: 800
Data de inscrição: 29/01/2011
Versão:
  • Game Maker 8.0
  • Game Maker 8.1

Reputação: 26

Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por PedroX em Qui Jan 05, 2012 1:27 pm

Houve um problema quando eu testei o exemplo:


Na imagem apareceram algumas linhas brancas verticais.
Parece que isso ocorreu onde o brilho era maior...
O que pode ser?

Até mais!

___________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:

PedroX

Ranking: Nota C
Número de Mensagens: 5981
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

Notas recebidas: C+B
Reputação: 273

Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por GameMakerTutoriais em Qui Jan 05, 2012 1:40 pm

Vou dar uma olhada. Aparece só quando carrega o canal vermelho? Ou com os outros também? E só com essa imagem ou com as outras também? Valeu!

GameMakerTutoriais

Número de Mensagens: 800
Data de inscrição: 29/01/2011
Versão:
  • Game Maker 8.0
  • Game Maker 8.1

Reputação: 26

Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por PedroX em Qui Jan 05, 2012 3:19 pm

Em todos os canais.
Não testei com as outras imagens.

Valeu!

___________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:

PedroX

Ranking: Nota C
Número de Mensagens: 5981
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

Notas recebidas: C+B
Reputação: 273

Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por GameMakerTutoriais em Qui Jan 05, 2012 3:28 pm

Tenta abrir as outras e vê se dá isso também. Preciso ver se é algo relacionado com o tamanho dessa imagem do Uncharted. O estranho é que aqui todas abrem sem isso. Tenta aí e me diz. E qual é o seu Gm? Valeu!

GameMakerTutoriais

Número de Mensagens: 800
Data de inscrição: 29/01/2011
Versão:
  • Game Maker 8.0
  • Game Maker 8.1

Reputação: 26

Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por PedroX em Qui Jan 05, 2012 3:42 pm

É o Game Maker 8.0.

Eu coloquei a imagem do 640kb world, não tinha outra aqui, o resultado foi o mesmo. Só que agora as linhas apareceram em cima do 'kb' e no final também.

Outra dúvida: se eu usar 5 bits para cada componente da cor, teria o mesmo tamanho (as imagens teriam o mesmo tamanho) que usar 4 bits? De qualquer jeito seria 2 bytes. A menos que poupando alguns bits desse para juntá-los e formar outra cor.

___________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:

PedroX

Ranking: Nota C
Número de Mensagens: 5981
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

Notas recebidas: C+B
Reputação: 273

Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por GameMakerTutoriais em Qui Jan 05, 2012 5:22 pm

Pedro, eu tentei olhar aqui de várias formas, tá estranho! Tentei no Gm6, no 7, no 8, todos abriram normal, tentei mudar resolução também e nada. Eu penso que se fosse algum "pulo de pixel" no script, ele seria uniforme pela imagem toda... eu comparei essa imagem com a gerada aqui no meu pc, são iguais, daí não pode ser saltos scratch

Tudo me faz pensar que pode ser algum problema com surface! Mas tá difícil dizer o que é, não tenho ideia do que pode tá causando isso. Eu tentaria diminuir bastante a surface nesse caso pra ver o que aconteceria. Pessoal, se alguém mais tiver testado e puder nos dar um retorno, por favor postem aí o que houve pra gente tentar ajudar!

Outra dúvida: se eu usar 5 bits para cada componente da cor, teria o mesmo tamanho (as imagens teriam o mesmo tamanho) que usar 4 bits? De qualquer jeito seria 2 bytes. A menos que poupando alguns bits desse para juntá-los e formar outra cor.

Usando 5 x 3 = 15 ainda sobra 1 bit dos 16 totais. Esse 1 bit vc tem duas alternativas: ou deixa ele lá sem mexer (pra facilitar a programação) ou aproveita ele juntando com os outros bits que sobrarem. A cada 16 bytes vc então economizaria 16 bits, aí é só usar essa sobra se fossem 2 bytes comuns e distribuir o valor entre esses bits.

Você pode usar do jeito que quiser. Dá um pouco de trabalho, mas faz as contas: se a cada 16 bytes você ganha 2 extras, proporcionalmente você tá ganhando 12,5 % de espaço em disco. Um arquivo de 1MB passaria a ter 896KB. A mesma coisa vale pra 4 bits só que nesse caso vai ser bem mais fácil pq vc tá mexendo com 1 byte e 1 nibble, que são valores pares.

Um esquema que facilita pra mexer com número ímpar de bits é você achar um múltiplo do valor. Por exemplo, o 5 bits. O múltiplo que cabe pra esse caso é usar 40 bits (8 bits x 5), portanto, 5 bytes. Daí você divide ele dessa forma:



É mais fácil de programar porque essa separação você faz só uma vez, o resto fica por conta de loops usando esse esquema.

GameMakerTutoriais

Número de Mensagens: 800
Data de inscrição: 29/01/2011
Versão:
  • Game Maker 8.0
  • Game Maker 8.1

Reputação: 26

Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por PedroX em Qui Jan 05, 2012 5:49 pm

Você poderia fazer um exemplo, se não for pedir muito, de um sistema de Nibbles mesmo (12 bits)? 'Sistema' que eu digo é uma imagem onde cada pixel possui 12 bits de tamanho.

Até mais!

___________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:

PedroX

Ranking: Nota C
Número de Mensagens: 5981
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

Notas recebidas: C+B
Reputação: 273

Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por GameMakerTutoriais em Qui Jan 05, 2012 6:29 pm

Ok! Vamos pra um exemplo na prática. Cada cor usa 12 bits, portanto BGR ficaria B = 1 nibble, G = 1 nibble, R = 1 nibble. Essa função faz um loop desde o início do arquivo até o final do arquivo, dessa forma:

-> Uma variável controla qual nibble será usado, se o da esquerda (quando a var for 0) ou o da direita (quando a var for 1). Se for o da esquerda, obviamente nós vamos ler um novo byte no arquivo usando file_bin_read_byte(), se for o da direita, nós vamos esperar.

-> Uma variável controla qual o componente BGR vai receber o nibble. 1 = B, 2 = G, 3 = R. A cada loop ela tem um incremento e toda vez que ela for maior que 3, significa que a cor está pronta e vamos reiniciar o processo.

-> O valor máximo de um componente de cor é 256. Portanto 256/nibble = 16. Simplificando, estamos reduzindo o sistema de cores de 24 bits para 12 bits de forma proporcional. Esse é o nosso valor de proporção! Vamos multiplicar o nibble que lemos do arquivo sempre por 16 (para gerar a cor mais próxima possível do sistema original de 24 bits).

Código:

qual_componente := 0; // 0 = blue, 1 = green, 2 = red
nibble_a_ou_b := 0; // 0 = [bits 1 a 4], 1 = [bits 5 a 8]
cor_real := 0; // Usaremos os nibbles pra formar esta cor

do
begin
   
    if nibble_a_ou_b = 0 then
    begin
        byte_lido := file_bin_read_byte(arquivo);
        valor_do_componente := byte_lido >> 4; // Arrasta 4 bits pra direita
    end else valor_do_componente := byte_lido & $F; // $F = 00001111 (bits 5 a 8)
   
    nibble_a_ou_b += 1; // Altera entre os nibbles
    if nibble_a_ou_b > 1 then nibble_a_ou_b := 0;
   
    // Criando a cor pelos valores dos nibbles:
    switch (qual_componente)
    begin
        case (0): cor_real := (valor_do_componente * 16) << 16; break; // Arrasta para o byte blue
        case (1): cor_real := cor_real | ((valor_do_componente * 16) << 8); break; // Arrasta para o byte green e junta os valores
        case (2): cor_real := cor_real | (valor_do_componente * 16); break; // Junta com o byte Red
    end;
   
    qual_componente += 1; // Altera para o próximo componente
    if qual_componente > 2 then // Se terminar o processo de criar a cor
    begin
        /*
        ---------------------------------------------
        Aqui nós vamos usar a cor para qualquer coisa
        ---------------------------------------------     
        */
        qual_componente := 0; // Volta o loop para criar uma nova cor
    end;

end until file_bin_position(arquivo) = file_bin_size(arquivo);

Ok, agora vamos fazer isso na prática mesmo, usando o Game Maker e um arquivo bmp de 24 bits. O que eu fiz aqui nesse exemplo é converter os valores de 24 bits pra 12 bits, dividindo o valor do byte 256 por 16 onde o resultado será 16, ou seja, um nibble de informação. Até aí tudo bem, só não repare porque isso não é nenhum algoritmo espetacular do Photoshop, então a conversão das cores é bem simplória! Laughing


Depois que você carrega o bitmap, ele lê cada byte e vai transformando em nibble fazendo essa divisão, e depois va1 gravando no arquivo novo. Ou seja, agora a gente tem um bitmap de 12 bits! Como dá pra ver, o arquivo fica bem menor (na proporção que eu tinha dito antes). O segredo aqui é a gente tentar criar um algoritmo de conversão de cores melhor. Só que isso eu não sei fazer, acho que deve ser bem mais complicado.

Ou então, uma alternativa que eu tô imaginando aqui poderia ser usar um bitmap com as cores já otimizadas no Photoshop. Daí a divisão do byte pra nibble fica mais coerente com o que a gente quer. Falou!


Última edição por Ninja8086 em Sex Jan 06, 2012 11:39 am, editado 2 vez(es)

GameMakerTutoriais

Número de Mensagens: 800
Data de inscrição: 29/01/2011
Versão:
  • Game Maker 8.0
  • Game Maker 8.1

Reputação: 26

Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Manipulação binária de arquivos/memória (Game Maker)

Mensagem por PedroX em Qui Jan 05, 2012 9:44 pm

Muito bom.
Continua com as linhas brancas, mas pouco me importa, já que meu objetivo é aprender como fazer, talvez seja bem útil mais para frente.
Obrigado pelo exemplo.

Até mais!

___________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:

PedroX

Ranking: Nota C
Número de Mensagens: 5981
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

Notas recebidas: C+B
Reputação: 273

Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Página 1 de 2 1, 2  Seguinte

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum