Gra RPG. Tworzenie obiektu wewnątrz funkcji?

0

Cześć. Ćwiczę sobie obiektowość na nieskomplikowanej grze RPG. W klasie gracza ekwipunek rozwiązałem za pomocą listy, obiekt tworzę na zewnątrz dzięki czemu mogę go przemieszczać między sklepem bądź innymi postaciami. Natrafiłem jednak na pewien problem.

Tworzę klase Potwór. W założeniu z potwora możliwe jest dropnięcie jakiegoś miecza czy zbroi. Zastanawiam się jak to rozwiązać. Pomyślałem, aby Potwór miał ekwipunek. Funkcja losowałaby z niego jeden przedmiot, a resztę usuwała. Wyodrębniłem na to trzy sposoby:

-Tworzyć obiekt podczas dodawania do listy. Niestety, takiego obiektu chyba nie da się wyodrębnić i przypisać do innej listy.

-Tworzyć obiekt w konstruktorze, a do listy przekazać wskaźnik na niego (wiem, że w C# nie ma wskaźników, ale nie wiem jak to nazwać). Niestety, po zakończeniu konstruktora obiekt byłby usuwany i nie możliwe byłoby odwołanie się do niego z poziomu main'a.

-Tworzyć obiekt w mainie, a konstruktorowi tylko go przekazywać. Przy założeniu, że będzie istnieć 5 przedmiotów funkcja wymagałaby 5 argumentów.. Poza tym tworzenie obiektów w mainie byłoby raczej niewygodne i nie sprawdziłoby się.
Niestety, żaden z moich 'sposobów' nie daje rady. Ma ktoś jakiś pomysł?

PS Jeśli jakaś informacja napisana przeze mnie nie jest prawdziwa, proszę o uświadomienie :)

1

Lista ekwipunku nie powinna być tworzona na zewnątrz, bo jaki to ma sens logiczny i programistyczny w tym wypadku? Tworzysz gracza - tworzona jest nowa lista. A to, że obiekt chcesz by był publiczny to ja bym opakował w specjalną kolekcję i udostępnił ją jako publiczna by móc pobierać lub dodawać elementy lub niech już to będzie zwykła lista.

Zapewne chodzi Ci o referencję. Czemu wspominasz o main'ie? Chodzi Ci o metodę Main? Chyba nie chcesz powiedzieć, że jakąkolwiek logikę umieściłeś w Main...

Z tym, aby potwór miał ekwipunek jako loot, dobrze pomyślałeś, z tym, że dla każdego itema musisz mieć np. prawdopodobieństwo, no chyba, że chcesz po prostu losować zawsze 1. Ale.. Taka lista loota powinna być tylko w 1 miejscu jako jedna instancja w programie. Dla każdego TYPU potwora oddzielnie, ale tylko 1. Gdy chcesz pobrać obiekt - klonujesz go i zwracasz za pomocą specjalnej klasy do generowania loota lub tak na prawdę możesz trzymać tylko jakieś ID tych itemów zamiast całych itemów i tworzyć itemy za pomocą fabryki.

Podsumowując. Gracz ma listę itemów. Gdzieś jest zapisana lista itemów, które spadają z danego monstera. W momencie kiedy tam zechcesz (np. po zabiciu) losujesz cały item lub ID i pobierasz go, następnie wrzucasz po prostu na listę gracza, którą opisałem wcześniej.

0

Troszkę źle mnie zrozumiałeś. Lista jest elementem klasy i każdy gracz ma swoją. Wspomniałem o mainie, ponieważ tam umieszczałem obiekty. Teraz robię to inaczej. Wspomagając się odpowiedzią twoją i tą z innego forum wymyśliłem jak to zrobić.
Moim największym problemem było to, że nie wiedziałem jak zapełnić listę potwora bez tworzenia obiektów w mainie. Rozwiązanie było proste, posłużyłem się wspomnianą przez ciebie fabryką:

private Przedmiot generujPrzedmiot(int jakiPrzedmiot)
        {
            switch(jakiPrzedmiot)
            {
                case 1: return new Zbroja_Mnicha(); break;
                case 2: return new Miecz_Mnicha(); break;
            }

            return null;
        }
 

W funkcji uaktywniającej się po zabiciu potwora losuję sobie numer z przedziału 0 do liczbaElementówWLiście-1 i przekazuję go graczowi:

 
postac.ekwipunek.Add(this.mozliwyDrop[numer]);

Dzięki wielkie za wskazówki. Pozdrawiam! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1