Файл ресурсов
| |
Vint | Дата: Среда, 21 Декабря 2011, 01:06 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| Создавая проект столкнулся с такой проблемой, ни разу не делал так, что бы различные файлы (текстуры, спрайты, звуки, шрифты и т.д) хранились в одном файле, как бы контейнере или DLL, для того, что бы остальные пользователи не могли просмотреть эти файлы в папках. Вопрос: Как запихать картинки и др. в DLL или тому подобное, а потом програмно доставать их?
Если ты не оставил комменты, значит ты редиска )))
|
|
| |
karuy | Дата: Среда, 21 Декабря 2011, 01:40 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Пакуешь свои файлы в рес как RT_RCDATA, потом так можно их достать. Code var res: TResourceStream; begin res:=TResourceStream.Create(hInstance, 'somesound', RT_RCDATA); res.SaveToFile('C:\ss.ogg'); end; Или если не хочешь на винт сохранять: Code begin MODHandle:=FindResource(hInstance, 'mix', RT_RCDATA); MODPointer:=LockResource(LoadResource(hInstance, MODHandle)); MODSize:=SizeOfResource(hInstance, MODHandle); end; После чего можеш работать с этим файлом.
|
|
| |
Vint | Дата: Среда, 21 Декабря 2011, 01:47 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| Можешь прокоментировать код? Не совсем понимаю
Code var res: TResourceStream; begin res:=TResourceStream.Create(hInstance, 'somesound', RT_RCDATA); // что создаем и где? res.SaveToFile('C:\ss.ogg'); // сохраняем в огг, это же музыкальный файл вроде? и он будет доступен другим end;
Если ты не оставил комменты, значит ты редиска )))
Сообщение отредактировал Vint - Среда, 21 Декабря 2011, 01:52 |
|
| |
TimKruz | Дата: Среда, 21 Декабря 2011, 12:25 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| Vint, можно воспользоваться стандартным *.res файлом и стандартной загрузкой оттуда. Правда, обычно предполагается загрузка битмапов, но, я думаю, туда можно запихнуть любые данные... В своей программе подключаешь директивой {$R имя_файла.res} загружаешь, например, битмапы функцией LoadFromResourceName или LoadFromResourceID (в TBitMap).
Есть ещё такой трюк, когда какие-нибудь данные вставляются в код (как константа, наверное) и, естественно, сохраняются в exe (dll), но не помню, как это делается. В любом случае, загрузку таких данных придётся делать особой.
Если не хочешь заморачиваться с форматами и созданием своих функций загрузки - можно просто записать файлы друг за другом в один файл, запомнив, с какого байта начинается каждый из них (в программе константой или в отдельном файле). Можно ещё зашифровать, если хочешь, но обычный юзер уже не сможет открыть. Потом открываешь файл как нетипизированный, идёшь (seek) к нужному байту (началу нужного файла) и копируешь в отдельный файл всё от этого байта до следующего такого. (если шифровал - расшифровываешь) Потом загружаешь стандартной функцией (ну, какая там у движка) и удаляешь временный файл (если, конечно, уже не требуется). Правда, это будет медленнее, но зато надёжно.
|
|
| |
Vint | Дата: Среда, 21 Декабря 2011, 12:30 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| TimKruz, Загрузка ресурсов будет сразу при инициализации игры, правда на счёт...Quote (TimKruz) удаляешь временный файл (если, конечно, уже не требуется) пока не уверен.
karuy, TimKruz, Спасибо.
Если ты не оставил комменты, значит ты редиска )))
|
|
| |
karuy | Дата: Среда, 21 Декабря 2011, 17:24 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| Code var res: TResourceStream; begin res:=TResourceStream.Create(hInstance, 'somesound', RT_RCDATA); // создаем поток в памяти предназначен для доступа к компилированным ресурсам приложения, hInstance - значит что извлекаться будет из ресурсов нашей програмы res.SaveToFile('C:\ss.ogg'); // это я к примеру показал, можеш паковать туда все что хочеш end; Настолько я понимаю ты хочешь хранить ресурсы не в самой программе, а в отдельных файлах? Для доступа к ресурсам иного приложения: Code var hLib: Handle; begin hLib:= LoadLibrary('текстуры.dll'); MODHandle:=FindResource(hLib, 'картинка1', RT_RCDATA); MODPointer:=LockResource(LoadResource(hLib, MODHandle)); MODSize:=SizeOfResource(hLib, MODHandle); end;
|
|
| |
|