Вот вам мой менеджер, пользуюсь регулярно.

;====================================================================
; Project: Resource Manager
; Version: 2.0
; Author: H@non
; Email: [email protected]
; Description: менеджер ресурсов, следит за хранением их в системе,
; дает доступ по управлению, удобен при использовании
; локаций в игре.
;====================================================================
;-- тип для ресурсов
Type TResource
Field path$
Field ent
Field tip
End Type
Const RES_MESH=1, RES_AMESH=2, RES_SND=3, RES_TEX=4, RES_SPR=5, RES_SND3D=6
;-- временный тип для удаления лишних ресурсов
;-- (удобен при переходе между локациями с одинаковыми ресурсами)
Type TResDel
Field r.TResource
End Type
;-- Функция загружает указанный ресурс, либо если ресурс
;-- уже был загружен возвращает ссылку на него.
;Параметры: путь, тип, родитель, текстурные флаги
Function ResLoad(path$, tip, parent=0, texFlag=1)
Local rf.TResource = Object.TResource(ResFind(path$))
If rf <> Null Then Return rf\ent
Local r.TResource = New TResource
r\tip = tip
r\path$ = Lower(path)
Select r\tip
Case RES_MESH
r\ent = LoadMesh(path,parent)
HideEntity r\ent
Case RES_AMESH
r\ent = LoadAnimMesh(path,parent)
HideEntity r\ent
Case RES_SPR
r\ent = LoadSprite(path,texFlag,parent)
HideEntity r\ent
Case RES_SND
r\ent = LoadSound(path)
Case RES_TEX
r\ent = LoadTexture(path,texFlag)
End Select
Return r\ent
End Function
;-- Дополнительная функция, работает также как ResLoad
;-- если ресурс повторяется, то заносим его в тип хранения
;Параметры: путь, тип, родитель, текстурные флаги
Function ResLoadPlus(path$, tip, parent=0, texFlag=1)
Local rf.TResource = Object.TResource(ResFind(path$))
If rf <> Null Then
Local rd.TResDel = New TResDel
rd\r.TResource = rf.TResource
Return rf\ent
EndIf
Local r.TResource = New TResource
r\tip = tip
r\path$ = Lower(path)
Select r\tip
Case RES_MESH
r\ent = LoadMesh(path,parent)
HideEntity r\ent
Case RES_AMESH
r\ent = LoadAnimMesh(path,parent)
HideEntity r\ent
Case RES_SPR
r\ent = LoadSprite(path,texFlag,parent)
HideEntity r\ent
Case RES_SND
r\ent = LoadSound(path)
Case RES_TEX
r\ent = LoadTexture(path,texFlag)
End Select
Return r\ent
End Function
;-- Функция удаляет лишние ресурсы, которые
;-- не были помещены в тип хранения.
Function ResDeletePlus()
Local r.TResource, rd.TResDel
Local result%
For r.TResource = Each TResource
For rd.TResDel = Each TResDel
If r = rd Then
result = True
Exit
EndIf
Next
If result = False Then
Select r\tip
Case RES_MESH, RES_AMESH, RES_SPR
FreeEntity r\ent
Case RES_SND, RES_SND3D
FreeSound r\ent
Case RES_TEX
FreeTexture r\ent
End Select
Delete r
EndIf
Next
Delete Each TResDel
End Function
;-- Функция ищет ресурс в списке и возвращает хендл на тип
;Параметры: путь_до_ресурса
Function ResFind(path$)
Local r.TResource
For r.TResource = Each TResource
If r\path = path Then
Return Handle(r)
EndIf
Next
Return 0
End Function
;-- Функция удаляет указанный ресурс из системы
;Параметры: путь_до_ресурса
Function ResDelete(path$)
Local r.TResource
For r.TResource = Each TResource
If path = r\path Then
Select r\tip
Case RES_MESH, RES_AMESH, RES_SPR
FreeEntity r\ent
Case RES_SND, RES_SND3D
FreeSound r\ent
Case RES_TEX
FreeTexture r\ent
End Select
Delete r
Return True
EndIf
Next
Return False
End Function
;-- Функция удаляет все ресурсы из системы
Function ResDeleteAll()
Local r.TResource
For r.TResource = Each TResource
Select r\tip
Case RES_MESH, RES_AMESH, RES_SPR
FreeEntity r\ent
Case RES_SND, RES_SND3D
FreeSound r\ent
Case RES_TEX
FreeTexture r\ent
End Select
Delete r
Next
Delete Each TResDel
End Function
Использовать так :
Type Object
Field ent
End Type
Function AddObject()
local o.object = New Object
o\ent = CopyEntity(ResLoad("mesh.b3d", RES_MESH))
End Function