Odwołanie do klasy z innej klasy w XNA

0

Próbuje stworzyć grę w XNA, jestem początkujący i mam pewien problem.
Nie wiem do końca jak to opisać więc...
Powiedzmy że tworze dwie klasy - "Pierwsza.cs" i "Druga.cs". W głównej klasie (Game1.cs) robię coś takiego:

Pierwsza pierwsza;
Druga druga;

a potem:

pierwsza = new Pierwsza();
druga = new Druga();

I wszystko działa tak jak chce, powiedzmy że w "pierwsza" mam metodę "wynik" i mogę się do niej odwołać w Game1.cs poprzez

pierwsza.wynik(x);

Teraz jednak mam problem, w klasie "druga" dodaje do siebie dwie liczby i chce ją zapisać w pierwsza.wynik(); jednak nie mogę się do niej odwołać ze środka klasy "Druga.cs" (mogę to tylko zrobić z Game1.cs). W jaki sposób mogę połączyć zmienną "pierwsza" z Game1.cs tak bym mógł ją edytować ze środka klasy "Druga.cs"?

Próbowałem w środku klasy "Druga.cs" jeszcze raz zdefiniować tą zmienną tak jak napisałem wyżej, ale tworzy on wtedy zupełnie nową zmienną której zmiana nie wpływa na tą w "Game1.cs".
Bardzo proszę o pomoc :(

0

A może powiedz co chcesz osiągnąć? Bo robisz jakieś pogmatwane zależności, które w przyszłości okażą się niezdrowe.

0

Mam jedną klasę w której znajdują się wszystkie dane na temat statku gracza (np. jego współrzędne, pozostałe punkty hp, sterowanie). Mam też drugą klasę która zajmuje się pociskami którymi strzela statek. I teraz ze środka klasy statku muszę stworzyć pocisk, przekazując tamtej klasie aktualne współrzędne statku.
Mam też gotową klasę która sprawdza zderzenie pocisku ze statkiem i tam też muszę w jakiś sposób dostać się do klasy ze statkiem by odjąć jego hp.

0
class Player
{
  class Bullet{}
  List<Bullet> bullets;
}
0

Próbowałem w środku klasy "Druga.cs" jeszcze raz zdefiniować tą zmienną tak jak napisałem wyżej, ale tworzy on wtedy zupełnie nową zmienną której zmiana nie wpływa na tą w "Game1.cs".

hmmm singleton albo niech konstruktor w klasie druga ma w parametrach obiekt pierwszej.

class pierwsza
{
  private static pierwsza ObiektPierwsza = new pierwsza();

  private pierwsza()
  {
  }

  public static pierwsza GetInstance()
 {
    return ObiektPierwsza;
 }
}
class druga
{
pierwsza obiekt1 = pierwsza.GetInstance();
} 

wtedy pola w klasie pierwsza będą stałe dla każdego obiektu.

Podkreślam bez podkreślania że nie jestem pewien czy nie popełniłem błędu w kodzie ,bo aktualnie nie mam kompilatora :(.

0

Singleton to raczej nie jest najlepszy pomysł, bo chyba nie chcemy ograniczać możliwości strzelania do tylko JEDNEGO pocisku ? ;)

HP statku możesz zmieniać poprzez zrobienie właściwości get/set z dostępem do prywatnej składowej która przechowuję ilość HP i np. sprawdzać w get czy HP nie będzie mniejsze od 0 i wtedy dawać np. eksplozję czy co tam chcesz zrobić ze statkiem gdy HP spadnie poniżej 0.

Współrzędne też możesz zrobić owym get'em (bo set raczej nie potrzebny, potrzebujesz tylko info o aktualnej pozycji).

0

Singleton to raczej nie jest najlepszy pomysł, bo chyba nie chcemy ograniczać możliwości strzelania do tylko JEDNEGO pocisku ? ;)

singleton odnosił by sie do Statku nie do pocisków

Zresztą singleton może być pośrednikiem.
W której już jest lista pocisków.

0

Dziękuje bardzo za odpowiedzi, ale chyba jestem zbyt tępy i nadal nie wiem jak tego używać :D

Wymyśliłem coś innego i z tego co na razie widzę to działa, ale pomyślałem że napisze tutaj żeby w razie czego ktoś mi mógł zwrócić uwagę czemu mam tak nie robić.

Zrobiłem to w taki sposób - jak odnoszę się do innej klasy w Game1.cs dodaje parametr (chyba to się nazywa parametr?) out. Tak więc wygląda to tak (przykładowo):

druga.licznik(out pierwsza.liczbadonadpisania, out pierwsza.liczbadwa);

a w klasie druga.cs:

public void licznik(out int liczbadonadpisania, out int liczbadwa)
{
liczbadonadpisania = 1+2;
liczbadwa = 10;
}

(ale to jest trochę niewygodne bo za każdym razem jak będę chciał pobrać więcej zmiennych będę musiał aktualizować każdy wpis druga.licznik();)

I w ten sposób dzieje się to co chciałem - metoda w klasie "druga" otrzymuje zmienną z "pierwsza" i po ukończeniu działania wartość tej zmiennej jest przekazywana do klasy "pierwsza" (skonstruowanej w Game1.cs).
...a przynajmniej tak myślę. Jeśli się mylę niech mnie ktoś poprawi.

I w razie czego jeszcze jedno pytanie - jak w ten sposób przekazać np. tablicę? Próbowałem poprzez (to tez tylko przykład):
Game1.cs:

public int[] tablica= new int[2];
tablice.licznik(out tablica);

tablice:

public void licznik(out int[] tablica) 
{
tablica[0] = 1;
}

Wiem że w metodzie "licznik" nie zdefiniowałem wielkości tablicy ale cokolwiek bym tam nie wpisał to oznacza jako błąd. Na wszelki wypadek każdą rzecz ustawiłem tez jako public jakby były jakieś problemy z dostępem :P

1

Ale co wy kombinujecie...?

    class Program
    {
        static void Main(string[] args)
        {
            Pierwsza pierwsza = new Pierwsza();
            Druga druga = new Druga(pierwsza);

            druga.Dodaj(2, 3);
            Console.WriteLine(pierwsza.Wynik);
            Console.ReadKey(true);
        }
    }

    class Pierwsza
    {
        public int Wynik
        { get; set; }
    }

    class Druga
    {
        private Pierwsza pierwsza;

        public Druga(Pierwsza pierwsza)
        {
            this.pierwsza = pierwsza;
        }

        public void Dodaj(int a, int b)
        {
            pierwsza.Wynik = a + b;
        }
    }

@Madm4n - Singletonów się używa wtedy kiedy trzeba a nie wszędzie tam gdzie można...
@Foren - Cały twój ostatni post może trafić do DailyWtf... Gorzej nawet ja bym tego nie zrobił :>

Mam jedną klasę w której znajdują się wszystkie dane na temat statku gracza (np. jego współrzędne, pozostałe punkty hp, sterowanie). Mam też drugą klasę która zajmuje się pociskami którymi strzela statek. I teraz ze środka klasy statku muszę stworzyć pocisk, przekazując tamtej klasie aktualne współrzędne statku.

Dość dziwna architektura gry. Czemu to tak podzieliłeś?

0

Jak swego czasu pisałem grę (http://somekind.pl/silverlight/mf/), to miałem klasę Gracz, miałem klasę Pocisk (obie dziedziczące z klasy Obiekt i miałem klasę Silnik, która:

  1. Sprawdzała czy Pocisk trafił Gracza;
  2. Odejmowała od Gracz.PunktyŻycia liczbę zdefiniowaną w Pocisk.ZmianaŻycia;
  3. Ustawiała Pocisk.PunktyŻycia na 0;
  4. Wywalała z planszy wszystkie obiekty, których PunktyŻycia == 0;
  5. No i oczywiście przerysowywała wszystkie obiekty, generowała wybuchy i takie tam pierdoły.
    I jakoś to dziwnym trafem działało, bez outów, singletonów i transformersów.

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