|
Библиотеки Сторонние библиотеки для Blitz |
11.08.2013, 19:09
|
#1
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Банк файлов
Основное назначение: просканировать указанные директории на предмет указанных форматов данных, и сохранить результаты для последующей обработки - как в порядке, установленном ФС, так и в произвольном.
Например, так можно организовать микширование фоновой музыки в игре, или случайный выбор из набора однотипных текстур.
Делайте с кодом что хотите. За упоминание - буду благодарен.
;==================
;TFileBank
;created by impersonalis (ICQ# 11-999-51-51)
;http://forum.boolean.name/
;==================
;TFileBank_Create.TFileBank()
;Создать банк имён файлов
;TFileBank_GetReadN(TFB.TFileBank)
;Вернуть - сколько файлов прочитано
;TFileBank_Add(TFB.TFileBank,fldr$)
;Добавить директорию
;TFileBank_AddExt(TFB.TFileBank,OneExt$)
;Добавить расширение
;TFileBank_Clear(TFB.TFileBank)
;Очистить список файлов
;TFileBank_ClearExts(TFB.TFileBank)
;Очистить список расширений
;TFileBank_Delete(TFB.TFileBank)
;Уничтожить банк
;TFileBank_Randomize(TFB.TFileBank)
;Пермешать файлы
;TFileBank_GetRnd.TFileBank_OneFile(TFB.TFileBank)
;Вернуть случайны файл (экземпляр TFileBank_OneFile)
;TFileBank_Get.TFileBank_OneFile(TFB.TFileBank,id%)
;Вернуть файл №...
;TFileBank_GetRndFileName$(TFB.TFileBank)
;Вернуть имя случайного файла
Type TFileBank
Field FilBnk%
Field ExtBnk%
Field ReadOk%
Field CurPos%
End Type
Const TFileBank_OneFile_CNST__TEMPLATE%=1
Const TFileBank_OneFile_CNST__FREE%=2
Const TFileBank_OneFile_CNST__SLAVE%=3
Type TFileBank_OneFile
;===
Field shortname$
Field fullname$
Field ext$
;===
Field ID%
;===
Field ST%
End Type
Function TFileBank_OneFile_Create.TFileBank_OneFile(ST%)
Local TFB_OF.TFileBank_OneFile=New TFileBank_OneFile
TFB_OF\ST=ST
TFB_OF\ID=-1
Return TFB_OF
End Function
Function TFileBank_OneFile_Delete(TFB_OF.TFileBank_OneFile)
Delete TFB_OF
End Function
Function TFileBank_Create.TFileBank()
Local TFB.TFileBank=New TFileBank
TFB\FilBnk=CreateBank(0)
TFB\ExtBnk=CreateBank(0)
TFB\ReadOk=0
TFB\CurPos=0
Return TFB
End Function
Function TFileBank_GetReadN(TFB.TFileBank)
Return TFB\ReadOk
End Function
Function TFileBank_Add(TFB.TFileBank,fldr$)
Local D%=ReadDir(fldr)
Local FileName$
Local FullFileName$
Local CurBnkSize%=BankSize(TFB\FilBnk)
While True
FileName=NextFile(D)
If FileName="" Exit
FullFileName=fldr+"\"+FileName
If FileType(FullFileName)=1
Local L%=Len(FileName)
Local ExtI%
For ExtI=L To 1 Step -1
If Mid(FileName,ExtI,1)="."
Exit
EndIf
Next
If ExtI>1
Local EXT$=Upper(Right(FileName,L-ExtI))
Local TMPL.TFileBank_OneFile
Local Ok=False
For ExtJ=0 To BankSize(TFB\ExtBnk)-1 Step 4
TMPL=Object.TFileBank_OneFile(PeekInt(TFB\ExtBnk,ExtJ))
If TMPL\ext=EXT
Ok=True
Exit
EndIf
Next
If Ok
TFB\ReadOk=TFB\ReadOk+1
TFB_OF.TFileBank_OneFile=TFileBank_OneFile_Create(TFileBank_OneFile_CNST__FREE)
TFB_OF\shortname=FileName
TFB_OF\fullname=FullFileName
TFB_OF\ext=EXT
TFB_OF\ID=TFB\ReadOk
EndIf
EndIf
EndIf
Wend
CloseDir(D)
ResizeBank(TFB\FilBnk,TFB\ReadOk*4)
For TFB_OF=Each TFileBank_OneFile
If TFB_OF\ST=TFileBank_OneFile_CNST__FREE
TFB_OF\ST=TFileBank_OneFile_CNST__SLAVE
PokeInt(TFB\FilBnk,CurBnkSize,Handle(TFB_OF))
CurBnkSize=CurBnkSize+4
EndIf
Next
End Function
Function TFileBank_AddExt(TFB.TFileBank,OneExt$)
TFB_OF.TFileBank_OneFile=TFileBank_OneFile_Create(TFileBank_OneFile_CNST__TEMPLATE)
TFB_OF\ext=Upper(OneExt)
Local CurBnkSize%=BankSize(TFB\ExtBnk)
ResizeBank(TFB\ExtBnk,CurBnkSize+4)
PokeInt(TFB\ExtBnk,CurBnkSize,Handle(TFB_OF))
End Function
Function TFileBank_Clear(TFB.TFileBank)
Local TMP.TFileBank_OneFile
For I=0 To BankSize(TFB\FilBnk)-1 Step 4
TMP=Object.TFileBank_OneFile(PeekInt(TFB\FilBnk,I))
TFileBank_OneFile_Delete(TMP)
Next
ResizeBank(TFB\FilBnk,0)
TFB\ReadOk=0
TFB\CurPos=0
End Function
Function TFileBank_ClearExts(TFB.TFileBank)
Local TMP.TFileBank_OneFile
For I=0 To BankSize(TFB\ExtBnk)-1 Step 4
TMP=Object.TFileBank_OneFile(PeekInt(TFB\ExtBnk,I))
TFileBank_OneFile_Delete(TMP)
Next
ResizeBank(TFB\ExtBnk,0)
End Function
Function TFileBank_Delete(TFB.TFileBank)
TFileBank_Clear(TFB)
TFileBank_ClearExts(TFB)
FreeBank(TFB\FilBnk)
FreeBank(TFB\ExtBnk)
Delete TFB
End Function
Function TFileBank_Randomize(TFB.TFileBank)
Local N%=Ceil(TFB\ReadOk/2.0)
For i=1 To N
Local a%=Rand(0,TFB\ReadOk-1)
Local b%=(a+1+Rand(0,TFB\ReadOk-2)) Mod (TFB\ReadOk-1)
Local sv%=PeekInt(TFB\FilBnk,a*4)
PokeInt(TFB\FilBnk,a*4,PeekInt(TFB\FilBnk,b*4))
PokeInt(TFB\FilBnk,b*4,sv)
Next
End Function
Function TFileBank_GetRnd.TFileBank_OneFile(TFB.TFileBank)
If TFB\ReadOk=0 Then Return Null
If TFB\CurPos<1 Or TFB\CurPos>TFB\ReadOk
TFileBank_Randomize(TFB)
TFB\CurPos=1
EndIf
TFB\CurPos=TFB\CurPos+1
Return Object.TFileBank_OneFile(PeekInt(TFB\FilBnk,(TFB\CurPos-2)*4))
End Function
Function TFileBank_GetRndFileName$(TFB.TFileBank)
Local TFB_OF.TFileBank_OneFile=TFileBank_GetRnd(TFB)
Return TFB_OF\fullname
End Function
Function TFileBank_Get.TFileBank_OneFile(TFB.TFileBank,id%)
If TFB\ReadOk=0 Then Return Null
If id<1 Or id>TFB\ReadOk Then Return Null
Return Object.TFileBank_OneFile(PeekInt(TFB\FilBnk,(id-1)*4))
End Function
;===demo code
;SeedRnd(MilliSecs())
;FB.TFileBank=TFileBank_Create()
;TFileBank_AddExt(FB,"PNG")
;TFileBank_Add(FB,"textures")
;For i=1 To TFileBank_GetReadN(FB)
; Print TFileBank_GetRndFileName(FB)
;Next
;TFileBank_Delete(FB)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
16.08.2013, 00:02
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Банк файлов
Исправленная версия одной из функций
Function TFileBank_Randomize(TFB.TFileBank)
Local N%=Ceil(TFB\ReadOk/2.0)
For i=1 To N
Local a%=Rand(1,TFB\ReadOk)
Local b%=((a+Rand(1,TFB\ReadOk-1)-1) Mod (TFB\ReadOk))
a=a-1
Local sv%=PeekInt(TFB\FilBnk,a*4)
PokeInt(TFB\FilBnk,a*4,PeekInt(TFB\FilBnk,b*4))
PokeInt(TFB\FilBnk,b*4,sv)
Next
End Function
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:41.
|