component.monkey2 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. Namespace mojo3d
  2. Enum ComponentTypeFlags
  3. Singleton=1
  4. End
  5. Class ComponentType
  6. Method New( name:String,priority:int,flags:ComponentTypeFlags )
  7. _name=name
  8. _priority=priority
  9. _flags=flags
  10. End
  11. Property Name:String()
  12. Return _name
  13. End
  14. Property Priority:Int()
  15. Return _priority
  16. End
  17. Property Flags:ComponentTypeFlags()
  18. Return _flags
  19. End
  20. Private
  21. Field _name:String
  22. Field _priority:Int
  23. Field _flags:ComponentTypeFlags
  24. End
  25. Class Component Abstract
  26. Method New( entity:Entity,type:ComponentType )
  27. _entity=entity
  28. _type=type
  29. _entity.AddComponent( Self )
  30. End
  31. Property Entity:Entity()
  32. Return _entity
  33. End
  34. Property Type:ComponentType()
  35. Return _type
  36. End
  37. #rem monkeydoc Destroys the entity immediately or when update finishes.
  38. If scene is currently being updated, the component will not be destroyed until update finishes.
  39. #end
  40. Method Destroy()
  41. If _state=State.Destroyed Return
  42. If _entity.Scene.Updating
  43. If _state=State.Destroying Return
  44. _state=State.Destroying
  45. _entity.Scene.UpdateFinished+=Destroy
  46. Return
  47. End
  48. _state=State.Destroyed
  49. OnDestroy()
  50. _entity.RemoveComponent( Self )
  51. _entity=Null
  52. _type=Null
  53. End
  54. Protected
  55. Method AddInstance()
  56. Local scene:=_entity.Scene
  57. If scene.Editing scene.Jsonifier.AddInstance( Self,New Variant[]( _entity ) )
  58. End
  59. Method AddInstance( component:Component )
  60. Local scene:=_entity.Scene
  61. If scene.Editing scene.Jsonifier.AddInstance( Self,New Variant[]( _entity,component ) )
  62. End
  63. Method OnCopy:Component( entity:Entity ) Virtual
  64. RuntimeError( "Don't know how to copy component of type "+Type.Name )
  65. Return Null
  66. End
  67. Method OnStart() Virtual
  68. End
  69. Method OnShow() virtual
  70. End
  71. Method OnHide() Virtual
  72. End
  73. Method OnBeginUpdate() Virtual
  74. End
  75. Method OnUpdate( elapsed:Float ) Virtual
  76. End
  77. Method OnEndUpdate() Virtual
  78. End
  79. Method OnDestroy() Virtual
  80. End
  81. Internal
  82. Method Copy:Component( entity:Entity )
  83. Return OnCopy( entity )
  84. End
  85. Method Start()
  86. If _state<>State.Initial Return
  87. _state=State.Started
  88. OnStart()
  89. End
  90. Method Show()
  91. Start()
  92. If _state<>State.Started Return
  93. OnShow()
  94. End
  95. Method Hide()
  96. If _state<>State.Started Return
  97. OnHide()
  98. End
  99. Method BeginUpdate()
  100. Start()
  101. If _state<>State.Started Return
  102. OnBeginUpdate()
  103. End
  104. Method Update( elapsed:Float )
  105. If _state<>State.Started Return
  106. OnUpdate( elapsed )
  107. End
  108. Method EndUpdate()
  109. If _state<>State.Started Return
  110. OnEndUpdate()
  111. End
  112. Private
  113. Enum State
  114. Initial=0
  115. Started=1
  116. Destroyed=2
  117. Destroying=3
  118. End
  119. Field _entity:Entity
  120. Field _type:ComponentType
  121. Field _state:State=State.Initial
  122. End