|
PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач. |
10.03.2015, 01:49
|
#1
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Распаковка из архива-ресурса мимо файла
кто-нибудь в курсе, можно ли сообразить какой-то аналог разархиватора? только не в файл чтобы распаковывал нужное вхождение, а в память. если конкретно - хочу все ресурсы запаковать в архив zip и доставать по одному файлу. что-то типа этого кода (см. ниже), но вместо ExtractWhatEverWayPngFromZipToBuffer(some_paramete rs) - рабочая процедурка чтоб была:
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
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
10.03.2015, 03:47
|
#2
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Распаковка из архива-ресурса мимо файла
похоже, в пурике это делается только через файл. ну, можно сохранять его во временную папку.
; как прикрутить архив к ресурсам 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
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
12.03.2015, 19:42
|
#4
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Распаковка из архива-ресурса мимо файла
Пётр, спасибо за информацию и ссылки.
но я изучил справку и проверил на практике. работа с атласами файлов осуществляется исключительно при работе с файлами. создавать собственный архиватор с атласом запакованных ресурсов желания нет. ибо пакую их именно затем, что на выходе получается архив с этой самой картой. а она то мне и нужна.
так что продолжу использовать свой вариант. пара секунд при загрузке не такая уж и глобальная потеря.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
19.03.2015, 11:54
|
#5
|
ПроЭктировщик
Регистрация: 17.02.2006
Сообщений: 144
Написано 13 полезных сообщений (для 36 пользователей)
|
Ответ: Распаковка из архива-ресурса мимо файла
Есть варианты не прибегая к файлам. Копайте в перехват WinAPI
|
(Offline)
|
|
19.03.2015, 13:49
|
#6
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Распаковка из архива-ресурса мимо файла
ОМГ!!! Максус - ты где пропадал?!!!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
19.03.2015, 13:51
|
#7
|
ПроЭктировщик
Регистрация: 17.02.2006
Сообщений: 144
Написано 13 полезных сообщений (для 36 пользователей)
|
Ответ: Распаковка из архива-ресурса мимо файла
Работал, детей воспитывал.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Maxus за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:24.
|