OOP dilemna
BlitzMax Forums/BlitzMax Programming/OOP dilemna
| ||
I have these classes: Entity Light Extends Entity PointLight Extends Light SpotLight Extends Light Then I have a list of Light classes that affect a certain entity. I want to get some information about the light that is specific to one of the light subclasses, like the cone angle of the spotlight. I can't get at it easily, because the cone angle parameter is part of the "SpotLight" type, and I have the handle to the Super "Light" type. I can easily solve this by moving the coneangle field from the "SpotLight" type to the Super "Light" type, but it's not very nice. Any suggestions? |
| ||
Check if it casts to SpotLight? |
| ||
What Azathoth means:Local spot:SpotLight = SpotLight(YourLight) If spot Then Print "Is a spotlight" EndIf I'd prefer to place a class ID in the light entity to check before casting just because it would save time. However, I'm more in favor the component-object entity system than the current means of just extending things each time I need some new functionality. Instead of doing that, I just add a new component to its list of components and the functionality is added, so it's like I can have multiple inheritance rather than extending a single existing type. There's a crude example of this in my code archive entries and it's covered in Game Programming Gems 5. |
| ||
That's an interesting way to test a type. In Delphi you can say "If Yourlist is Spotlight" which is pretty cool. Another way is to have a tag in the Light field which defines the type of type it is, then you can just query that later on. |
| ||
Would suggest the second way as well. Create a field _type:String in your entity class and any extended class assings usefull data to that in its default constructor (method new() ) |
| ||
I'm not sure if this solves your problem but it might. You can loop any object type in your Tlist. 'Loop all SpotLights in your LightList For local Light:SpotLight = Eachin LightList If Light.Radius > Light.Cone 'do what you want Endif Next 'Loop all PointLights in your LightList For local Light:PointLight = Eachin LightList If Light.PointCenter < Z 'Do something :) Endif 'In this case Light is always of the Pointlight type. Next |