goto, swing, grafika

goto, swing, grafika
I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
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 ?

Kopiuj
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();
 
krzysiek050
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:1272
0
Kopiuj
 
            case 6:
                 line.setLine(150, 190, 190, 230);
                    g2d.draw(line);                    /// prawa reka
                if(panelPlayer1.getError()==6) break;
edytowany 1x, ostatnio: krzysiek050
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
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
I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
0

to znajduje się w metodzie paintComponent

Kopiuj
  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();
	        
	    }
Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Stacktrace
  • Postów:6822
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:

Kopiuj
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);;
    }
}

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostały 1 komentarz
Koziołek
I jak zadaje pytania to dostaje odpowiedzi, które mu ułatwią życie :)
I2
Consumer ? w ktorej bibliotece to znajdę ?
Koziołek
w Javie 8 jest w podstawowym API
krzysiek050
java.util.function.Consumer z Java 8
I2
to dlatego jej nie widzę :) pisze w JavaSE 1.7
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
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
I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
0

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

spartanPAGE
  • Rejestracja:około 12 lat
  • Ostatnio:około 18 godzin
0
ice25 napisał(a):

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

KOLEKCJĘ.

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

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

Kopiuj
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
I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
0

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

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
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
DZ
  • Rejestracja:około 14 lat
  • Ostatnio:około 8 lat
  • Postów:76
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.