goto, swing, grafika

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();
 
0
 
            case 6:
                 line.setLine(150, 190, 190, 230);
                    g2d.draw(line);                    /// prawa reka
                if(panelPlayer1.getError()==6) break;
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.

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();
	        
	    }
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);;
    }
}
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.

0

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

0
ice25 napisał(a):

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

KOLEKCJĘ.

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
    }        
}
0

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

0

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

0

Nie lepiej bez rzeźbienia przygotować kilka obrazków i wczytywać je po popełnieniu błędu?

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