Przekazywanie klasy, nie jej obiektów

Odpowiedz Nowy wątek
Skovv
2014-09-25 18:07
Skovv
0

Witam.

Mam pewien problem. Mam klasę z obiektami:

// Obj.java
public class Obj {
    public static class obj_gracz extends GameObject {
    }
    public static class obj_rasta extends GameObject {
    }
}

No i mam obsługe scen, a raczej list grafik, animacji i właśnie obiektów, które mają być tworzone przy starcie danej sceny.
Tutaj właśnie mam źle, i nie wiem jak to zrobić. Chcę aby insOBJ przechowywał adres do klasy, a nie jej obiekt.

// gScene.java
public class gScene {

    // klasa pomocnicza
    public class insOBJ {   
        GameObject Handle;// Jak tu powinno być?
        float X, Y, ScaleX, ScaleY, Angle, Alpha;

        public insOBJ( GameObject obj, float x, float y, float sx, float sy, float ang, float alp ) {
            Handle = obj;//?
            X = x;
            Y = y;
        ScaleX = sx;
        ScaleY = sy;
            Angle = ang;
            Alpha = alp;
        }
    }

    public Vector< insOBJ > Objects;

    public void ObjectAdd( GameObject obj, float x, float y, float sx, float sy, float ang, float alp ) {
    Objects.add( new insOBJ( obj, x, y, sx, sy, ang, alp ) );// ??
    }

}

Do tworzenia obiektów mam funkcje

Instance.Create( new Obj.obj_gracz(), 10, 10 );

Ale niestety, nie wiem jak zrobić coś typu:

Instance.Create( new ins.Handle(), 10, 10 );

Ktoś pomoże?

edytowany 1x, ostatnio: Shalom, 2016-12-13 18:26

Pozostało 580 znaków

2014-09-25 18:54
Moderator

Rejestracja: 7 lat temu

Ostatnio: 4 lata temu

Lokalizacja: Bieszczady

0

Domyślam się tylko o co chodziło:

public void foo(Class c){
  Object ob = c.newInstance();
}

"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."

Pozostało 580 znaków

2014-09-25 19:01

Rejestracja: 16 lat temu

Ostatnio: 4 minuty temu

4

public void ObjectAdd( GameObject obj, float x, float y, float sx, float sy, float ang, float alp ) {

kill_with_fire.jpg
Poważnie te floaty są ze sobą tak niezwiazane że nie da się z nich zrobić osobnej klasy która je upakuje?

Poza tym wydaje mi się że cały design tej aplikacji jest zrobiony źle. Powinieneś mieć obiekty które maja jakąs metodę drawYourself() która służy za malowanie obiektu. Tzn obiekt wie jak sie ma malować. I potem rysowanie sceny to tylko iteracja po wszystkich obiektach i wołanie drawYourself na każdym.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2014-09-25 19:03
hehh coraz lepsze te obrazki na takie okazje wrzucasz :D - karolinaa 2014-09-25 19:53
Staram się żeby wam sie nie nudziło ;) - Shalom 2014-09-25 20:05
"Powinieneś mieć obiekty które maja jakąs metodę drawYourself()" Nie do końca się z tym zgodzę. O ile to podejście jest bardzo fajne z punktu widzenia OOP, o tyle przy bardziej złożonym rysowaniu utrudni i skomplikuje niepotrzebnie kod. Przykładowo dodanie obiektów przezroczystych wymusza narysowanie ich później niż tego, co jest za nimi. IMO znacznie lepiej, by obiekt był zbiorem komponentów, a jakaś oddzielna klasa odpowiedzialna za rysowanie przelatywałaby po komponentach powiązanych z rysowaniem i sobie radziła z tym, co dostanie :-) - Ieoia 2014-09-25 20:21
A jak "typów" obiektów są setki czy tysiące? To ta twoja "oddzielna klasa" będzie zajmowała tyle kodu co reszta projektu... - Shalom 2014-09-25 20:25
Obiektów może być ile kto zechce ;) A komponentów związanych z wyświetlaniem nie powinno być więcej niż kilkanaście (bo większość da się zgeneralizować). Za to pakowanie wszystkiego do drawYourself(), to jest dopiero zajmowanie kodu! Chcesz mieć obiekty przezroczyste? Dodaj workaround, aby obiekty były przetwarzane w odpowiedniej kolejności. Chcesz mieć ukrywanie zbędnych obiektów? Musisz przekazać dane o widoku do metody (choć to akurat bym gdzie indziej przeniósł). I tak dla każdego obiektu. Unity3D z tego korzysta i chyba nieźle na tym wyszli :P - Ieoia 2014-09-25 20:38
Przy czym zaznaczam, że ma to tylko zastosowanie dla złożonej grafiki (w innych miejscach też upraszcza, ale użycie musi mieć sens) :-) - Ieoia 2014-09-25 20:38

Pozostało 580 znaków

Skovv
2014-09-25 19:06
Skovv
0

Wybaczcie, ale jakoś tak baaardzo dziwnie się wrzuciło :| Właśnie mniej więcej o to chodzi. Mam główną klasę Obj i w niej podklasy z extends GameObject. GameObject to klasa obiektu, którą dziedziczy każdy z tworzonych obiektów w grze. Teraz mam tak:

// gScene.java
public class gScene {
    public class insOBJ {   
    Class Handle;
    float X, Y, ScaleX, ScaleY, Angle, Alpha;

    public insOBJ( Class obj, float x, float y, float sx, float sy, float ang, float alp ) {
        Handle = obj;
        X = x;
        Y = y;
        ScaleX = sx;
        ScaleY = sy;
        Angle = ang;
        Alpha = alp;
    }

    public Vector< insOBJ > Objects;

    public void ObjectAdd( Class obj, float x, float y, float sx, float sy, float ang, float alp ) {
    Objects.add( new insOBJ( obj, x, y, sx, sy, ang, alp ) );
    }
}

// I teraz tworzę scenkę:
public static gScene scn_1= new gScene();
public static void Load() {
    scn_1.ObjectAdd( Obj.obj_gracz,  10f,  10f, 1f, 1f, 0f, 1f );// TUTAJ
    // Jak to zrobić? Obj.obj_gracz jest klasą GameObject. Jak to rozwiązać?
}

Pozostało 580 znaków

2014-09-25 19:15

Rejestracja: 16 lat temu

Ostatnio: 4 minuty temu

0

Ale po co robisz coś takiego? Czemu scena miałaby w taki dziwny sposób tworzyc te obiekty? Jaki jest tego cel? Nie możesz mieć po prostu kolekcji obiektów gry?


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2014-09-25 19:16

Rejestracja: 7 lat temu

Ostatnio: 4 lata temu

Lokalizacja: Bieszczady

0

Napisz może - co chcesz zrobić ? bo to co masz teraz to jest jakiś łatafak


"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."

Pozostało 580 znaków

Skovv
2014-09-25 19:21
Skovv
0

Bo wygląda to tak: mam klasę Scn.java i w niej jak widać obiekty gScene. W nich trzymam listy grafik i animacji sceny, które odpalane są na starcie. Ten fragment działa. Teraz chciałbym dodać ostatni element: listę obiektów( ich klas ) które mają się tworzyć. Nie moge trzymać obiektów bo nie chcę ich tworzyć przy samym dodawaniu mapki, a wtedy, gdy mapa jest odpalana.

Pozostało 580 znaków

Skovv
2014-09-25 19:50
Skovv
0

Mam klasę sceny: gScene. W niej mam 3 vectory: Before i After do grafiki, animacji. No i trzeci vector to Objects. Nie zapisuję mapek w plikach, tylko tworzę nowy obiekt gScene i dodaję dany element mapy poprzez funkcję z gScene.

public class Scn {

    public static gScene scn_1= new gScene();// nowy obiekt scenki. w nim trzymam listę obiektów danej mapy

    public static void Load() {
        scn_1.BeforeAddSprite( Spr.spr_9, 96f, 480f, 1f, 1f, 0f );// Grafika i animacje
        scn_1.BeforeAddSprite( Spr.spr_8, 0f, 480f, 1f, 1f, 0f );
        scn_1.BeforeAddSprite( Spr.spr_20, 96f, 576f, 1f, 1f, 0f );
        scn_1.BeforeAddSprite( Spr.spr_21, 192f, 576f, 1f, 1f, 0f );

        scn_1.ObjectAdd( Obj.obj_gracz,  10f,  10f, 1f, 1f, 0f, 1f );// Obiekty
    }
}

Mam klasę Instance.java i w niej vector z listą GameObject. Jest i kolejna klasa: Scene.java. W scene mam funkcję Set( gScene mapa ).
Po wywołaniu funkcji Scene.Set( Scn.scn_1 ); czyści mi się mapa, dodaje na nią wszystkie elementy tła( vector Before i After ). No i chciałbym jeszcze aby tworzyły mi się wszystkie obiekty które są dodane do mapki. Rozumiecie?

Pozostało 580 znaków

2014-09-25 20:04

Rejestracja: 16 lat temu

Ostatnio: 4 minuty temu

0

Ja nie rozumiem, ale utwierdza mnie to tylko w przekonaniu że źle to zaprojektowałes a teraz szukasz hacka który by to jakoś posklejał. Co powinieneś zrobić z ty kodem masz w moim pierwszym poście.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

Skovv
2014-09-25 20:12
Skovv
0

Nie mam problemu z rysowaniem itp itd.. Po prostu chcę jakoś zapisać do klasy gScene liste obiektów GameObject którą ma tworzyć przy starcie właśnie tej sceny, rozumiesz? Nie znam za bardzo javy i dlatego mam z tym problem.. gScene przechowuje listę obiektów które mają być tworzone. Przy wybraniu funkcji Scene.Set( scena ) obiekty z listy tej sceny mają się wywoływać. Czyli jak mam na liście 2 obiekty np: obj_gracz i obj_rasta to teraz ma stworzyć obiekt obj_gracz( new Obj.obj_gracz() ). Rozumiesz?

Pozostało 580 znaków

2014-09-25 20:38

Rejestracja: 7 lat temu

Ostatnio: 4 lata temu

Lokalizacja: Bieszczady

0

Ale nie możesz zwyczajnie stworzyć listy/seta/hasha/arrayki - czekokolwiek [List<twojeobiekty> lista = new ArrayList<>();] i przekazać do tej klasy ? Twoim problemem nie jest nieznajomość javy tylko nieumiejętność programowania która kaleczy me oczęta.
Klasa:

class Pupka{
 private List<TwojeObiektyDoStworzenia> lista;

 public void setTwojeObiektyJakośJakolwiek(List<TwojeObiektyDoStworzenia> lista){
  this.lista = lista // TUTAJ PRZEKAZUJESZ LISTE TYCH OBIEKTÓW A NIE ROBISZ ŁATAFAKA
 }
}

"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."

Pozostało 580 znaków

Odpowiedz

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