Code archives/Miscellaneous/Component-Object Entity System

This code has been declared by its author to be Public Domain code.

Download source code

Component-Object Entity System by N2006
If you can't figure out what this does after looking it over, chances are you probably don't need it. In general, this is a concept that has been proven to be very powerful in the past.

Edit: Crap, wrong extension. That thing should really be changeable through the edit thing.
Strict


Private

Const COM_UNKNOWN% = -1
Global maxCName%=0


Public

Function RegisterComponentName%( name% )
    name = Abs(name)+1
    If name > maxCName Then maxCName = name
    Return name
End Function

Type IComponent
    Field _disposed% = 0
    Field _link:TLink
    Field _name% = COM_UNKNOWN
    
    Method Update( go:IGameObject ) Abstract
    
    Method Dispose( )
        Assert _disposed=0, "Component is already disposed"
        _disposed = 1
        _name = COM_UNKNOWN
    End Method
End Type

Type IGameObject
    Field _components:IComponent[]
    
    Method New( )
        _components = New IComponent[maxCName]
    End Method
    
    'private - check components array length (and expand if neccessary -- it can only ever expand unless you modify it manually)
    Method CheckCLength( )
        If _components.Length <> maxCName Then..
            _components = _components[..maxCName]
    End Method
    
    Method GetComponent:IComponent( name% )
        If name = COM_UNKNOWN Then Return Null
        If name > _components.Length-1 Then Return Null ' It's obviously not going to have it then
        Return _components[name]
    End Method
    
    ' Components have to be added in the correct order, DO NOT FORGET THIS
    Method AddComponent( c:IComponent )
        If c._name = COM_UNKNOWN Or c._link Then Return ' We don't want to add a used or disposed/unknown component
        If GetComponent( c._name ) Then Return ' And we don't want two of the same component
        CheckCLength( )
        _components[c._name] = c
    End Method
    
    Method RemoveComponent( name% )
        If name = COM_UNKNOWN Then Return
        Local c:IComponent = GetComponent( name )
        If c Then c.Dispose( )
    End Method
    
    Method Update( )
        For Local i:Int = 0 To _components.Length-1
            If _components[i] Then _components[i].Update( Self )
        Next
    End Method
End Type

Comments

None.

Code Archives Forum