/** * Faz a leitura do arquivos e popula as variaveis. * @param $fileName nome do arquivo */ function load($fileName) { $f = fopen($fileName, "rb"); $header['magic'] = fread($f, 2); $header['version'] = unpack("Cmajor/Cminor", fread($f, 2)); $this->version = (double) ($header['version']['major'] . "." . $header['version']['minor']); $header['count'] = freadb($f, 2, 'S'); $header['unknown'] = freadb($f, 2, 'S'); if ($header['magic'] !== self::MAGIC) { throw new UnexpectedValueException("Invalid magic header, found ({$header['magic']}) expected ({self->MAGIC})"); } //Faz a leitura dos sprites. for ($i = 0; $i < $header['count']; ++$i) { $width = freadb($f, 2, 'S'); $height = freadb($f, 2, 'S'); $size = freadb($f, 2, 'S'); $data = fread($f, $size); $this->list[] = new Sprite($width, $height, $data); } //Faz a leitura da paleta de cores for ($i = 0; $i < 256; ++$i) { $this->palette[$i] = unpack('Cred/Cgreen/Cblue/Calpha', fread($f, 4)); } //Define a paleta para da Sprite lido for ($i = 0; $i < $header['count']; ++$i) { $this->list[$i]->setPalette($this->palette); } fclose($f); }
/** * Carrega o sprite e monta uma estrutura do mesmo. * fileName = nome do arquivo que vai ser carregado **/ function loadSprite($fileName) { $file = fopen($fileName, "rb"); //http://in.php.net/manual/en/function.fopen.php /* Leitura do cabeçalho header magic = assinatura do formato, valor esperado SP, tamanho 2 bytes version = versão do arquivo major = valor esperado ?, tamanho 1 byte minor = valor esperado ?, tamanho 1 byte count = quantidade de imagens no arquivo, tamanho 1 byte unknown = desconhecido, tamanho 2 bytes */ $sprite['header']['magic'] = fread($file, 2); //http://in.php.net/manual/en/function.fread.php $sprite['header']['version'] = unpack("Cmajor/Cminor", fread($file, 2)); $sprite['header']['count'] = freadb($file, 2, 'S'); $sprite['header']['unknown'] = freadb($file, 2, 'S'); /* Leitura de todas as imagens do arquivo image = array com todas as imagens width = largura, tamanho 2 bytes height = altura, tamanho 2 bytes size = tamanho dos dados da imagem comprimidos, tamanho 2 bytes data = dados da imagem comprimidos, tamanho = size Os dados da imagem estão comprimidos usando um algoritimo RLE customizado somente os bytes 0x00 são comprimidos 00 05 FC DA neste caso os dados reais seriam 00 00 00 00 00 FC DA Cada byte dos dados corresponde a uma posição na paleta de cores */ for ($i = 0; $i < $sprite['header']['count']; $i++) { $sprite['image'][$i]['width'] = freadb($file, 2, 'S'); $sprite['image'][$i]['height'] = freadb($file, 2, 'S'); $sprite['image'][$i]['size'] = freadb($file, 2, 'S'); $sprite['image'][$i]['data'] = fread($file, $sprite['image'][$i]['size']); } /* Carrego a peleta de cores palette = array de 256 posições com todas as cores usadas nas imagens r = nivel de cor vermelha g = nivel de cor verde b = nivel de cor azul a = nivel de transparencia */ for ($i = 0; $i < 256; $i++) { $sprite['palette'][$i] = unpack('Cr/Cg/Cb/Ca', fread($file, 4)); } fclose($file); //http://in.php.net/manual/en/function.fclose.php return $sprite; }
/** * Faz a leitura do arquivos e popula as variaveis. * @param $fileName nome do arquivo */ function load($fileName) { $f = fopen($fileName, "rb"); $header['magic'] = fread($f, 2); $header['version'] = unpack("Cminor/Cmajor", fread($f, 2)); $this->version = (double) ($header['version']['major'] . "." . $header['version']['minor']); $header['count'] = freadb($f, 2, "S"); fseek($f, 10, SEEK_CUR); //skip unknown data if ($header['magic'] !== self::MAGIC) { throw new \UnexpectedValueException("Invalid magic header, found ({$header['magic']}) expected ({self->MAGIC})"); } //Navega pelo arquivo e faz a leitura de todas as animações for ($a = 0; $a < $header['count']; ++$a) { $action = new Action(); $frameCount = freadb($f, 4, "V"); for ($i = 0; $i < $frameCount; ++$i) { fseek($f, 32, SEEK_CUR); //skip unknown data $frame = new Frame(); $spriteCount = freadb($f, 4, "V"); for ($s = 0; $s < $spriteCount; ++$s) { $sprite = new Sprite(); $sprite->setX(freadb($f, 4, "l")); $sprite->setY(freadb($f, 4, "l")); $sprite->setIndex(freadb($f, 4, "l")); $sprite->setMirror(freadb($f, 4, "l")); if ($this->version >= 2.0) { $sprite->setColor(unpack('Cred/Cgreen/Cblue/Calpha', fread($f, 4))); $sprite->setScaleX(freadb($f, 4, "f")); if ($this->version >= 2.4) { $sprite->setScaleY(freadb($f, 4, "f")); } else { $sprite->setScaleY($sprite->getScaleX()); } $sprite->setRotation(freadb($f, 4, "l")); $sprite->setType(freadb($f, 4, "l")); if ($this->version >= 2.5) { $sprite->setWidth(freadb($f, 4, "l")); $sprite->setHeight(freadb($f, 4, "l")); } } $frame->AddSprite($sprite); } if ($this->version >= 2.0) { $frame->setEventId(freadb($f, 4, "l")); } if ($this->version >= 2.3) { $attachPointCount = freadb($f, 4, "V"); for ($p = 0; $p < $attachPointCount; ++$p) { $attachPoint = new AttachPoint(); freadb($f, 4, "v"); //extra ignore $attachPoint->setX(freadb($f, 4, "l")); $attachPoint->setY(freadb($f, 4, "l")); $attachPoint->setAttributes(freadb($f, 4, "l")); $frame->addAttachPoint($attachPoint); } } $action->addFrame($frame); } $this->list[] = $action; } fclose($f); }