Vandaag zat ik even na te denken hoe ik een snelle scripting taal zou kunnen maken om bepaalde dingen stukken programmeercode in m'n engine automatisch te laten gebeuren. Commando's als deze zouden worden uitgevoerd:
Nu zou ik het natuurlijk real-time kunnen analyseren, maar het zou heel traag werken (zelfs met bytecode) als ik telkens het commando "RenderScene()" zou gaan analyseren, elke keer het wordt aangeroepen.
Wat ik zou doen is het volgende:
Elke instructie de de scriptingtaal herkent, zou ik definieren in een klasse(bvb scriptRenderScene(), scriptLoadMap(), ... Elk van deze instructieklassen is afgeleid van een abstracte basisklasse "ScriptInstructie".
Bij het inlezen van het script maak ik een lijst aan van alle specifieke commando's en plaats ik deze in een lijst van "ScriptInstructie". Bij het doorlopen van die lijst worden de instructies aangeroepen:
[edit] Natuurlijk is het wel mogelijk dat ik fouten heb getypt, maar de basisidee begrijpen jullie wel
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| // script code, geen C++ dus!
// veronderstel dat de klassen "Map" en "Camera" beide
// afgeleid zijn van de abstracte basisklasse "SceneObject"
// maak een map
Map level = LoadMap("test.map");
// maak een camera
Camera myCam;
// voeg ze beide to aan de scene
AddToScene(level);
AddToScene(myCam);
// render de scene
while(active)
{
RenderScene();
} |
Nu zou ik het natuurlijk real-time kunnen analyseren, maar het zou heel traag werken (zelfs met bytecode) als ik telkens het commando "RenderScene()" zou gaan analyseren, elke keer het wordt aangeroepen.
Wat ik zou doen is het volgende:
Elke instructie de de scriptingtaal herkent, zou ik definieren in een klasse(bvb scriptRenderScene(), scriptLoadMap(), ... Elk van deze instructieklassen is afgeleid van een abstracte basisklasse "ScriptInstructie".
Bij het inlezen van het script maak ik een lijst aan van alle specifieke commando's en plaats ik deze in een lijst van "ScriptInstructie". Bij het doorlopen van die lijst worden de instructies aangeroepen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| class ScriptInstructie { public: ScriptInstructie(); virtual ~ScriptInstructie(); virtual void Run() = 0; // gestart door linked list! }; class scriptLoadMap : public ScriptInstructie { public: scriptLoadMap (string file) // laad de map { realMap = new RealMapObject; realMap->Load(file); } virtual ~scriptLoadMap (); virtual void Run() // gestart door linked list! { realMap->Render(); } private: RealMapObject* realMap; }; int main() { LinkedList<ScriptInstructie> lijst; // bij het inlezen van het script komt men op een zeker moment // het commando " LoadMap("test.map");" tegen. Dit wordt dan // als volgt toegevoegt aan de lijst: // lijst.Add(new scriptLoadMap("map")); Lijst.RunThroughAllItemsAndExecuteThem(); // duidelijk, niet? ;) :P } |
[edit] Natuurlijk is het wel mogelijk dat ik fouten heb getypt, maar de basisidee begrijpen jullie wel
[ Voor 11% gewijzigd door Verwijderd op 04-12-2003 11:24 ]