Показать сообщение отдельно
Старый 10.03.2015, 03:47   #2
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Распаковка из архива-ресурса мимо файла

похоже, в пурике это делается только через файл. ну, можно сохранять его во временную папку.
как прикрутить архив к ресурсам EXE
barsunduk © 2015
UseZipPacker
()
архив с ресурсами
Enumeration
  
#Pack
EndEnumeration

прочитать текстовый файл из архива
Procedure
.s unzipTxt(filename.s)
  
res.""
  
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(*BufferSize#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
.GetTemporaryDirectory() + "temparjfile"
  
If CreateFile(0fn)
    
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 
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
(Offline)
 
Ответить с цитированием