forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PureBasic (http://forum.boolean.name/forumdisplay.php?f=90)
-   -   Распаковка из архива-ресурса мимо файла (http://forum.boolean.name/showthread.php?t=19732)

barsunduk 10.03.2015 01:49

Распаковка из архива-ресурса мимо файла
 
кто-нибудь в курсе, можно ли сообразить какой-то аналог разархиватора? только не в файл чтобы распаковывал нужное вхождение, а в память. если конкретно - хочу все ресурсы запаковать в архив zip и доставать по одному файлу. что-то типа этого кода (см. ниже), но вместо ExtractWhatEverWayPngFromZipToBuffer(some_paramete rs) - рабочая процедурка чтоб была:

PHP код:

UseZipPacker()
 
Procedure CatchPng(pngfilename.s)
  *
Buffer = AllocateMemory(idunno_100500bytes)
  
PngSize = ExtractWhatEverWayPngFromZipToBuffer(some_parameters)
  
res = CatchImage(#PB_Any, *Buffer, PngSize)
  
ProcedureReturn res
EndProcedure
 
png 
= CatchPng("imagefromzip.png")
Debug png
 
DataSection
  zipStart
:
  
IncludeBinary "data.zip"
  
zipEnd:
EndDataSection 


barsunduk 10.03.2015 03:47

Ответ: Распаковка из архива-ресурса мимо файла
 
похоже, в пурике это делается только через файл. ну, можно сохранять его во временную папку.
PHP код:

; как прикрутить архив к ресурсам EXE
; barsunduk © 2015
UseZipPacker
()
; 
архив с ресурсами
Enumeration
  
#Pack
EndEnumeration

; прочитать текстовый файл из архива
Procedure
.s unzipTxt(filename.s)
  
res.s = ""
  
Size = #False
  
If ExaminePack(#Pack)
    
While NextPackEntry(#Pack)
      
If PackEntryName(#Pack) = filename
        
Size = PackEntrySize(#Pack, #PB_Packer_UncompressedSize)
        
*Buffer = AllocateMemory(Size)
        
Size = UncompressPackMemory(#Pack, *Buffer, Size, filename)
        
res = PeekS(*Buffer, Size, #PB_UTF8)
      
EndIf
    
Wend
  
EndIf
  
ProcedureReturn res
EndProcedure

; прочитать картинку из архива
Procedure unzipSprite
(filename.s)
  
res = #False
  
Size = #False
  
If ExaminePack(#Pack)
    
While NextPackEntry(#Pack)
      
If PackEntryName(#Pack) = filename
        
Size = PackEntrySize(#Pack, #PB_Packer_UncompressedSize)
        
*Buffer = AllocateMemory(Size)
        
Size = UncompressPackMemory(#Pack, *Buffer, Size, filename)
        
res = CatchSprite(#PB_Any, *Buffer, #PB_Sprite_AlphaBlending)
      
EndIf
    
Wend
  
EndIf
  
ProcedureReturn res
EndProcedure

; примеры использования:
Procedure onCreate()
  ; 
создать файл архива и открыть его для загрузки из него ресурсов
  fn
.s = GetTemporaryDirectory() + "temparjfile"
  
If CreateFile(0, fn)
    
WriteData(0, ?zipData, ?zipEnd - ?zipData)
    
CloseFile(0)
  Else
    
MessageRequester("ERROR", "Не удаётся сохранить файл" + Chr(13) + fn)
    
End
  
EndIf
  If 
OpenPack(#Pack, fn, #PB_PackerPlugin_Zip)
    
;
  Else
    
MessageRequester("ERROR", "Не удаётся прочитать файл" + Chr(13) + fn)
    
End
  
EndIf
  ; 
считываем атлас спрайтов
  strAtlas 
= unzipTxt("atlas.atlas")
  ; 
считываем карту уровней
  strLevels 
= unzipTxt("levels.txt")
  ; 
инициализация системы спрайтов и мыши
  InitSprite
()
  
InitMouse()
  
InitSound()
  ; 
создаём экран внутри нашего окна размером с основной десктоп
  dskt_cnt 
= ExamineDesktops()
  
scr = OpenWindowedScreen(WindowID(#Window), 0, 0, DesktopWidth(0), DesktopHeight(0), 0, 0, 0)
  
; активируем мышь
  ReleaseMouse
(#True)
  
; читаем картинки-спрайты из архива
  sprBg 
= unzipSprite("bg.jpg")
  
sprAtlas = unzipSprite("atlas.png")
  ; 
фильтры для спрайтов
  SpriteQuality
(#PB_Sprite_BilinearFiltering)
  
; закрыть файл архива
  ClosePack
(#Pack)
EndProcedure

DataSection
  zipData
:
  
IncludeBinary "data/data.zip"
  
zipEnd:
EndDataSection 


Пётр 11.03.2015 23:51

Ответ: Распаковка из архива-ресурса мимо файла
 
Цитата:

Сообщение от barsunduk (Сообщение 293974)
похоже, в пурике это делается только через файл.

В справке можно найти функции AddPackMemory(), CompressMemory(), UncompressMemory() и UncompressPackMemory()

Можно также написать свою реализацию архива. http://purebasic.mybb.ru/viewtopic.php?id=210

barsunduk 12.03.2015 19:42

Ответ: Распаковка из архива-ресурса мимо файла
 
Пётр, спасибо за информацию и ссылки.
но я изучил справку и проверил на практике. работа с атласами файлов осуществляется исключительно при работе с файлами. создавать собственный архиватор с атласом запакованных ресурсов желания нет. ибо пакую их именно затем, что на выходе получается архив с этой самой картой. а она то мне и нужна.
так что продолжу использовать свой вариант. пара секунд при загрузке не такая уж и глобальная потеря.

Maxus 19.03.2015 11:54

Ответ: Распаковка из архива-ресурса мимо файла
 
Есть варианты не прибегая к файлам. Копайте в перехват WinAPI

impersonalis 19.03.2015 13:49

Ответ: Распаковка из архива-ресурса мимо файла
 
ОМГ!!! Максус - ты где пропадал?!!!

Maxus 19.03.2015 13:51

Ответ: Распаковка из архива-ресурса мимо файла
 
Работал, детей воспитывал.


Часовой пояс GMT +4, время: 22:35.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot