250 likes | 336 Views
Een introductie tot het KiCodil framework. KiCodil. 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
E N D
Quickstart • Maakeennieuwexecutableproject • Include ‘KCD.h’ (includeKiCodil) • Call: KCD::Run(HINSTANCE, intShowCommand, CBGameManager); • HINSTANCE & ShowCommandzijnparameter van de WinMain • CBGameManageriseen instance het type CBGameManager (vb: KiliRun.h) • Voorzieeenklasse die KCD::CBGameManagerimplementeerd • GetContentInputPath en GetContentOutputPath en GetResourceObject: zijn voor de ContentPipeline (zie later) • CreateStartupLevel : Maakeenstart-levelaandoorKCD::CreateILevel(tstringconstsName, D3DXVECTOR3 const& vGravity, CBLevelManager *pManager); te callen • RegisterCommands: is de plaats om Commands te registreren (zielater) • CreateStartupFrameListener: optioneel
Levelstart • Maakeenlevel met KCD::CreateILevel(tstringconstsName, D3DXVECTOR3 const& vGravity, CBLevelManager *pManager); • sName: level-naam • vGravity: level-zwaartekracht • pManager: instance van een callback-klasse die de levelzalmanagen (vb: KiliRunLevel.h) • LevelUpdate: Zal éénmaal per frame worden aangeroepn voor level-logic • LevelLoad: Zalwordenaangeroepentijdens 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: Zaltelkenswordenaangeroepenwanneereenlevelals active wordtingesteld (enkelhetactievelevelzaltijdens de GameCycleverwerktworden) • LevelUnloaded: failsafe indien er nogobjecten per levelmoetenwordenverwijderd • LevelPhysXSceneCreated: geeft de coder de kans om direct enkeleparameters van de scene te wijzigen indien nodig
ContentPipeline • Verwerktalleingame-content (vb: textures, shaders, models, …) • Heefteen input-/output-directory (zieCBGameManager) • Inputdirectory: alleraw data • Outputdirectory: alle data binairzoalszeingamegebruiktzullenworden) • De contentpipelinevoorziet in eendrieledigefunctionaliteit • Hetomzetten van raw-data naar binaire-data • Hetbijhouden van een interne database van alle content • Hetreference-counten van alle content die via de pipeline ingamegebruiktwordt • Gebruikteen callback om instances van classes te linkenaan content-files (zieKiliRun::GetResourceObject(tstring);)
CPResource • Is de parentclass van alleobjecten die door de ContentPipelinewordenverwerkt • VraageenCPResource op door: • Include ‘ContentPipeline.h’ • Content::ContentLoad(Content::CPResourceLoader *, tstringsTable, tstringsItem); • CPResourceLoaderwordtopgevraagd met KCD::GetResourceLoader(); • sTable: De naam van de content-file die de verwijzingnaar de raw-data-file bijhoudt • sItem: De naam van de raw-data-file binnen de table (zoalsgedefinieerd in de content-file) • Cast de verkregenCPResource* naarhetjuisteobject-type
Vb: .content <CP-Resources name="KiliRun"> <file keeploaded="true" resource="Effect" name="SpriteShader">KiliRun\SpriteShader.fx</file> </CP-Resources> • name="KiliRun“: ziesTableuit de vorigeslide • 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
LevelLoad • ZieKiliRunLevel::LevelLoad(KCD::ILevelLoader *pLoader); (zieslideLevelStart (LevelLoad()iseenoverrideablemethod van KCD::CBGameManager)) • De programmeur isverplicht om via dezeLevelLoad()alleControllers, Entities en Camera’saan te maken die hijooit in dezelevelwiltgebruiken • Contollers, Entities en Cameras wordenaangemaaktdoor de overeenkomstigemethodes van KCD::ILevelLoader::Create(…) • Om eenEntityaan te maken kan de programmeur één of meerdere ‘DataProviders’ opgeven: (dezezijnallenoptioneel) • KCD::BaseMaterial* : Definieerd de color-rendering • KCD:: BasePhysXCreator* : Definieerd de creatie van instances voorphysx • KCD:: BaseMesh* : Definieerd de vorm van de rendering • KCD:: BaseLight* : Definieerd de light-rendering • KCD:: BaseAnimation* : Definieerd de mogelijkeanimaties • KCD:: BaseParticles*: Definieerd de particleemmisionµ
EntityInstancinglegend • Hetlevelbeheertalle content zoalsaangegeven • Een pointer naarhetlevelmoetwordenmeegegevenaarelkKCD::LevelObject(vb: KCD::BaseMesh*, KCD::BaseMaterial*, …) • Entitieswordenaangemaakt via: MyLevelLoaderPointerCreateIEntity(…); • Nodeswordenaangemaaktalschildnodes van een parent: MyLevelPointerGetRootINode()CreateChildINode(…); • EntityInstanceswordenaangemaaktdoor: • EenEntity (by pointer of by name) toe te kennenaaneenNode: MyNodePointerCreateEntityInstance(…); • EenEntitymee te geventijdens de creatie van de Node:MyLevelPointerGetRootINode()CreateChildINode(…); • EntityInstanceszijn de objecten die uiteindelijkgerenderdworden
EntityInstancingvb // Create the dataproviderswithin the KCD::ILevel-pointer BaseMaterial *pMaterial = newMyMaterial(…params…, pLevel); BaseMesh *pMesh = newMyMesh(…params…, pLevel); BasePhysXCreator *pPhysX = newMyPhysX(…params…, pLevel); // Create the entity on the KCD::ILevelLoader-pointer pLevel->CreateIEntity(_T(“MyEntity"), pMesh, pMaterial, pPhysX); // Create a node and add the entity to it KCD::Inode *pNode = NULL; pNode = pLevel->GetIRootNode()->CreateChildINode(_T(“MyEntity“)); pNode->SetPosition(D3DXVECTOR(10, 5, 100));
Ilevel vs ILevelLoader • KCD::ILevelLoaderinhertitsKCD::ILevel • De pointer naarKCD::ILevelLoadergeefttoegangtotenkele extra methods die voorzien in de mogelijkheid om Controllers, Cameras en Entitiesaan te maken • De pointer naarKCD::ILevelheeftdezefunctionaliteit niet • De pointer naarKCD::ILevelLoaderisenkelgeldigbinnen de KCD::CBGameManagement::LevelLoad(ILevelLoader *pLoader) call (zieslide over LevelStart) • Hetis dus enkelmogelijk om nieuweControllers, Cameras en Entitiesaan te makentijdensde levelload() • !! Hetaanmaken van Nodes die optioneellinkennaarEntitiesissteedsmogelijk !! (vooropgestelddatdezeEntityisaangemaaktgeweest)
Cameras • Per levelkunnen er meerdere cameras zijn • Elke levelheeftminstenséén camera nodig (Er wordtautomatischeen ‘GodCamera’ aangemaakt: MyLevelPointerGetICamera(_T(‘GodCamera’));) • Cameras wordenookaangemaakttijdens de levelload:MyLevelLoaderPointerCreateICamera(…); • Cameras hebbeneennaam, en kunnenm.b.v. die naamuit de levelopgevragenworden/geactiveerdworden • Tijdenshetbegin van de GameCyclewordt de actieveCamera doorgegevennaar de rendereralwaar de nodigegegevensomwille van threadsafetygekopieerdworden • !! Op dit moment werkt de orthogonale projectie NIET !!
Commands • Om te kunnenreageren op userinputheeftKiCodileeninternsysteemdatuserinputlinktaangame-specifieke-commandos • DezeCommandszijngame-wide (zeworden dus ingesteldtijdens de gamestartup, en NIET tijdens de levelload) • DezeCommandswordenbijgehouden in de ‘CommandList’ • DezeCommandList kan tenallentijdewordenopgevraagd via: KCD::GetCommandList() • EenCommand wordtaangemaaktm.b.v. eenCommandIDtijdens de KCD::CBGameManager::RegisterCommand(…) call (zieQuickstart-slide en ‘KiliRun.cpp’) • EenCommandIDmaak je aan via: • ‘Commands.h’ : COMMAND_H(MyCommandIDName); • ‘Commands.cpp’ : COMMAND_CPP(MyCommandIDName, MyCommandIDUniqueIdentifier);
Actions • Zijneensimpele manier om objecteneventsaanelkaar te latendoorgeven, zondertoegang te moetenhebbentotelkaar pointers • Een Action wordtaangemaakt: • ‘Actions.cpp’ : ACTION_CPP(MyActionName); • ‘Actions.h’ : ACTION_H(MyActionName); • Een Action wordtgetriggerd: • MyAction.Trigger( pUserData ); • pUserDataiseenoptionele pointer • Een Action wordtopgevangen: • M.b.v. eencontroller (zievolgendeslide) • M.b.v. eenActionListener: • ImplementeerKCD::ActionListener • Voeg de ActionListenertoeaan de Action: MyAction.AddListener(MyListener)
Controllers • Controllerszijnobjecten die aaneenlevelgebondenzijn: MyLevelLoaderPointerCreateIController(…); • Controllerskunnentenallentijdewordenopgevraagdvanuit de level: MyLevelPointerGetIController(_T(‘MyControllerName’)); • Eenobjectdat ‘gecontrolleerd’ moetwordenerft over van KCD::Controleable • Zulkseen ‘controlleerbaar’ objectwordtgelinktaanéén of meerderecontrollers:MyControllerPointerLinkToController(MyControleablePointer); • Eencontrollermoetzichzelfregistrerenvoorallecontrols die hijnodigheeft om zijncontrolleables te kunnenlatenfunctioneren (zievolgendeslides)
ControlledUpdateexample // Maak de controlleraan en registreer om elk frame te updaten KCD::IController *pCont = NULL; UserDataObject *pUserData = NULL; pCont = pLevelCreateIController(_T(‘MyController’), pUserData); pContRegisterForUpdate(); // De juisteklasse Class MyClass : public KCD::Controleable { public: voidContolledUpdate(UpdateDataconst&, IController*); }; // Link een instance aan de controller pContLinkToController(MyControleablePointer);
ControlledActionexample // Maak de controlleraan en registreer om te reageren op jouw action KCD::IController *pCont = NULL; UserDataObject *pUserData = NULL; pCont = pLevelCreateIController(_T(‘MyController’), pUserData); pContRegisterForAction(MyAction); // De juisteklasse Class MyClass : public KCD::Controleable { public: voidContolledAction(UpdateDataconst&, Action&, IController*); }; // Link een instance aan de controller pContLinkToController(MyControleablePointer);
ControlledCommandexample // Maak de controlleraan en registreer om te reageren op jouw command KCD::IController *pCont = NULL; UserDataObject *pUserData = NULL; pCont = pLevelCreateIController(_T(‘MyController’), pUserData); pContRegisterForCommand(MyCommandID); // De juisteklasse Class MyClass : public KCD::Controleable { public: voidContolledCommand(UpdateDataconst&, ICommand*, IController*); }; // Link een instance aan de controller pContLinkToController(MyControleablePointer);
Intermezzo: I? • De meeste pointers m.b.t. hetlevelhebbeneentypename die begint met I en vertonentotaalgeendatamembers ? • Vb: ILevel, IEntity, ICamera, ICommand, … • De ‘I’ staatvoor Interface a.k.a. Pure Virtual Class • Hierdoor kan KiCodileengrootdeel van zijn interne werkingafschermen van de buitenwereld • Hierdoorwordt de GamePlay programmeur niet misleiddoormethods en datamembers die hij niet zou mogengebruiken • ‘I’-klassesworden DLL-geëxporteerd, hun implementatie niet
KCD::INode • Heeft ALTIJD een parent (uitzondering: de rootnode) • Kan oneindigveelchildrenhebben • Kan gelinktzijnnaareenEntityInstance • Bepaaldzijnpositie ALTIJD t.o.v. zijn parent • Kan enkelwordenaangemaakt via eenreedsbestaandeInode: KCD::Inode::CreateChildINode(…) • Er is in elkelevelsteedsminstenséénINode: KCD::ILevel::GetRootINode()
KCD::IEntity • Is vergelijkbaar met een container: • Houdt de dataprovidersbij (vb: BaseMesh*, BaseMaterial*, …) • Houdteen per-leveluniekenaambij • Kan enkelwordenaangemaakt via: KCD::ILevelLoader::CreateIEntity(…)
KCD::IEntityInstance • Is eenklasse die internwordtaangemaakt, telkenswanneer er een KCD::IEntity* wordtgelinktaaneen KCD::INode* (zieschema) • Beheert de instancing van de data die via de KCD::IEntitybeschikbaaris • Internis dit de klasse die wordtdoorgegevennaar de SceneGraph en de RenderGraphtijdens de Sychronization