goto, swing, grafika

Odpowiedz Nowy wątek
2014-12-15 09:15
0

Witam
Mam pytanie dotyczące wyświetlania grafiki mianowicie tworzę grę wisielec i chciałbym aby po kazdym popelnionym bledzie rysowala sie mi kolejna "czesc" szubienicy. Obecnie niestety wyglada to tak że kasuje sie poprzedni "kawalek" i rysuje kolejny jak mogę to rozwiązać bez go to ?

switch (panelPlayer1.getError()) {
            case 1:
            //  line.setLine(50, 400, 50, 50);
              //  g2d.draw(line);
                g2d.draw(new Line2D.Double(50, 400, 50, 50));

                break;

            case 2:
                 line.setLine(50, 50, 150, 50);
                    g2d.draw(line);

                break;

            case 3:
                 line.setLine(150, 50, 150, 110);
                    g2d.draw(line);                 ///linka do glowy 
                break;

            case 4:
                 ellipse.setFrame(120, 110, 60, 60);
                    g2d.draw(ellipse);              /// glowa
                break;

            case 5:
                 line.setLine(150, 170, 150, 280);
                    g2d.draw(line);                 ///tulow
                break;

            case 6:
                 line.setLine(150, 190, 190, 230);
                    g2d.draw(line);                 /// prawa reka
                break;

            case 7:
                 line.setLine(150,190, 110,230);
                    g2d.draw(line);                 /// lewa reka 
                break;

            case 8:
                 line.setLine(150, 280, 190, 320);
                    g2d.draw(line); 
                break;

            case 9:
                 line.setLine(150, 280, 110, 320);
                    g2d.draw(line); 
                break;

            default:
                break;
            }*/

            repaint();

Pozostało 580 znaków

2014-12-15 09:23
0

            case 6:
                 line.setLine(150, 190, 190, 230);
                    g2d.draw(line);                    /// prawa reka
                if(panelPlayer1.getError()==6) break;
edytowany 1x, ostatnio: krzysiek050, 2014-12-15 09:23

Pozostało 580 znaków

2014-12-15 10:11
0

Prawdopodobnie całe rysowanie jest błędne. Rysować trzeba w metodzie paintComponent (ewentualnie paint). Zobacz co sie stanie z Twoim rysunkiem po zminimalizowaniu i przywróceniu okna.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2014-12-15 11:34
0

to znajduje się w metodzie paintComponent

  public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            Line2D line = new Line2D.Double();
            Ellipse2D ellipse = new Ellipse2D.Double();

            switch (panelPlayer1.getError()) {
            case 1:
            //  line.setLine(50, 400, 50, 50);
              //  g2d.draw(line);
                g2d.draw(new Line2D.Double(50, 400, 50, 50));

                break;

            case 2:
                 line.setLine(50, 50, 150, 50);
                    g2d.draw(line);

                break;

            case 3:
                 line.setLine(150, 50, 150, 110);
                    g2d.draw(line);                 ///linka do glowy 
                break;

            case 4:
                 ellipse.setFrame(120, 110, 60, 60);
                    g2d.draw(ellipse);              /// glowa
                break;

            case 5:
                 line.setLine(150, 170, 150, 280);
                    g2d.draw(line);                 ///tulow
                break;

            case 6:
                 line.setLine(150, 190, 190, 230);
                    g2d.draw(line);                 /// prawa reka
                break;

            case 7:
                 line.setLine(150,190, 110,230);
                    g2d.draw(line);                 /// lewa reka 
                break;

            case 8:
                 line.setLine(150, 280, 190, 320);
                    g2d.draw(line); 
                break;

            case 9:
                 line.setLine(150, 280, 110, 320);
                    g2d.draw(line); 
                break;

            default:
                break;
            }

            repaint();

        }

Pozostało 580 znaków

2014-12-15 12:41
3

A dlaczego tak? Stwórz klasę Hangman w której będziesz miał metodę onUserMistake(Graphics g). W tej klasie przechowujesz aktualny stan wisielca, a w metodzie przehcodzisz do kolejnego elementu.
Co wiecej można to nawet fajnie oprogramować za pomocą kolejki:

public class Hangman {

    private final Queue<Consumer<Graphics>> fifo;

    Hangman() {
        Consumer<Graphics> headPainter = g->{
            // tu rysowanie glowy
        };
        Consumer<Graphics> bodyPainter= g->{
            // tu rysowanie ciała
        };
        //... itd.

        fifo = new LinkedBlockingQueue<>();
        fifo.add(headPainter);
        fifo.add(bodyPainter);
        /// itd...

    }

    public void onUserMistake(Graphics g){
        fifo.poll().accept(g);;
    }
}
Bo pewnie jest początkujący i orze jak może. Na początku ważne jest żeby zrobić coś co jakoś działa. - krzysiek050 2014-12-15 13:09
I jak zadaje pytania to dostaje odpowiedzi, które mu ułatwią życie :) - Koziołek 2014-12-15 13:15
Consumer ? w ktorej bibliotece to znajdę ? - ice25 2014-12-15 15:01
w Javie 8 jest w podstawowym API - Koziołek 2014-12-15 15:03
java.util.function.Consumer z Java 8 - krzysiek050 2014-12-15 15:04
to dlatego jej nie widzę :) pisze w JavaSE 1.7 - ice25 2014-12-16 22:58

Pozostało 580 znaków

2014-12-15 13:29
0

Dla początkujacego: Powinieneś miec kolekcję kształtów (linie i elipsy) i w metodzie paintComponent rysować je wszystkie w pętli. Każdy błąd popełniony przez odgadującego dodaje do tej kolekcji kolejny kształt.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2014-12-16 22:54
0

Czyli muszę tworzyć line1, line2 itd ? bo wlasnie chcialbym właśnie takiej sytuacji uniknąć.

Pozostało 580 znaków

2014-12-16 22:56
0
ice25 napisał(a):

Czyli muszę tworzyć line1, line2 itd ? bo wlasnie chcialbym właśnie takiej sytuacji uniknąć.

KOLEKCJĘ.

Pozostało 580 znaków

2014-12-17 07:07
0

Możesz też przygotować całą kolekcję na starcie programu.

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for(int i=0;i<panelPlayer1.getError();i++)
    {
        //narysuj i-ty element kolekcji
    }        
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2014-12-17 16:17
0

a czy mogę utworzyć tablicę typów Line2d ?
bo kompilator wyrzuca mi błędy...

Pozostało 580 znaków

2014-12-17 16:24
0

Możesz. Ale lepiej stwórz tablicę typu Shape[], możesz w niej umieścić i kreski i elipsy.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

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