Login

Esqueci minha senha

Últimos assuntos
» [DUVIDA]Variavel na Tela?
por Camin Hoje à(s) 12:55 am

» Problemas com Background!
por Camin Hoje à(s) 12:14 am

» [CQ-19]À arca
por Tanker GT Ontem à(s) 10:22 pm

» Bison e Helm
por ppaulo.braz Ontem à(s) 8:33 pm

» duvida de sintaxe
por alexfuziokaandrade7 Ontem à(s) 7:06 pm

» Bons conselhos (jogo mais leve)
por ocarteiro Ontem à(s) 6:14 pm

» [CQ-19] Animais
por PedroX Ontem à(s) 5:43 pm

» Adicionar propagandas em jogos para a PlayStore
por jairo025 Ontem à(s) 5:15 pm

» Rampa - Sem Bugs(ate agora)
por SoMateus Ontem à(s) 5:05 pm

» Promoções de verão
por J. Marlon Ontem à(s) 3:25 pm

» [Aplicativo] SiStema de Animaçao com bones
por Isaque Onix Ontem à(s) 3:13 pm

» Oque eu posso ou não por no jogo
por JoaoVanBlizzard Ontem à(s) 2:57 pm

» Movimento GML - Checar Colisão
por pedromenzani Ontem à(s) 2:51 pm

» Programador
por Diego albert Ontem à(s) 12:22 pm

» [Tutorial]Game Maker Server #1 Iniciando
por LightVelox Ontem à(s) 12:09 pm

» [DÚVIDA]Ajuda com Side - Scroll
por PedroX Ontem à(s) 6:57 am

» [cq 19]cães assassinos
por pedromenzani Sab Jul 26, 2014 10:46 pm

» MACONIC BETA
por PedroX Sab Jul 26, 2014 8:49 pm

» Erro na caixa de resources do GM
por PedroX Sab Jul 26, 2014 8:49 pm

» [CQ 19] Mecha Turtle
por PedroX Sab Jul 26, 2014 8:48 pm

» [Em andamento] Agente X: Ed, o Quadrado
por PedroX Sab Jul 26, 2014 8:46 pm

» Raised The Dead Alpha 0.1.8
por PedroX Sab Jul 26, 2014 8:31 pm

» [CQ-19] Danwaster
por JoaoVanBlizzard Sab Jul 26, 2014 6:53 pm

» [CQ#19] Pepe's Love Quest [+Votação]
por polosam Sab Jul 26, 2014 6:52 pm

» [CQ#19] Jogo do Sapo
por PedroX Sab Jul 26, 2014 6:32 pm

» [Galeria] The Origin.
por AxeInLine Sab Jul 26, 2014 6:03 pm

» DRAW - Como parar essa coisa/?/
por giovanepf Sab Jul 26, 2014 5:41 pm

» [CQ-19] Golge - The Dreamer pig
por polosam Sab Jul 26, 2014 2:19 pm

» Pegar a sprite de um objeto que esta em um array
por ralk2 Sab Jul 26, 2014 1:30 pm

» Problemas com pontos..
por giovanepf Sab Jul 26, 2014 12:21 pm

» [CQ#19] Doge
por Rodrigo Santiago Sab Jul 26, 2014 7:11 am

» [CQ-19] Save the Piggie!
por Rodrigo Santiago Sab Jul 26, 2014 7:04 am

» FutVida - A sua vida de jogador de futebol
por tata139 Sab Jul 26, 2014 1:46 am

» duvida
por Isaque Onix Sex Jul 25, 2014 11:16 pm

» Crio Trilha Sonora para Games!
por Isaias Malafaia Sex Jul 25, 2014 10:06 pm

» Proteger arquivos
por Gabreel Sex Jul 25, 2014 9:31 pm

» [Dúvidas com HUD]botões que geram objetos 3D.
por UrielAlves Sex Jul 25, 2014 5:15 pm

» Arte Gráfica
por SIGILOSO Sex Jul 25, 2014 3:09 pm

» Problema com String?
por LightVelox Sex Jul 25, 2014 2:09 pm

» compro sprites animadas
por AxeInLine Sex Jul 25, 2014 11:11 am

» Barra de texto Profissional
por Isaque Onix Sex Jul 25, 2014 10:14 am

» [off] Pessoal, o forum vem sofrendo ataques!
por LightVelox Qui Jul 24, 2014 6:37 pm

» Arquivo INI no GM:S
por Mikasuki Qui Jul 24, 2014 5:37 pm

» até que ponto é considerado de terceiros
por theguitarmester Qui Jul 24, 2014 2:26 pm

» BAIXE JÁ GOOGLE PLAY - Cockroach
por lokomil Qui Jul 24, 2014 1:18 pm

» The Heist -Atualizado 23/07-
por leocc Qui Jul 24, 2014 1:16 pm

» Duvida colisão c/inimigo - jogo plataforma
por alexfuziokaandrade7 Qui Jul 24, 2014 12:26 pm

» Email xtranho né não?
por DNilo Qui Jul 24, 2014 12:11 pm

» Aula 6 - Introdução em GML - For, do, until e repeat
por Lighter Qui Jul 24, 2014 10:20 am

» Debugger Connection Error
por pedromenzani Qui Jul 24, 2014 12:30 am

» Guns and Skulls
por Gabreel Qui Jul 24, 2014 12:01 am

» Erro que eu nao faco a minima ideia do que é.
por dharrison Qua Jul 23, 2014 10:33 pm

» Out Of Memory
por gabrielgeazi2 Qua Jul 23, 2014 10:19 pm

» Sprite com movimentaçao em numeros decimais
por chicoweb Qua Jul 23, 2014 9:52 pm

» Hatfields and MacCoys
por cascavelo Qua Jul 23, 2014 8:17 pm

» [CQ19] Space Animal Race
por Lauro Qua Jul 23, 2014 9:52 am

» [Marketplace] Side-scrolling Level Pack
por PedroX Ter Jul 22, 2014 6:18 pm

» Como uso o circle num objeto com Phisics ativado?
por Funbit Games Ter Jul 22, 2014 5:58 pm

» Como manipular imagens de um sprite animado?
por pcjogos Ter Jul 22, 2014 2:18 pm

» soma de pontos na coleta de objetos diferentes
por 7hiagomp Ter Jul 22, 2014 12:26 pm

» [XREATOR] Portfólio musical (novas músicas)
por FlyAway Ter Jul 22, 2014 12:31 am

» Problema com a sprite
por AxeInLine Seg Jul 21, 2014 11:03 pm

» Minus A Missão - Sugestões/Opinem
por Lighter Seg Jul 21, 2014 4:58 pm

» [Resolvido] GM8 reconhece teclas em segundo plano?
por Lighter Seg Jul 21, 2014 4:56 pm

» [Engine] Movimento Limpo 2.0 - Willy
por Lighter Seg Jul 21, 2014 4:26 pm

» Como criar um jogo para celular com o GM?
por antchita Seg Jul 21, 2014 2:41 am

» Não aparece nada em minha tela HTML5
por 7hiagomp Dom Jul 20, 2014 10:22 pm

» [CQ-19]Scared Cows Scare Crows
por lucas.limeira.92 Dom Jul 20, 2014 7:00 pm

» [OFF] Sugestões para videos.
por pedromenzani Dom Jul 20, 2014 4:42 pm

» Mega pacote de recursos, sprites, músicas e códigos-fonte!
por StartGame Dom Jul 20, 2014 11:10 am

» [Duvida]video do youtube
por WellingtonBecker Sab Jul 19, 2014 11:18 pm

» [Engine] Virtual Key
por cascavelo Sab Jul 19, 2014 10:24 am

» Inimigo se mexer de um lado para o outro com pausa
por jairo025 Sab Jul 19, 2014 10:07 am

» checar palavras duplicadas num array
por 7hiagomp Sab Jul 19, 2014 9:18 am

» [Script] Controle Fácil (Joypad Joystick)
por 7hiagomp Sex Jul 18, 2014 8:30 pm

» Desenho do #CQ19
por lucas.limeira.92 Sex Jul 18, 2014 7:28 pm

» Dúvida : Harmonia gráfica.
por FlyAway Sex Jul 18, 2014 7:28 pm

» Como você inicia um projeto?
por PedroX Sex Jul 18, 2014 7:28 pm

» Como fazer o inimigo andar e parar sozinho?
por giovanepf Sex Jul 18, 2014 5:09 pm

» Procuro Equipe!
por The Legend Of Atari Sex Jul 18, 2014 4:12 pm

» Procuro equipe!
por Arthurk8 Sex Jul 18, 2014 12:40 pm

» Dog: Revenge Of My Hearth
por The Legend Of Atari Sex Jul 18, 2014 12:18 pm

» Ferramentas para programadores e game F2P
por ole123 Sex Jul 18, 2014 9:16 am

» Background Animada
por The Legend Of Atari Sex Jul 18, 2014 8:53 am

» GM: S - Standard é gratuito a partir de hoje
por efraim leonardo Sex Jul 18, 2014 5:21 am

» Checar colisão de objetos com física
por 7hiagomp Sex Jul 18, 2014 12:11 am

» Joguinho de pong como melhorar...
por icarodantas123 Qui Jul 17, 2014 11:57 pm

» Como lidar com um projeto online ?
por FlyAway Qui Jul 17, 2014 11:07 pm

» [Resolvido] Duvida sobre situação estranha
por jose rocha Qui Jul 17, 2014 10:41 pm

» [CQ#19] Spirit Bear
por WellingtonBecker Qui Jul 17, 2014 10:07 pm

» [ajuda]mysql erro
por Isaque Onix Qui Jul 17, 2014 9:05 pm

» [Game Design] Guia de Estudos
por Henrique-HB Qui Jul 17, 2014 7:49 pm

» Dicas para Meu Jogo
por LightVelox Qui Jul 17, 2014 7:41 pm

» Alpha dos sprites
por GustavoPix Qui Jul 17, 2014 6:46 pm

» [ajuda] Graficos com sprites em partes
por Isaque Onix Qui Jul 17, 2014 6:09 pm

» Iniciar Variavel Local pelo Script
por chicoweb Qui Jul 17, 2014 12:15 pm

» [TUTO] Quiz com títulos !!
por fredcobain Qui Jul 17, 2014 11:41 am

» [Off Topic] Pérolas GMBR
por Lauro Qui Jul 17, 2014 10:42 am

» [A] South park plus (primium) campeão [CQ#17]
por Thyago Qua Jul 16, 2014 11:20 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 3:06 pm, editado 4 vez(es)

GameMakerTutoriais

Número de Mensagens: 801
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: 801
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

Enigma
Quer melhorar seu inglês? Entre para o Clube do Inglês:


PedroX

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

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

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: 801
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

Enigma
Quer melhorar seu inglês? Entre para o Clube do Inglês:


PedroX

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

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

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: 801
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

Enigma
Quer melhorar seu inglês? Entre para o Clube do Inglês:


PedroX

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

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

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: 801
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

Enigma
Quer melhorar seu inglês? Entre para o Clube do Inglês:


PedroX

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

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

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: 801
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

Enigma
Quer melhorar seu inglês? Entre para o Clube do Inglês:


PedroX

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

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

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: 801
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

Enigma
Quer melhorar seu inglês? Entre para o Clube do Inglês:


PedroX

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

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

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