Stel jou voor dat 'n spelkarakter genaamd "Bob the Butcher" alleen in 'n donker ruimte staan ​​terwyl 'n zombieband van mutante worsies deur gebroke deure en vensters begin aankom. Op hierdie stadium is dit 'n goeie idee vir Bob om worsbroodjie-zombies in klein stukkies vleis te begin, maar hoe sal Bob dit in kruisplatformspeletjies doen? Sal die spel speler een of meer sleutels op 'n sleutelbord druk, klik die muis, tik die skerm of druk 'n knoppie op 'n gamepad?
By die programmering van 'n kruisplatformspel, is dit die soort ding wat jy waarskynlik baie tyd sal spandeer as jy nie voorbereid is nie. As jy nie versigtig is nie, kan jy met 'n massiewe spaghetti-agtige eindig as stellings of skakel stellings om al die verskillende inset toestelle te hanteer.
In hierdie handleiding sal ons dinge makliker maak deur 'n klas te skep wat baie insette toestelle sal saambring. Elke klasbyeenkoms sal sekere spelaktiwiteite of -gedragte verteenwoordig (soos "skiet", "hardloop" of "spring") en kan vertel word om te luister na verskeie knoppies, knoppies en aanwysers op sommige invoertoestelle.
Voordat ons die kode vir die klas begin skryf, sal ons in hierdie handleiding maak. Kom ons kyk vinnig hoe die klas eintlik gebruik kan word.
GameInput is die klas wat ons sal skep, en jy kan sien hoeveel eenvoudiger dit dinge sal maak. Die shoot.value eiendom is 'n getal en sal 'n positiewe waarde wees as die spasie balk op die sleutelbord gedruk word of die regte sneller op die gamepad gedruk word. As die spasiebalk of die regter sneller gedruk word, is die waarde nul.
Die res van die kode in hierdie handleiding vervang die kommentaar "kode gaan hier".
Die kode vereis dat slegs 'n paar veranderlikes buite die funksie gedefinieer word, en die veranderlikes is soos volg.
Konstante KEYBOARD, POINTER, GAMEPAD, DEVICE en CODE waardes word gebruik om invoer toestel kanale te definieer, soos GameInput.KEYBOARD_SPACE, en hul gebruik sal later in die tutoriaal duidelik word.
Die __pointer voorwerp bevat eienskappe wat relevant is vir die muis en aanraakskerm-invoer toestelle, en die __keyboard voorwerp word gebruik om die status van die sleutelbord sleutels op te spoor. Die __input en __channels skikkings word gebruik om die GameInput instansie te stoor en elke kanaal van die invoertoestel word by die instansie gevoeg. Laastens, __mouseDetected en __touchDetected dui aan of die muis of raakskerm opgespoor is.
Record: Veranderlikes hoef nie met twee onderstrepe te begin nie; dit is net die koderingskonvensies wat ek kies om te gebruik vir die kode in hierdie handleiding. Dit help om hulle te skei van die veranderlikes wat in die funksie gedefinieer word.
Hier kom die grootste deel van die kode, dus jou wil dalk koffie of iets gryp voordat jou hierdie gedeelte begin lees!
Hierdie funksies word gedefinieer na die veranderlikes in die vorige gedeelte van hierdie handleiding, en hulle word in volgorde van voorkoms gedefinieer.
Die funksie hoof () word aan die einde van die kode genoem - dit is aan die einde van die sluitings funksie wat ons vroeër geskep het. Dit doen wat op die tin staan ​​en hou alles aan die gang sodat die GameInput klas gebruik kan word.
Een ding wat ek moet oplet, is die gebruik van die funksie RequestAnimationFrame (), wat deel uitmaak van die W3C Animation Timing spesifikasie. Moderne speletjies en programme gebruik hierdie funksionaliteit om opdaterings of lusse te laat loop, aangesien dit in die meeste webblaaier hoogs geoptimaliseer word.
Die rings funksie opdate () blaai deur die lys van aktiewe en opdatering van GameInput instansies wat geaktiveer is. Die volgende updateInput () funksie is baie lank, dus ek sal nie die hier kode byvoeg nie; U sterf die volledige kode sien deur die bron lêer af te laai.
Die updateInput () ffunksie sien die invoer toestel kanaal wat by die GameInput geval gevoeg is en vind uit watter waarde eiendom van die GameInput instansie ingestel moet word. Soos gesien Skiet Worst kode voorbeeld, die waarde eienskap dui aan of die toevoer toestel kanaal geaktiveer word, en waarmee die spel dienooreenkomstig reageer, miskien deur Bob te vertel om die mutant-worszombie te skiet.
Die updateValue () funksie bepaal of die waardeeienskap van 'n GameInput instansie opgedateer moet word. Die drumpel word hoofsaaklik gebruik om analoogtoevoerinvoerkanale te voorkom, soos gamepad-knoppies en stokke, wat hulself nie behoorlik herstel nie om voortdurend 'n GameInput instansie te aktiveer. Dit gebeur dikwels met 'n verkeerde of vuil gamepad.
Soos die updateInput () funksie, is die volgende updatePointer () funksie redelik lank, dus ek sal nie die kode hier byvoeg nie. U kan die kode ten volle sien deur die bron lêers af te laai.
Die updatePointer () funksie verander die eienskap in die __pointer voorwerp. Kortom, die funksie knyp die wyser posisie om seker te maak dat dit nie die webblaaier-uitsigvenster verlaat nie, en bereken die wyser spasiëring het sedert die laaste opdatering beweeg.
Die funksie mouseDetected () en touchDetected () vertel die kode om een ​​invoerapparaat of die ander te ignoreer. As die muis voor die aanraakskerm opgespoor word, sal die raakskerm geïgnoreer word. As 'n raakskerm voor 'n muis bespeur word, sal die muis geïgnoreer word.
Die wyserPressed (), pointerReleased () en pointerMoved () funksies hanteer insette van 'n muis of 'n raakskerm. Al drie funksies werk net eienskappe op in die __pointer voorwerp.
Die inputAdd (), inputRemove () en inputReset () funksies word genoem vanuit 'n GameInput instansie (sien hieronder). Die funksies verander die __inputs en __channels skikkings, afhangende van wat gedoen moet word.
'N GameInput instansie word as aktief beskou, en by die __inputs kikking gevoeg, wanneer 'n invoertoestelkanaal by die GameInput instansie gevoeg is. As 'n aktiewe GameInput instansie al sy inset toestelkanale verwyder het, word die GameInput instansie as onaktief beskou en verwyder van die __inputs skikking.
Nou kom ons by die GameInput klas aan.
Ja, dit is alles wat daar is - hierdie super ligte klas wat basies dien as 'n koppelvlak vir die hoofkode. Die waarde eienskap is 'n getal wat wissel van 0 (nul) tot 1 (een). As die waarde 0 is, beteken dit dat die Game Inputeksemplaar niks van enige insetkanaalkanale ontvang wat daaraan bygevoeg is nie.
Die GameInput klas het 'n paar statiese eienskappe, so ons sal dit nou byvoeg.
Sleutelbord toestel kanale:
Punt toestel kanaal:
Gamepad toestel kanaal:
Om die kode te voltooi, hoef ons net die funksie hoof () te skakel.
En dit is al die kode. Weereens, alles is beskikbaar in die bron lêer.
Voordat ons die tutoriaal afhandel met die gevolgtrekking, kom ons kyk na nog een voorbeeld van hoe die GameInput klas gebruik kan word. Hierdie keer gee ons Bob die vermoë om te beweeg en te spring omdat die zombiehorde van mutante worsies te veel kan wees vir hom om alleen te hanteer.
Goed en maklik. Onthou dat die waarde van die GameInput instansie eiendom van 0 tot 1 wissel, sodat ons iets kan doen soos om die spoed van Bob se beweging te verander met die waarde as een van die kanaal se aktiewe insette toestelle analoog is.
Kruisplatformspeletjies het almal een ding gemeen: hulle het almal te doen met baie spelinvoertoestelle (beheerders), en die hantering van sulke inset toestelle kan 'n uitdagende taak wees. Hierdie handleiding het 'n manier gewys om verskeie insette toestelle te hanteer met behulp van 'n eenvoudige geïntegreerde API.