1. fejezet: Kattintós játék készítése¶
Ehhez a projekthez együtt fogunk építeni egy kattintós játékot, amely teljes mértékben integrálva van az Odoo-val. Ebben a játékban a cél, hogy nagy számú kattintást halmozzunk fel, és automatizáljuk a rendszert. Az érdekesség az, hogy az Odoo felhasználói felületét fogjuk használni játszótérként. Például bónuszokat fogunk elrejteni a web kliens véletlenszerű részein.
A kezdéshez szükséged van egy futó Odoo szerverre és egy fejlesztői környezetre. Mielőtt belekezdenél a gyakorlatokba, győződj meg róla, hogy követted az összes lépést, amelyet ebben a bevezető oktatóanyagban leírtunk.
Cél
The solutions for each exercise of the chapter are hosted on the official Odoo tutorials repository.
1. Hozz létre egy systray elemet¶
A kezdéshez szeretnénk megjeleníteni egy számlálót a systray-ben.
Hozz létre egy
clicker_systray_item.js(ésxml) fájlt egy hello world Owl komponenssel.Regisztrálja a systray nyilvántartásba, és győződjön meg róla, hogy látható.
Frissítse az elem tartalmát úgy, hogy a következő szöveget jelenítse meg:
Kattintások: 0, és adjon hozzá egy gombot jobbra az érték növeléséhez.
És íme, teljesen működő kattintós játékunk van!
2. Külső kattintások számlálása¶
Nos, hogy őszinte legyek, ez még nem túl szórakoztató. Tehát adjunk hozzá egy új funkciót: azt szeretnénk, hogy az összes kattintás a felhasználói felületen számítson, így a felhasználó ösztönözve van az Odoo minél gyakoribb használatára! De nyilvánvalóan a fő számlálón történő szándékos kattintásoknak továbbra is többet kell érniük.
Használja a
useExternalListener-t, hogy figyeljen az összes kattintásra adocument.body-n.Ezek közül minden kattintásnak 1-gyel kell növelnie a számláló értékét.
Módosítsa a kódot úgy, hogy a számlálón történő minden kattintás 10-zel növelje az értéket.
Győződjön meg arról, hogy a számlálóra kattintás nem növeli az értéket 11-gyel!
További kihívás: győződjön meg arról, hogy a külső figyelő rögzíti az eseményeket, így nem maradunk le egyetlen kattintásról sem.
3. Hozzon létre egy kliens akciót¶
Jelenleg a felhasználói felület meglehetősen kicsi: csak egy systray elem. Biztosan több helyre van szükségünk, hogy több játékunkat megjeleníthessük. Ehhez hozzunk létre egy kliens akciót. A kliens akció egy fő akció, amelyet a web kliens kezel, és amely egy komponenst jelenít meg.
Hozzon létre egy
client_action.js(ésxml) fájlt, egy hello world komponenssel.Regisztrálja ezt a kliens akciót az akció regisztrációs rendszerben
awesome_clicker.client_actionnéven.Adjon hozzá egy gombot a systray elemhez
Openszöveggel. Erre kattintva nyissa meg a kliens akciótawesome_clicker.client_action(ehhez használja az akció szolgáltatást).Annak érdekében, hogy ne zavarjuk meg az alkalmazottak munkafolyamatát, azt szeretnénk, hogy a kliens akció egy felugró ablakban nyíljon meg, ne pedig teljes képernyős módban. Módosítsa a
doActionhívást, hogy az egy felugró ablakban nyíljon meg.Javaslat
You can use
target: "new"in thedoActionto open the action in a popover:{ type: "ir.actions.client", tag: "awesome_clicker.client_action", target: "new", name: "Clicker" }
Lásd még
4. Az állapot áthelyezése egy szolgáltatásba¶
Jelenleg a kliens akciónk csak egy hello world komponens. Azt szeretnénk, hogy megjelenítse a játékállapotunkat, de ez az állapot jelenleg csak a systray elemben érhető el. Ezért meg kell változtatnunk az állapot helyét, hogy elérhető legyen minden komponensünk számára. Ez egy tökéletes eset a szolgáltatások használatára.
Hozzon létre egy
clicker_service.jsfájlt a megfelelő szolgáltatással.Ez a szolgáltatás egy reaktív értéket (a kattintások számát) és néhány funkciót kell exportáljon annak frissítésére:
const state = reactive({ clicks: 0 }); ... return { state, increment(inc) { state.clicks += inc } };
Érje el az állapotot mind a systray elemben, mind a kliens akcióban (ne felejtse el
useState-elni). Módosítsa a systray elemet, hogy eltávolítsa saját helyi állapotát és használja azt. Ezenkívül eltávolíthatja a+10 clicksgombot.Jelenítse meg az állapotot a kliens akcióban, és adjon hozzá egy
+10kattintás gombot.
Lásd még
5. Egyedi hook használata¶
Jelenleg a kód minden részének, amelynek szüksége lesz a clicker szolgáltatásra, importálnia kell a useService és useState-et. Mivel ez elég gyakori, használjunk egy egyedi hook-ot. Ez hasznos arra is, hogy nagyobb hangsúlyt fektessünk a clicker részre, és kevesebb hangsúlyt a service részre.
Exportáljon egy
useClickerhookot.Frissítse a clicker szolgáltatás összes jelenlegi használatát az új hookra:
this.clicker = useClicker();
Lásd még
6. Az érték emberibb megjelenítése¶
A jövőben nagy számokat fogunk megjeleníteni, ezért készüljünk fel erre. Van egy humanNumber függvény, amely a számokat könnyebben érthető módon formázza: például a 1234 formázható 1.2k-ként.
Használja ezt a számlálók megjelenítésére (mind a systray elemben, mind az ügyfél műveletben).
Hozzon létre egy
ClickValuekomponenst, amely megjeleníti az értéket.Megjegyzés
Az Owl lehetővé teszi, hogy csak szöveges csomópontokat tartalmazó komponenst hozzon létre!
Lásd még
7. Adjon hozzá egy tooltipet a ClickValue komponenshez¶
A humanNumber függvénnyel valójában veszítettünk némi pontosságot a felületünkön. Jelenítsük meg a valós számot egy tooltipként.
A tooltipnek szüksége van egy html elemre. Módosítsa a
ClickValue-t, hogy az értéket egy<span/>elembe csomagolja.Adjon hozzá egy dinamikus
data-tooltipattribútumot az pontos érték megjelenítéséhez.
8. ClickBotok vásárlása¶
Tegyük még érdekesebbé a játékunkat: amint egy játékos először eléri az 1000 kattintást, a játéknak fel kell oldania egy új funkciót: a játékos 1000 kattintásért robotokat vásárolhat. Ezek a robotok 10 kattintást generálnak minden 10 másodpercben.
Adjon hozzá egy
levelszámot az állapotunkhoz. Ez egy szám, amely bizonyos mérföldköveknél növekszik, és új funkciókat nyit meg.Adjon hozzá egy
clickBotsszámot az állapotunkhoz. Ez azt jelenti, hogy hány robotot vásároltak meg.Módosítsa az ügyfél műveletet, hogy megjelenítse a click botok számát (csak ha
level >= 1), egyVásárlásgombbal, amely akkor engedélyezett, haclicks >= 1000. AVásárlásgombnak 1-gyel kell növelnie a clickbotok számát.Állítson be egy 10 másodperces intervallumot a szolgáltatásban, amely
10*clickBots-szal növeli a kattintások számát.Győződjön meg arról, hogy a Vásárlás gomb le van tiltva, ha a játékosnak nincs elegendő kattintása.
9. Refaktorálás osztálymodellre¶
A jelenlegi kód némileg funkcionális stílusban van írva. Azonban ehhez exportálnunk kell az állapotot és annak összes frissítési függvényét a kattintó objektumunkban. Ahogy ez a projekt növekszik, ez egyre bonyolultabbá válhat. Az egyszerűsítés érdekében válasszuk szét az üzleti logikát a szolgáltatásunkból és helyezzük át egy osztályba.
Hozzon létre egy
clicker_modelfájlt, amely egy reaktív osztályt exportál. Mozgassa át az összes állapotot és frissítési függvényt a szolgáltatásból a modellbe.Javaslat
Kiterjesztheti a ClickerModel-t a
Reactiveosztállyal a@web/core/utils/reactivekönyvtárból. AReactiveosztály a modellt egy reaktív proxyba csomagolja.Írja át a kattintó szolgáltatást úgy, hogy példányosítsa és exportálja a kattintó modell osztályt.
Lásd még
10. Értesítés, amikor mérföldkőhöz érünk¶
Nincs sok visszajelzés arról, hogy valami megváltozott, amikor elértük az 1k kattintást. Használjuk az effect szolgáltatást, hogy ezt az információt egyértelműen közöljük. A probléma az, hogy a kattintási modellünk nem fér hozzá a szolgáltatásokhoz. Emellett szeretnénk a lehető legnagyobb mértékben távol tartani a felhasználói felület kérdéseit a modelltől. Ezért új kommunikációs stratégiát fedezhetünk fel: eseménybuszokat.
Frissítse a kattintó modellt úgy, hogy példányosítson egy buszt, és indítson el egy
MILESTONE_1keseményt, amikor először elérjük az 1000 kattintást.Módosítsa a clicker szolgáltatást, hogy ugyanarra az eseményre figyeljen a modell buszon.
Amikor ez megtörténik, használja az
effectszolgáltatást, hogy megjelenítsen egy szivárvány embert.Adjon hozzá némi szöveget, hogy elmagyarázza, a felhasználó most már vásárolhat clickbotokat.
11. NagyBotok hozzáadása¶
Nyilvánvaló, hogy szükségünk van egy módra, hogy több választási lehetőséget biztosítsunk a játékosnak. Adjunk hozzá egy új típusú clickbotot: NagyBotok, amelyek egyszerűen erősebbek: 100 kattintást biztosítanak minden 10 másodpercben, de 5000 kattintásba kerülnek.
növelje a
levelértékét, amikor eléri az 5000-et (tehát 2-nek kell lennie)Frissítse az állapotot, hogy nyomon kövesse a nagybotokat
a nagybotoknak elérhetőknek kell lenniük
level >=2eseténJelenítse meg a megfelelő információkat az ügyfél műveletben
Javaslat
Ha sablonban javascript kifejezésként kell használni a < vagy > jeleket, legyen óvatos, mivel ezek ütközhetnek az xml elemzővel. Ennek megoldására használhatja a speciális aliasokat: gt, gte, lt vagy lte. Lásd az Owl dokumentációs oldalt a sablon kifejezésekről.
12. Adjon hozzá egy új erőforrástípust: teljesítmény¶
Most, hogy hozzáadjunk egy másik skálázási pontot, adjunk hozzá egy új erőforrástípust: egy teljesítmény szorzót. Ez egy szám, amely level >= 3 esetén növelhető, és megszorozza a botok tevékenységét (tehát, ahelyett, hogy egy kattintást biztosítanának, a kattintóbotok most multiplier kattintást biztosítanak).
növelje a
levelértékét, amikor eléri a 100k-t (így 3-nak kell lennie).frissítse az állapotot, hogy nyomon kövesse a teljesítményt (kezdeti érték 1).
változtassa meg a botokat, hogy ezt a számot szorzóként használják.
Frissítse a felhasználói felületet, hogy megjelenítse és lehetővé tegye a felhasználó számára egy új teljesítményszint megvásárlását (költség: 50k).
13. Határozzon meg néhány véletlenszerű jutalmat¶
Azt szeretnénk, hogy a felhasználó időnként bónuszokat kapjon, hogy jutalmazzuk az Odoo használatát.
Határozzon meg egy jutalomlistát a
click_rewards.jsfájlban. Egy jutalom egy objektum, amely tartalmazza: - egydescriptionkarakterláncot. - egyapplyfüggvényt, amely a játék állapotát veszi argumentumként, és módosíthatja azt. - egyminLevelszámot (opcionális), amely leírja, hogy melyik feloldási szinten érhető el a bónusz. - egymaxLevelszámot (opcionális), amely leírja, hogy melyik feloldási szinten nem érhető el többé a bónusz.Például:
export const rewards = [ { description: "Get 1 click bot", apply(clicker) { clicker.increment(1); }, maxLevel: 3, }, { description: "Get 10 click bot", apply(clicker) { clicker.increment(10); }, minLevel: 3, maxLevel: 4, }, { description: "Increase bot power!", apply(clicker) { clicker.multipler += 1; }, minLevel: 3, }, ];
Bármit hozzáadhat ehhez a listához!
Határozzon meg egy
getRewardfüggvényt, amely kiválaszt egy véletlenszerű jutalmat a jutalmak listájából, amely megfelel az aktuális feloldási szintnek.Vonja ki a kódot, amely véletlenszerűen választ egy tömbből, egy
choosefüggvénybe, amelyet áthelyezhet egy másikutils.jsfájlba.
14. Jutalom biztosítása egy űrlap nézet megnyitásakor¶
Javítsa az űrlap vezérlőt. Minden alkalommal, amikor egy űrlap vezérlő létrejön, véletlenszerűen el kell döntenie (1% esély), hogy jutalmat kell-e adni.
Ha a válasz igen, hívjon meg egy
getRewardmetódust a modellen.Ennek a metódusnak ki kell választania egy jutalmat, küldenie kell egy ragadós értesítést, egy
Collectgombbal, amely majd alkalmazza a jutalmat, és végül meg kell nyitnia aclickerkliens akciót.
15. Parancsok hozzáadása a parancspalettához¶
Adjon hozzá egy
Open Clicker Gameparancsot a parancspalettához.Adjon hozzá egy másik parancsot:
Buy 1 click bot.
16. Még egy erőforrás hozzáadása: fák¶
Most itt az ideje, hogy bevezessünk egy teljesen új típusú erőforrást. Itt van egy, amely valószínűleg nem lesz túl vitatott: fák. Most lehetővé tesszük a felhasználó számára, hogy gyümölcsfákat ültessen (gyűjtsön?). Egy fa 1 millió kattintásba kerül, de gyümölcsöket biztosít számunkra (vagy körtéket, vagy cseresznyéket).
Frissítse az állapotot, hogy nyomon kövesse a különböző típusú fákat: körte/cseresznye, és azok gyümölcseit.
Adjon hozzá egy függvényt, amely kiszámítja a fák és gyümölcsök teljes számát.
Határozzon meg egy új feloldási szintet
clicks >= 1 000 000esetén.Frissítse az ügyfél felhasználói felületét, hogy megjelenítse a fák és gyümölcsök számát, valamint a fák vásárlásának lehetőségét.
Növelje a gyümölcsök számát 1-gyel minden fa esetében 30 másodpercenként.
18. Használjon Notebook komponenst¶
Most már sokkal több információt követünk nyomon. Javítsuk az ügyfél felületét az információk és funkciók különböző fülekbe rendezésével, a Notebook komponens segítségével:
Használja a
Notebookkomponenst.Minden
clicktartalomnak egy fülön kell megjelennie.Minden
tree/fruitstartalomnak egy másik fülön kell megjelennie.
19. A játékállapot megőrzése¶
Bizonyára észrevette a játékunk nagy hibáját: átmeneti. A játékállapot elveszik, amikor a felhasználó bezárja a böngészőfület. Javítsuk ki ezt. A helyi tárolót fogjuk használni az állapot megőrzésére.
Importálja a
browser-t a@web/core/browser/browserfájlból a localstorage eléréséhez.Sorolja fel az állapotot minden 10 másodpercben (ugyanabban az intervallum kódban), és tárolja a helyi tárolóban.
Amikor a
clickerszolgáltatás elindul, be kell töltenie az állapotot a helyi tárolóból (ha van ilyen), vagy máskülönben inicializálnia kell magát.
20. Állapotmigrációs rendszer bevezetése¶
Amint valahol megőrzi az állapotot, új probléma merül fel: mi történik, amikor frissíti a kódját, így az állapot formája megváltozik, és a felhasználó megnyitja a böngészőjét egy olyan állapottal, amelyet egy régi verzióval hoztak létre? Üdvözöljük a migrációs problémák világában!
Valószínűleg bölcs dolog korán kezelni a problémát. Amit itt fogunk tenni, az az, hogy hozzáadunk egy verziószámot az állapothoz, és bevezetünk egy rendszert, amely automatikusan frissíti az állapotokat, ha azok nem naprakészek.
Adjunk hozzá egy verziószámot az állapothoz.
Határozzunk meg egy (üres) migrációs listát. Egy migráció egy objektum, amely tartalmaz egy
fromVersionszámot, egytoVersionszámot, és egyapplyfüggvényt.Amikor a kód betölti az állapotot a helyi tárolóból, ellenőriznie kell a verziószámot. Ha az állapot nem naprakész, alkalmaznia kell az összes szükséges migrációt.
21. Adjunk hozzá egy másik típusú fákat¶
A migrációs rendszerünk teszteléséhez adjunk hozzá egy új típusú fákat: őszibarackokat.
Adjunk hozzá
peachfákat.Növelje az állapot verziószámát.
Határozzon meg egy migrációt.