Login

Esqueci minha senha

Últimos assuntos
» [AJUDA] codigo não funciona sem motivo aparente
por Isaque Onix Hoje à(s) 10:11 am

» Jogo Parando
por JoaoVanBlizzard Hoje à(s) 10:07 am

» Os Lendários HTML
por baraodopirapora Hoje à(s) 9:43 am

» Pokémon WC2014 (Demo)
por Dlr Hoje à(s) 8:40 am

» Terreno 2D para jogos de tank de guerra.
por theguitarmester Hoje à(s) 8:10 am

» Engines html5
por TRFN Ontem à(s) 10:41 pm

» [tutorial] Fazendo controle de carros,naves,etc
por TRFN Ontem à(s) 10:36 pm

» GMBR JAM #01
por TRFN Ontem à(s) 10:25 pm

» [Duvida] GMS não compila
por TRFN Ontem à(s) 10:20 pm

» Sprites, Tiles e Gráficos Isometricos Pintados
por Kabeção Ontem à(s) 10:00 pm

» GMS - iluminação no 3D
por icarodantas123 Ontem à(s) 10:00 pm

» [Apresentação] Cool Green 2.0 - Dark Version
por Dotted Chaos Ontem à(s) 5:40 pm

» Ao escrever uma letra, outra da frente é apagada
por Willy Ontem à(s) 5:22 pm

» [Tutorial] - Lendo (e carregando) arquivos online
por Lauro Ontem à(s) 1:51 pm

» Comunicado - Game do Ano em Dezembro
por leocc Ontem à(s) 12:37 pm

» Incluir font no jogo
por AlexBosquin Ontem à(s) 11:12 am

» BlitzPlus!
por WellingtonBecker Ontem à(s) 10:19 am

» Aula 7 - Introdução em GML - Funções e Scripts
por wicttor.sullivan.2 Ontem à(s) 8:30 am

» Tutoriais para Game Maker
por matheusco Sab Nov 22, 2014 8:11 pm

» Game Iniciante
por wicttor.sullivan.2 Sab Nov 22, 2014 4:33 pm

» Ajuda dois objetos executando ao mesmo tempo
por Sewer Crawler Sab Nov 22, 2014 3:14 pm

» ERRO: Não é possível criar buffer de vértices
por Rodrigo Santiago Sab Nov 22, 2014 1:53 pm

» Variavel criar arquivo *.bat
por Sewer Crawler Sab Nov 22, 2014 12:52 am

» Admob para windowsphone
por marcossfc Sex Nov 21, 2014 6:12 pm

» [Dll] GMFileSystem
por Carlos1971 Sex Nov 21, 2014 1:13 pm

» [Artigo/Tutorial]Componentes Básicos de uma Música
por theguitarmester Sex Nov 21, 2014 6:54 am

» Concept Art do Lost Soul
por DooMan Qui Nov 20, 2014 11:26 pm

» Como conheceu a GMBR ?
por DooMan Qui Nov 20, 2014 11:19 pm

» Outside 1.0.2 Final
por DooMan Qui Nov 20, 2014 11:00 pm

» Concurso GMBR 2014: A morte é um novo começo
por PedroX Qui Nov 20, 2014 10:05 pm

» Engine de Quackshot
por Isaque Onix Qui Nov 20, 2014 4:01 pm

» Como Detectar Apenas Paredes Na Frente Do NPC
por Chingling152 Qui Nov 20, 2014 2:11 pm

» Problemas com Engine
por gabrielsch Qui Nov 20, 2014 1:24 pm

» Tutorial de gravidade e movimento em rampas
por Isaque Onix Qui Nov 20, 2014 12:44 pm

» MapGen - Pt.1
por Lauro Qui Nov 20, 2014 12:25 pm

» Histórico de versões - Game Maker Studio
por Lauro Qui Nov 20, 2014 12:19 pm

» Farmanguinhos
por theokof98 Qui Nov 20, 2014 8:23 am

» [RESOLVIDO] Problemas com a view
por Ronaldo Rodrigues Qua Nov 19, 2014 11:01 pm

» The World Lost 3D
por Midnight Qua Nov 19, 2014 9:56 pm

» Sobre Teletransportes
por JoaoVanBlizzard Qua Nov 19, 2014 2:30 pm

» [TUTORIAL] Números Aleatórios
por Lauro Qua Nov 19, 2014 1:02 pm

» Tileset parecido com GameBoy - Download disponível
por paulovmdutra Qua Nov 19, 2014 9:56 am

» arrastar o personagem
por caption Qua Nov 19, 2014 6:45 am

» [Campeão CQ-19]À arca
por Tanker GT Ter Nov 18, 2014 11:24 pm

» [Tutorial]Movimento com troca de sprites perfeito
por fredcobain Ter Nov 18, 2014 10:56 pm

» [Tutorial] Sobre código parte 1 !
por fredcobain Ter Nov 18, 2014 10:48 pm

» sprites pokemon
por querempaz Ter Nov 18, 2014 6:40 pm

» Parar "Loop Infinito" de criação de instâncias
por Zero. Ter Nov 18, 2014 3:07 pm

» [Grafico e programaçao] Bons?
por Isaque Onix Ter Nov 18, 2014 10:38 am

» gms font
por Isaque Onix Ter Nov 18, 2014 10:28 am

» Equipe para continuar meu projeto.
por theguitarmester Ter Nov 18, 2014 8:33 am

» [Android]Deslizar view no exio y.
por Thomaz Seg Nov 17, 2014 3:44 pm

» Jams da GMBR
por vitorfernandes13 Seg Nov 17, 2014 1:54 pm

» Procuro equipe!
por ebertzin Seg Nov 17, 2014 11:58 am

» [Resolvido] Obj não aparece no jogo.
por ebertzin Seg Nov 17, 2014 9:51 am

» [CQ#22] GUERRA! O Ultimo CQ de 2014
por dharrison Seg Nov 17, 2014 9:24 am

» screen_redraw não existente no GMS
por Zero. Seg Nov 17, 2014 9:18 am

» RECRUTANDO: procuro pessoas para equipe
por Riccardoric Seg Nov 17, 2014 9:11 am

» Alguem Me Explica Como usar o Draw detalhadamente?
por Lighter Seg Nov 17, 2014 8:11 am

» [C]HERÓIS do ESPAÇO 1.1
por Lucas Farias Seg Nov 17, 2014 7:55 am

» Medieval Tower Defense
por allan_machado49 Seg Nov 17, 2014 2:24 am

» Novo Projeto de Vídeo Aulas - Nerd Reis
por allan_machado49 Seg Nov 17, 2014 1:44 am

» [RECRUTAMENTO] Hunger Games!
por Brenno557 Dom Nov 16, 2014 11:09 pm

» Pegar uma ID de um objeto entre vários iguais
por Zero. Dom Nov 16, 2014 8:15 pm

» GMBR Feed para Firefox e Chrome
por PedroX Dom Nov 16, 2014 7:46 pm

» Super Br Bros - O Projeto
por AG Games Dom Nov 16, 2014 4:44 pm

» [Resolvido]Particulas em Posições Randomicas
por AlexBosquin Dom Nov 16, 2014 4:39 pm

» (Resolvido)O tiro da arma não sai pelo lugar certo
por pilo Dom Nov 16, 2014 4:33 pm

» Acentos GMS
por douglas.dsb Dom Nov 16, 2014 2:30 pm

» Anúncios no site
por matheusco Dom Nov 16, 2014 2:00 pm

» (RESOLVIDO) O que vale mais a pena?
por manobrother Dom Nov 16, 2014 1:12 pm

» Oque pode está acontecendo ?
por Zero. Dom Nov 16, 2014 10:41 am

» Enquete Portal
por PedroX Dom Nov 16, 2014 8:01 am

» Como criar uma rampa?
por Sewer Crawler Sab Nov 15, 2014 7:59 pm

» TCG Book of Kingdoms
por Lauro Sab Nov 15, 2014 6:37 pm

» Ajuda com criação de apk
por Brenno557 Sab Nov 15, 2014 5:50 pm

» Enquetes
por PedroX Sab Nov 15, 2014 3:32 pm

» GM-Experience
por Gonzo Sab Nov 15, 2014 2:47 pm

» Problema com Jdk
por Brenno557 Sab Nov 15, 2014 1:52 pm

» [Como Faz?] Botão Play com contagem
por GeraldRobotnik Sab Nov 15, 2014 12:01 pm

» Game Maker Não Compila
por Willy Sex Nov 14, 2014 6:50 pm

» timer interno
por WellingtonBecker Sex Nov 14, 2014 6:01 pm

» Como fazer algo colidir,e nao aparecer mais la?
por WellingtonBecker Sex Nov 14, 2014 5:51 pm

» Existe como editar o meu jogo em tempo real?
por Gonzo Sex Nov 14, 2014 4:22 pm

» Evento Step sendo apagado
por Zero. Sex Nov 14, 2014 3:19 pm

» dúvida sobre a função 'mplay' no GMS
por Luiz Raizen Sex Nov 14, 2014 1:47 pm

» FutVida - A sua vida de jogador de futebol
por JoaoVanBlizzard Sex Nov 14, 2014 10:07 am

» Aritana - game brasileiro
por Brenno557 Qui Nov 13, 2014 10:03 pm

» [Ajuda] Historia para jogo de zumbis
por Brenno557 Qui Nov 13, 2014 10:01 pm

» [Pedido Tuto] Como Usar o Novo debugger
por AlexBosquin Qui Nov 13, 2014 7:13 pm

» Point and Click Jam(Evento)
por WellingtonBecker Qui Nov 13, 2014 7:09 pm

» ajuda na avaliação de debug
por Kabeção Qui Nov 13, 2014 11:02 am

» [CQ#22] A Missão
por dharrison Qua Nov 12, 2014 11:08 pm

» Jogos Top-Down
por Eudes - Hyo Qua Nov 12, 2014 10:25 pm

» Como Fazer Jorrar Sangue Na Parede
por JoaoVanBlizzard Qua Nov 12, 2014 9:00 pm

» Musica não carrega ao clicar no load
por marcio_nmedeiros Qua Nov 12, 2014 6:36 pm

» SWF no GMS
por WellingtonBecker Qua Nov 12, 2014 5:27 pm

» Ajuda dividir cartas em 3 montes
por Black.Hackt Qua Nov 12, 2014 4:59 am

» Como fazer com que objetos novos fiquem a frente?
por Isaque Onix Qua Nov 12, 2014 2:50 am


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: 5963
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

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

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: 5963
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

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

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: 5963
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

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

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: 5963
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

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

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: 5963
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

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

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: 5963
Idade: 19
Data de inscrição: 26/07/2008
Versão:
  • Game Maker Studio: Professional

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

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