Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include...
-
Upload
monique-ter -
Category
Documents
-
view
216 -
download
0
Transcript of Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include...
![Page 1: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/1.jpg)
KICODILEen introductie tot het KiCodil framework
![Page 2: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/2.jpg)
Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE, int ShowCommand,
CBGameManager); HINSTANCE & ShowCommand zijn parameter van de WinMain CBGameManager is een instance het type CBGameManager
(vb: KiliRun.h) Voorzie een klasse die KCD::CBGameManager
implementeerd GetContentInputPath en GetContentOutputPath en
GetResourceObject: zijn voor de ContentPipeline (zie later) CreateStartupLevel : Maak een start-level aan door
KCD::CreateILevel(tstring const sName, D3DXVECTOR3 const& vGravity, CBLevelManager *pManager); te callen
RegisterCommands: is de plaats om Commands te registreren (zie later)
CreateStartupFrameListener: optioneel
![Page 3: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/3.jpg)
Levelstart Maak een level met KCD::CreateILevel(tstring const sName,
D3DXVECTOR3 const& vGravity, CBLevelManager *pManager); sName: level-naam vGravity: level-zwaartekracht pManager: instance van een callback-klasse die de level zal
managen (vb: KiliRunLevel.h)○ LevelUpdate: Zal éénmaal per frame worden aangeroepn voor level-logic○ LevelLoad: Zal worden aangeroepen tijdens de KCD::CreateILevel(…)-
call. Dir is de enige plaats dat er ooit gebruik kan worden gemaakt van de ILevelLoader, en is dus de enige plaats om later level-inhoud in te laden
○ LevelActivate: Zal telkens worden aangeroepen wanneer een level als active wordt ingesteld (enkel het actieve level zal tijdens de GameCycle verwerkt worden)
○ LevelUnloaded: failsafe indien er nog objecten per level moeten worden verwijderd
○ LevelPhysXSceneCreated: geeft de coder de kans om direct enkele parameters van de scene te wijzigen indien nodig
![Page 4: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/4.jpg)
ContentPipeline Verwerkt alle ingame-content (vb: textures, shaders,
models, …) Heeft een input-/output-directory (zie
CBGameManager) Inputdirectory: alle raw data Outputdirectory: alle data binair zoals ze ingame
gebruikt zullen worden) De contentpipeline voorziet in een drieledige
functionaliteit Het omzetten van raw-data naar binaire-data Het bijhouden van een interne database van alle content Het reference-counten van alle content die via de
pipeline ingame gebruikt wordt Gebruikt een callback om instances van classes te
linken aan content-files (zie KiliRun::GetResourceObject(tstring);)
![Page 5: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/5.jpg)
CPResource Is de parentclass van alle objecten die door de
ContentPipeline worden verwerkt Vraag een CPResource op door:
Include ‘ContentPipeline.h ’ Content::ContentLoad(Content::CPResourceLoader *,
tstring sTable, tstring sItem);○ CPResourceLoader wordt opgevraagd met
KCD::GetResourceLoader();○ sTable: De naam van de content-file die de verwijzing naar
de raw-data-file bijhoudt○ sItem: De naam van de raw-data-file binnen de table (zoals
gedefinieerd in de content-file) Cast de verkregen CPResource* naar het juiste object-
type
![Page 6: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/6.jpg)
Vb: .content<CP-Resources name="KiliRun">
<file keeploaded="true" resource="Effect" name="SpriteShader">KiliRun\SpriteShader.fx</file>
</CP-Resources> name="KiliRun“ : zie sTable uit de vorige slide keeploaded="true“ : houdt de resources altijd in RAM resource="Effect“ : Verwijzing naar de interne klasse
(zie KiliRun::GetResourceObject(tstring);) name="SpriteShader“ : zie sItem uit de vorige slide KiliRun\SpriteShader.fx : path naar de raw-data-file
t.o.v. de content-file
![Page 7: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/7.jpg)
LevelLoad Zie KiliRunLevel::LevelLoad(KCD::ILevelLoader *pLoader); (zie slide
LevelStart (LevelLoad() is een overrideable method van KCD::CBGameManager))
De programmeur is verplicht om via deze LevelLoad() alle Controllers, Entities en Camera’s aan te maken die hij ooit in deze level wilt gebruiken
Contollers, Entities en Cameras worden aangemaakt door de overeenkomstige methodes van KCD::ILevelLoader::Create(…)
Om een Entity aan te maken kan de programmeur één of meerdere ‘DataProviders’ opgeven: (deze zijn allen optioneel) KCD::BaseMaterial* : Definieerd de color-rendering KCD:: BasePhysXCreator* : Definieerd de creatie van instances voor
physx KCD:: BaseMesh* : Definieerd de vorm van de rendering KCD:: BaseLight* : Definieerd de light-rendering KCD:: BaseAnimation* : Definieerd de mogelijke animaties KCD:: BaseParticles* : Definieerd de particle emmisionµ
![Page 8: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/8.jpg)
EntityInstancing schema
![Page 9: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/9.jpg)
EntityInstancing legend Het level beheert alle content zoals aangegeven Een pointer naar het level moet worden meegegeve naar
elk KCD::LevelObject (vb: KCD::BaseMesh*, KCD::BaseMaterial*, …)
Entities worden aangemaakt via: MyLevelLoaderPointerCreateIEntity(…);
Nodes worden aangemaakt als childnodes van een parent: MyLevelPointerGetRootINode()CreateChildINode(…);
EntityInstances worden aangemaakt door: Een Entity (by pointer of by name) toe te kennen aan een
Node: MyNodePointerCreateEntityInstance(…); Een Entity mee te geven tijdens de creatie van de
Node:MyLevelPointerGetRootINode()CreateChildINode(…); EntityInstances zijn de objecten die uiteindelijk gerenderd
worden
![Page 10: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/10.jpg)
EntityInstancing vb// Create the dataproviders within the KCD::ILevel-pointerBaseMaterial *pMaterial = new MyMaterial(…params…,
pLevel);BaseMesh *pMesh = new MyMesh(…params…, pLevel);BasePhysXCreator *pPhysX = new MyPhysX(…params…,
pLevel);
// Create the entity on the KCD::ILevelLoader-pointerpLevel->CreateIEntity(_T(“MyEntity"), pMesh, pMaterial,
pPhysX);
// Create a node and add the entity to itKCD::Inode *pNode = NULL;pNode = pLevel->GetIRootNode()-
>CreateChildINode(_T(“MyEntity“));pNode->SetPosition(D3DXVECTOR(10, 5, 100));
![Page 11: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/11.jpg)
Ilevel vs ILevelLoader KCD::ILevelLoader inhertits KCD::ILevel De pointer naar KCD::ILevelLoader geeft toegang tot
enkele extra methods die voorzien in de mogelijkheid om Controllers, Cameras en Entities aan te maken
De pointer naar KCD::ILevel heeft deze functionaliteit niet
De pointer naar KCD::ILevelLoader is enkel geldig binnen de KCD::CBGameManagement::LevelLoad(ILevelLoader *pLoader) call (zie slide over LevelStart)
Het is dus enkel mogelijk om nieuwe Controllers, Cameras en Entities aan te maken tijdens de levelload()
!! Het aanmaken van Nodes die optioneel linken naar Entities is steeds mogelijk !! (vooropgesteld dat deze Entity is aangemaakt geweest)
![Page 12: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/12.jpg)
Cameras Per level kunnen er meerdere cameras zijn Elke level heeft minstens één camera nodig (Er
wordt automatisch een ‘GodCamera’ aangemaakt: MyLevelPointerGetICamera(_T(‘GodCamera’)); )
Cameras worden ook aangemaakt tijdens de levelload: MyLevelLoaderPointerCreateICamera(…);
Cameras hebben een naam, en kunnen m.b.v. die naam uit de level opgevragen worden/geactiveerd worden
Tijdens het begin van de GameCycle wordt de actieve Camera doorgegeven naar de renderer alwaar de nodige gegevens omwille van threadsafety gekopieerd worden
!! Op dit moment werkt de orthogonale projectie NIET !!
![Page 13: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/13.jpg)
Commands Om te kunnen reageren op userinput heeft KiCodil een
intern systeem dat userinput linkt aan game-specifieke-commandos
Deze Commands zijn game-wide (ze worden dus ingesteld tijdens de gamestartup, en NIET tijdens de levelload)
Deze Commands worden bijgehouden in de ‘CommandList’ Deze CommandList kan ten allen tijde worden opgevraagd
via: KCD::GetCommandList() Een Command wordt aangemaakt m.b.v. een
CommandID tijdens de KCD::CBGameManager::RegisterCommand(…) call (zie Quickstart-slide en ‘KiliRun.cpp’)
Een CommandID maak je aan via: ‘Commands.h’ : COMMAND_H(MyCommandIDName); ‘Commands.cpp’ : COMMAND_CPP(MyCommandIDName,
MyCommandIDUniqueIdentifier);
![Page 14: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/14.jpg)
Actions Zijn een simpele manier om objecten events aan elkaar
te laten doorgeven, zonder toegang te moeten hebben tot elkaar pointers
Een Action wordt aangemaakt: ‘Actions.cpp’ : ACTION_CPP(MyActionName); ‘Actions.h’ : ACTION_H(MyActionName);
Een Action wordt getriggerd: MyAction.Trigger( pUserData ); pUserData is een optionele pointer
Een Action wordt opgevangen: M.b.v. een controller (zie volgende slide) M.b.v. een ActionListener:
○ Implementeer KCD::ActionListener○ Voeg de ActionListener toe aan de Action:
MyAction.AddListener(MyListener)
![Page 15: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/15.jpg)
Controllers Controllers zijn objecten die aan een level gebonden
zijn: MyLevelLoaderPointerCreateIController(…); Controllers kunnen ten allen tijde worden
opgevraagd vanuit de level: MyLevelPointerGetIController(_T(‘MyControllerName’));
Een object dat ‘gecontrolleerd’ moet worden erft over van KCD::Controleable
Zulks een ‘controlleerbaar’ object wordt gelinkt aan één of meerdere controllers: MyControllerPointerLinkToController(MyControleablePointer);
Een controller moet zichzelf registreren voor alle controls die hij nodig heeft om zijn controlleables te kunnen laten functioneren (zie volgende slides)
![Page 16: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/16.jpg)
ControlledUpdate
![Page 17: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/17.jpg)
ControlledUpdate example
// Maak de controller aan en registreer om elk frame te updaten
KCD::IController *pCont = NULL;UserDataObject *pUserData = NULL;pCont = pLevelCreateIController(_T(‘MyController’),
pUserData);pContRegisterForUpdate();
// De juiste klasseClass MyClass : public KCD::Controleable {public: void ContolledUpdate(UpdateData const&,
IController*);};
// Link een instance aan de controllerpContLinkToController(MyControleablePointer);
![Page 18: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/18.jpg)
ControlledAction
![Page 19: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/19.jpg)
ControlledAction example
// Maak de controller aan en registreer om te reageren op jouw action
KCD::IController *pCont = NULL;UserDataObject *pUserData = NULL;pCont = pLevelCreateIController(_T(‘MyController’), pUserData);pContRegisterForAction(MyAction);
// De juiste klasseClass MyClass : public KCD::Controleable {public: void ContolledAction(UpdateData const&, Action&,
IController*);};
// Link een instance aan de controllerpContLinkToController(MyControleablePointer);
![Page 20: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/20.jpg)
ControlledCommand
![Page 21: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/21.jpg)
ControlledCommand example
// Maak de controller aan en registreer om te reageren op jouw command
KCD::IController *pCont = NULL;UserDataObject *pUserData = NULL;pCont = pLevelCreateIController(_T(‘MyController’), pUserData);pContRegisterForCommand(MyCommandID);
// De juiste klasseClass MyClass : public KCD::Controleable {public: void ContolledCommand(UpdateData const&, ICommand*,
IController*);};
// Link een instance aan de controllerpContLinkToController(MyControleablePointer);
![Page 22: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/22.jpg)
Intermezzo: I? De meeste pointers m.b.t. het level hebben een
typename die begint met I en vertonen totaal geen datamembers ?
Vb: ILevel, IEntity, ICamera, ICommand, …
De ‘I’ staat voor Interface a.k.a. Pure Virtual Class Hierdoor kan KiCodil een groot deel van zijn interne
werking afschermen van de buitenwereld Hierdoor wordt de GamePlay programmeur niet
misleid door methods en datamembers die hij niet zou mogen gebruiken
‘I’-klasses worden DLL-geëxporteerd, hun implementatie niet
![Page 23: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/23.jpg)
KCD::INode Heeft ALTIJD een parent (uitzondering: de rootnode) Kan oneindig veel children hebben Kan gelinkt zijn naar een EntityInstance Bepaald zijn positie ALTIJD t.o.v. zijn parent Kan enkel worden aangemaakt via een reeds
bestaande Inode: KCD::Inode::CreateChildINode(…)
Er is in elke level steeds minstens één INode: KCD::ILevel::GetRootINode()
![Page 24: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/24.jpg)
KCD::IEntity Is vergelijkbaar met een container:
Houdt de dataproviders bij (vb: BaseMesh*, BaseMaterial*, …)
Houdt een per-level unieke naam bij Kan enkel worden aangemaakt via:
KCD::ILevelLoader::CreateIEntity(…)
![Page 25: Een introductie tot het KiCodil framework. Quickstart Maak een nieuw executable project Include ‘KCD.h’ (include KiCodil) Call: KCD::Run(HINSTANCE,](https://reader036.fdocument.pub/reader036/viewer/2022062513/5551a0ee4979591f3c8b6db2/html5/thumbnails/25.jpg)
KCD::IEntityInstance Is een klasse die intern wordt aangemaakt, telkens
wanneer er een KCD::IEntity* wordt gelinkt aan een KCD::INode* (zie schema)
Beheert de instancing van de data die via de KCD::IEntity beschikbaar is
Intern is dit de klasse die wordt doorgegeven naar de SceneGraph en de RenderGraph tijdens de Sychronization