Odwołanie do klasy z innej klasy w XNA

Odpowiedz Nowy wątek
2011-08-04 19:43
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 :(

Pozostało 580 znaków

2011-08-04 20:06
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.

wpływanie jednaj klasy na drugą to chyba nie są pogmatwane zależności? - msm 2011-08-05 20:02
napisał to w taki sposób, że nie było wiadomo o co mu biega ? - Madm4n 2011-08-05 20:05

Pozostało 580 znaków

2011-08-04 20:17
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.

Pozostało 580 znaków

2011-08-04 20:22
O_o
0
class Player
{
  class Bullet{}
  List<Bullet> bullets;
}

O̾..͠o
edytowany 1x, ostatnio: O_o, 2011-08-04 20:23

Pozostało 580 znaków

2011-08-04 20:40
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 :(.


Przejdę, przejdę, myślał Red. Nie pierwszy raz, przecież przez całe życie właśnie tak, po szyję w gównie, a nad głową pioruny, zawsze tak było...
edytowany 4x, ostatnio: konserwa, 2011-08-04 21:02

Pozostało 580 znaków

2011-08-05 10:04
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).

Klasą typu singleton może być statek , bo twórca chce jego współrzędnych dla pocisków :).\ - konserwa 2011-08-05 11:32

Pozostało 580 znaków

2011-08-05 10:34
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.


Przejdę, przejdę, myślał Red. Nie pierwszy raz, przecież przez całe życie właśnie tak, po szyję w gównie, a nad głową pioruny, zawsze tak było...
edytowany 3x, ostatnio: konserwa, 2011-08-05 10:47

Pozostało 580 znaków

2011-08-05 19:23
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

edytowany 2x, ostatnio: Foren, 2011-08-05 19:30

Pozostało 580 znaków

2011-08-05 20:10
msm
0

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ś?

edytowany 2x, ostatnio: msm, 2011-08-05 20:11

Pozostało 580 znaków

2011-08-06 00:50
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.

edytowany 1x, ostatnio: somekind, 2011-08-06 00:51
Trochę w tej grze jest do poprawienia :] Ogólnie robiłem całkiem podobnie tylko na trochę wyższym stopniu abstrakcji - może dlatego że mam talent do komplikowania swoich programów. - msm 2011-08-06 01:08
Niby co tam jest do poprawienia? - somekind 2011-08-06 02:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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