Steamworks dokumentáció
Műveletkészlet-rétegek
A műveletkészlet-rétegek olyan opcionális műveletkiosztások, amelyek átfedhetnek egy létező vezérléskészletet. A műveletkészletekkel ellentétben a rétegek abból a műveletkészletből veszik a műveleteiket, amelyben léteznek, és alkalmazásukkor nem cserélik le teljes mértékben azt, ami már aktív, hanem kis módosításokat alkalmaznak. Ezek lehetnek beállításmódosítások, valamint hozzárendelések hozzáadása vagy eltávolítása az alap műveletkészletből. Egyszerre több réteg is alkalmazható, és egymást követően kerülnek alkalmazásra.

Technikailag nincs korlátja, hogy hány réteg lehet egyszerre aktív, de gyakorlati szempontból, ha túl sok réteg van a konfigurálóban, az zavaró lesz a játékosoknak.

Tartsd észben, hogy:
  • Egy már aktív műveletkészlet aktiválása nem lesz hatással a rétegeire.
  • Egy új műveletkészlet aktiválása törli a régi készlet összes aktív rétegét.
  • Egy már aktív műveletkészlet-réteg aktiválásának nem lesz hatása.
  • Egy már aktív műveletkészlet-réteg aktiválása nem fogja megváltoztatni annak helyét a halmazban.
  • Egy műveletkészlet-réteg kikapcsolása, majd aktiválása a halmaz tetejére állítja be azt.
  • Az ActivateActionSetLayer hívása olcsó, így biztonságosan hívható ismétlődően (de lásd lent a kiemelést).

    Óvatosan több réteggel!

    Csak az, hogy lehetséges a műveletkészlet-rétegek újra alkalmazása minden időkeretben, nem jelenti azt, hogy javasolt, különösen, ha egynél több réteget használsz. A legutóbb alkalmazott réteg felülír minden azt megelőző ütköző információt, ezért különösen ügyelj arra, hogy a megfelelő sorrendben alkalmazd őket. A kódodban könnyen kialakulhatnak versenyhelyzetek, vagy más finom időzítési hibák, amelyek felcserélhetik a sorrendet.

    A műveletkészlet-rétegek szűk felhasználási esetekre készültek, és jó módszer csak bizonyos játékállapot-változásokkor alkalmazni és eltávolítani azokat.

    A natív Steam Bevitel támogatású játékoknál a fejlesztő meghatározhat konkrét műveletkészlet-rétegeket, amelyeket a játék kódja aktivál. Ezen kívül hagyományos módban a játékosok meghatározhatják saját műveletkészlet-rétegeiket és az azokat kiváltó beviteleket, ugyanúgy, ahogyan saját, játékos által kiváltott műveletkészleteiket.

    Gyakorlati példa


    Képzeljünk el egy osztályalapú lövöldözős játékot járművekkel. Ennek a játéknak van natív Steam Bevitel támogatása, és használ műveletkészlet-rétegeket. Az alap játékmenethez mindig aktív egy alap műveletkészlet, ami lefedi a futást, tárgyak felvételét, ugrást stb.

    action_set_layers_basic_1.png

    Amikor a játékos kiválaszt egy osztályt, hozzáadódik a megfelelő réteg, pl. „mesterlövész”.

    action_set_layers_sniper_2.png

    Ehhez a kód nézhet ki valahogy így:

    void changeClass(EClassID myClass) { if(myClass == SNIPER) { SteamInput()->ActivateActionSetLayer( controllerHandle1, sniperLayerHandle ); } // logika a többi osztályhoz }

    Ha a játékos beszáll egy járműbe vagy kiszáll egyből, a jármű réteg vezérlései az állapotváltozások hatására aktiválódnak/deaktiválódnak, új vezérléseket adva hozzá vagy távolítva el a járműspecifikus funkciókhoz.

    action_set_layers_vehicle_1.png

    void changeVehicle(EVehicleID myVehicle, bool entering) { InputActionSetHandle_t layerHandle; if(myVehicle == AUTOMATIC) { layerHandle = automaticHandle; //automata váltó -- kormányzás, gáz fék } else if(myVehicle == STICK_SHIFT) { layerHandle = stickShiftHandle; // kézi váltó -- kormányzás, gáz, fék, kuplung, sebességváltás stb. } if(entering) { SteamInput()>ActivateActionSetLayer( controllerHandle1, layerHandle ); // a jármű műveletkészlet-rétegének alkalmazása, amikor beszállsz } else { SteamInput()>DeactivateActionSetLayer( controllerHandle1, layerHandle ); // a jármű műveletkészlet-rétegének eltávolítása, amikor kiszállsz } }

    Ebben a játékban a játékosok akkor is használni tudják a fegyverüket, amikor járműben ülnek. Tehát amikor a mesterlövész a mesterlövész puska távcsövét használja, az aktivál egy harmadik műveletkészlet-réteget, függetlenül attól, hogy a játékos gyalog van vagy járműben ül.

    action_set_layers_scope.png

    void useScope(bool entering) { if(entering) { SteamInput()->ActivateActionSetLayer( controllerHandle1, scopeHandle ); // a ráközelített réteg alkalmazása ráközelítéskor } else { SteamInput()->DeactivateActionSetLayer( controllerHandle1, scopeHandle ); // a ráközelített réteg eltávolítása a fegyver leengedésekor } }

    Így kombinálódik az összes réteg:

    action_set_layers_result_2.png

    Figyeld meg, ahogy a rétegek nem csak új műveleteket tudnak az alattuk levő rétegekhez adni, de felül is tudnak bírálni korábbi kiosztásokat; ebben az esetben a járműspecifikus „fék” és „gáz” műveletek felülbírálják az alapréteg „ugrás” és „interakció” műveleteit, a „kormányzás” pedig felülbírálja a trackpadhez és a botkormányhoz az alaprétegben hozzárendelt „mozgás” műveletkiosztást, amit pedig a „célzás” művelet bírál felül a ráközelített műveletkészlet-rétegből. Miután mindhárom műveletkészlet-réteg egymásra lett rétegezve, a „lövés” lesz az egyetlen megmaradt művelet az alapkészletből.

    Hagyományos mód


    A műveletkészlet-rétegeket szinte pont ugyanúgy hozod létre, mint a szokásos műveletkészleteket. Egyszerűen kattints a „Műveletréteg hozzáadására” a konfigurálóban:

    add_action_layer.png

    Innen nevet adhatsz a műveletkészlet-rétegednek, és megadhatod a hozzárendeléseit. Mivel ez egy hagyományos műveletkészlet-réteg, a játéknak nincs róla tudomása, és magának a játékosnak kell aktiválnia. Döntsd el, milyen bevitel aktiválja a műveletkészlet-réteget, nyisd meg a hozzárendelés menüt, majd kattints a műveletkészlet aktiválása ikonra, amely a bal szélső speciális ikon:

    bind_action_set.png

    Ez megjeleníti a műveletkészlet aktiválás menüt:

    change_action_set.png

    Ebben az esetben réteget akarunk alkalmazni, nem műveletkészletet aktiválni. A „Műveletréteg alkalmazását” választjuk a lenyíló listából:

    apply_action_set_layer.png

    Végül ki kell választanunk, hogy melyik réteget akarjuk alkalmazni:

    select_action_set_layer.png

    Ugyanezt az eljárást használhatjuk egy másik kiosztás hozzárendelésére a réteg eltávolításához.