Показать сообщение отдельно
Старый 07.01.2010, 18:21   #28
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Function не дает имена

Вот вам мой менеджер, пользуюсь регулярно.
;====================================================================
; 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
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо H@NON за это полезное сообщение:
Nex (07.01.2010), Reizel (08.01.2010)