Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > Библиотеки

Библиотеки Сторонние библиотеки для Blitz

Ответ
 
Опции темы
Старый 11.08.2013, 19:09   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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 за это полезное сообщение:
ant0N (11.08.2013), Arles (17.08.2013), Gector (12.08.2013), St_AnGer (16.08.2013), tirarex (01.11.2013)
Старый 16.08.2013, 00:02   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com