1 / 25

KiCodil

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

muncel
Télécharger la présentation

KiCodil

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. EenintroductietothetKiCodilframework KiCodil

  2. 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

  3. 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

  4. 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);)

  5. 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

  6. 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

  7. 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µ

  8. EntityInstancingschema

  9. EntityInstancinglegend • Hetlevelbeheertalle content zoalsaangegeven • Een pointer naarhetlevelmoetwordenmeegegevenaarelkKCD::LevelObject(vb: KCD::BaseMesh*, KCD::BaseMaterial*, …) • Entitieswordenaangemaakt via: MyLevelLoaderPointerCreateIEntity(…); • Nodeswordenaangemaaktalschildnodes van een parent: MyLevelPointerGetRootINode()CreateChildINode(…); • EntityInstanceswordenaangemaaktdoor: • EenEntity (by pointer of by name) toe te kennenaaneenNode: MyNodePointerCreateEntityInstance(…); • EenEntitymee te geventijdens de creatie van de Node:MyLevelPointerGetRootINode()CreateChildINode(…); • EntityInstanceszijn de objecten die uiteindelijkgerenderdworden

  10. 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));

  11. 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)

  12. Cameras • Per levelkunnen er meerdere cameras zijn • Elke levelheeftminstenséén camera nodig (Er wordtautomatischeen ‘GodCamera’ aangemaakt: MyLevelPointerGetICamera(_T(‘GodCamera’));) • Cameras wordenookaangemaakttijdens de levelload:MyLevelLoaderPointerCreateICamera(…); • 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 !!

  13. 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);

  14. 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)

  15. Controllers • Controllerszijnobjecten die aaneenlevelgebondenzijn: MyLevelLoaderPointerCreateIController(…); • Controllerskunnentenallentijdewordenopgevraagdvanuit de level: MyLevelPointerGetIController(_T(‘MyControllerName’)); • Eenobjectdat ‘gecontrolleerd’ moetwordenerft over van KCD::Controleable • Zulkseen ‘controlleerbaar’ objectwordtgelinktaanéén of meerderecontrollers:MyControllerPointerLinkToController(MyControleablePointer); • Eencontrollermoetzichzelfregistrerenvoorallecontrols die hijnodigheeft om zijncontrolleables te kunnenlatenfunctioneren (zievolgendeslides)

  16. ControlledUpdate

  17. ControlledUpdateexample // Maak de controlleraan en registreer om elk frame te updaten KCD::IController *pCont = NULL; UserDataObject *pUserData = NULL; pCont = pLevelCreateIController(_T(‘MyController’), pUserData); pContRegisterForUpdate(); // De juisteklasse Class MyClass : public KCD::Controleable { public: voidContolledUpdate(UpdateDataconst&, IController*); }; // Link een instance aan de controller pContLinkToController(MyControleablePointer);

  18. ControlledAction

  19. ControlledActionexample // Maak de controlleraan en registreer om te reageren op jouw action KCD::IController *pCont = NULL; UserDataObject *pUserData = NULL; pCont = pLevelCreateIController(_T(‘MyController’), pUserData); pContRegisterForAction(MyAction); // De juisteklasse Class MyClass : public KCD::Controleable { public: voidContolledAction(UpdateDataconst&, Action&, IController*); }; // Link een instance aan de controller pContLinkToController(MyControleablePointer);

  20. ControlledCommand

  21. ControlledCommandexample // Maak de controlleraan en registreer om te reageren op jouw command KCD::IController *pCont = NULL; UserDataObject *pUserData = NULL; pCont = pLevelCreateIController(_T(‘MyController’), pUserData); pContRegisterForCommand(MyCommandID); // De juisteklasse Class MyClass : public KCD::Controleable { public: voidContolledCommand(UpdateDataconst&, ICommand*, IController*); }; // Link een instance aan de controller pContLinkToController(MyControleablePointer);

  22. 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

  23. 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()

  24. KCD::IEntity • Is vergelijkbaar met een container: • Houdt de dataprovidersbij (vb: BaseMesh*, BaseMaterial*, …) • Houdteen per-leveluniekenaambij • Kan enkelwordenaangemaakt via: KCD::ILevelLoader::CreateIEntity(…)

  25. 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

More Related