====== Trin 7: Opsamling og forslag til udvidelser ====== [[trin6_kiste|← Forrige: Genbrug i en kiste]] | [[start|Forside]] | [[fejlfinding|Fejlfinding]] Du har bygget et fungerende, genbrugeligt inventory-system. Her er en kort opsamling af, hvad du har lært, og nogle ideer til at arbejde videre. ===== Hvad du har bygget ===== Item (Resource) ── findes allerede ──► .tres-filer ▲ │ arver WeaponItem, PotionItem InventorySlot ◄── ligger i ── Inventory (Node) ◄── barn af ── Player, Chest ▲ │ SetInventory(...) InventoryUI ── opretter ──► SlotUI (én pr. slot) * **Items** er de ressourcer, du allerede havde. Inventoryet bruger dem uden at ændre dem. * **Inventory** er en komponent, der kun håndterer data. Den har ingen grafik og kan sidde under hvilken som helst ejer. * **InventoryUI** og **SlotUI** viser data. De får at vide, hvad de skal vise, og kender ikke ejeren. * **Ejerne** (''Player'', ''Chest'') samler det hele, og ''Main'' forbinder data og UI. * **Konfiguration** (antal slots, start-items, baggrund, kolonner) ligger i Inspector, så du ændrer systemet uden at ændre kode. ===== De vigtigste idéer ===== * **Adskil data og visning.** Det gør koden genbrugelig og lettere at ændre. * **Brug ressourcer til data**, som skal kunne redigeres uden kode. * **Hold regler ét sted.** Alt, der handler om at lægge items i slots, står i ''Inventory''. Kun ''AddItem'' skal ændres, når reglerne ændres. * **Brug [Export] til indstillinger**, som du vil kunne ændre uden at åbne koden. * **Test undervejs.** Du så resultatet efter hvert trin. Det gør fejl lettere at finde. ===== Sådan forbereder strukturen stacking ===== Stacking er //ikke// implementeret, men strukturen er klar. Disse steder skal ændres, når du selv vil bygge det: * ''InventorySlot'' har allerede feltet ''Amount''. * ''Item'' skal have et nyt felt, fx ''MaxStackSize'', som fortæller, hvor mange der må ligge i én slot. * ''Inventory.AddItem'' er det eneste sted, hvor items lægges i slots. Her skal du først lede efter en slot med samme item, som ikke er fyldt, og først derefter tage en tom slot. * ''Inventory.RemoveItem'' skal sætte ''Amount'' ned med 1 og først tømme slotten, når den når 0. * ''SlotUI'' skal have en lille tekst (et ''Label'') til at vise antallet. Resten af systemet (''InventoryUI'', ejerne og ''Main'') skal ikke ændres. ===== Forslag til udvidelser ===== * **Stackable items:** Følg listen ovenfor. Start med ''AddItem''. * **Drag and drop:** I stedet for at bruge faste slots kan man trække et item fra én slot til en anden. Godot har indbyggede metoder på Control-noder til det (søg efter //drag and drop// i Godots dokumentation). * **Brug af items:** Giv ''Item'' en metode ''Use()'', som ''PotionItem'' og ''WeaponItem'' overskriver med hver deres opførsel. Det virker, fordi subtyperne arver fra ''Item''. * **Vis og skjul inventoryet:** Sæt ''Visible'' på ''UI''-laget til ''true'' eller ''false'', når spilleren trykker på en tast (kræver et input-map i //Project Settings → Input Map//). * **Opsamling af items i verdenen:** Lav en scene med et billede og et ''Item'', som lægger sig i spillerens inventory, når spilleren rører det. * **Flere ejere:** Lav en fjende eller en butik med et ''Inventory''. * **Gem og indlæs:** Gem, hvilke items der ligger i hvilke slots, i en fil. * **Basisklasse til ejere:** ''Player'' og ''Chest'' er næsten ens. Flyt det fælles til en fælles basisklasse. ===== Færdig kode ===== Hele den færdige kode ligger i mappen ''kode'' i den zip-fil, du hentede tutorialen i. [[start|← Tilbage til forsiden]]