Problem ze skalowaniem obszaru gry

0

Witam przeszukałem już wiele różnych rozwiązań jednak żadne nie działa w stu procentach. Moim celem jest zrobienie aby podczas rozciągania JFrame rozciągał się JPanel w którym jest narysowana plansza. Póki co doszedłem do takiego kodu:

public void paintComponent(Graphics g) {
	    Graphics offgc;
	    Image offscreen = null;

	    // create the offscreen buffer and associated Graphics
	    offscreen = createImage(this.getWidth(), this.getHeight());
	    offgc = offscreen.getGraphics();
	    // clear the exposed area
	    offgc.setColor(getBackground());
	    offgc.fillRect(0, 0, this.getWidth(),  this.getHeight());
	    offgc.setColor(getForeground());
	    // do normal redraw
           ((Graphics2D)offgc).draw(board);
	  
	  drawHelpLines(((Graphics2D)offgc));
	       
	  fig.draw(((Graphics2D)offgc));
	       
 	   for( int i = 0; i < dfig.size(); i++ )
	    	   dfig.get(i).draw(((Graphics2D)offgc));
	    // transfer offscreen to window
 	//  Image asd; // ten asd to po prostu drugi sposób 
 	//  asd = null;
 	//  asd = offscreen.getScaledInstance(this.getWidth(),this.getHeight(),Image.SCALE_FAST);
       //  g.drawImage( asd, 0,0,this);
 	  g.drawImage(offscreen, 0, 0,this.getWidth(),this.getHeight(), this);
 	
	   }

Może dodam jeszcze że struktura layoutów wygląda mniej więcej tak:
JFrame ma cardlayout i cardPanel w którym jest MenuPanel i oczywiście mój niesforny JPanel. Ten JPanel posiada BorderLayout i w miejsce CENTER wstawiony jest JPanel w którym rysuje się gra, a w miejsce EAST panel z wynikami. Proszę o pomoc bo na prawdę już nie mam pojęcia jak to trzeba zrobić....

0
  1. Gier się nie powinno robić z renderowaniem pasywnym. (paintComponent)

  2. Co to za pomysł, żeby tworzyć obrazek W TRAKCIE renderowania? WTF? (createImage w paintcomponent)

0

Ad 2. Ok, utworzyłem kolejną metodę drawToBuffer w której tworze obrazek do rysowania i która jest wywoływana przed metodą repaint.
Ad 1. Korzystam ze Swinga a z tego co wiem JPannel nie ma innych metod(odnosnie renderowania) tylko paintComponent

Dodam, że jeżeli chodzi o jave to jestem początkujący.

1

http://docs.oracle.com/javase/tutorial/

Słuchaj, nie zrobisz gry na czymś, co nawet nie wiesz jak działa.

Swing to framework do GUI - i wszelkie repainty, paintComponent, paint, update, itd, to są metody do renderowania pasywnego.
Jeśli robisz grę (nie karcianą lub podobne) to powinieneś korzystaćz renderowania aktywnego.

Obrazek offscreen masz stworzyć tylko RAZ - a Ty, z tego co napisałeś, znowu, towrzysz go przed każdym repaintem... jaki w tym jest sens, no zastanów się?
Taki obrazek, przykładowo 32 bitowy, dla rozdzielczości 1600x900 zajmuje ponad 5mb w pamięci - a Ty go chcesz tworzyć za każdym odrysowaniem.

Powinno być z grubsza tak:

offscreen = createImage()
while(true) {
    // pętla gry
}
0

Witam przeszukałem już wiele różnych rozwiązań jednak żadne nie działa w stu procentach. Moim celem jest zrobienie aby podczas rozciągania JFrame rozciągał się JPanel w którym jest narysowana plansza. Póki co doszedłem do takiego kodu:
(...)
Może dodam jeszcze że struktura layoutów wygląda mniej więcej tak:
JFrame ma cardlayout i cardPanel w którym jest MenuPanel i oczywiście mój niesforny JPanel. Ten JPanel posiada BorderLayout i w miejsce CENTER wstawiony jest JPanel w którym rysuje się gra, a w miejsce EAST panel z wynikami. Proszę o pomoc bo na prawdę już nie mam pojęcia jak to trzeba zrobić....

Nie ma tu kodu z tworzeniem paneli i ustawianiem layoutów. Prawdopodobnie ustawiłeś coś na sztywno.

Powinno być z grubsza tak:
offscreen = createImage()
while(true) {
// pętla gry
}

Przy rozciąganiu okna trzeba ten offscreen przebudować jeszcze.

1

Zawsze każdy początkujący próbuje napisać grę, nie znając wielu podstawowych komend. Ja osobiście polecam zacząć od niewielkich programów, lub tylko elementów, które będziesz chciał w tej grze umieścić. Pamiętam, że też tak zaczynałem, stworze grę, najlepiej mmo od razu, ale tak się nie da, serio. Możesz się tylko zniechęcić. I szczerze zacznij może od jakichś prostszych programików rysujących, spróbuj poczytać o innych sposobach renderowania (tu podpowiedź słowo "render" powinno pomóc) niż paintcomponent. No i wątki, bez nich żadnej gry nie napiszesz.
Cóż ja swoją klasę, która odpowiada za to jak wyświetlać mam napisaną w 100 linijkach kodu. Spróbuję napisać co dokładnie musisz znać, żeby móc stworzyć coś takiego(oczywiście są inne sposoby, ale metody zawsze warto znać):
-wątki;
-Dimension;
-.pack();
-.getGraphics();
-.drawImage();
-.Dispose();
-createVolatileImage();

Jeśli się zagłębisz w to co ci napisałem to pewnie znajdziesz wiele ciekawych przykładów w internecie dzięki czemu odkryjesz z czym to się je. Powodzenia.

0

@up zgadzam się z myślą że każdy początkujący próbuje napisać grę;) Dzięki za porady:)

@Kerai: "Słuchaj, nie zrobisz gry na czymś, co nawet nie wiesz jak działa."
Grę piszę na zaliczenie przedmiotu, zgadzam się nie znam wielu mechanizmów javy ani pewnie nie mam dobrych podstaw teoretycznych( mam tu na myśli znajomość klas itd ), semestr czasu to trochę mało żeby poznać dobrze jave,ale mimo to postanowiłem napisać tą grę sam a nie jak inni kupić gotowy projekt czy coś w tym stylu. Z tym tworzeniem image to już rozumiem co chciałeś mi przekazać, postaram się zająć tym problemem w następnej kolejności. Jeszcze raz dzięki za porady;]
EDIT: po wyrzuceniu tworzenia obrazu za każdym razem dziwnym trafem problem sam się rozwiązał:) także jeszcze raz dzięki!

@Wibowit
Póki co buduje offscreen przy każdym renderowaniu, więc nie tu tkwi problem. Co do kodu z Layoutami to nie wiem za bardzo jak go zamieścić bo jak tego nie zrobię to będzie trochę obszerne, poza tym trochę głupio mi go wstawiać bo pewnie porobione jest w nim byk na byku.

0

Możesz zablokować możliwość zmiany rozmiaru okna (setResizable(false);). Możesz do głównego okna dodać ComponentListenera i w metodzie componentResized ustawić wymaganą wielkość i rozłożenie komponentów - chociaż powinien to zrobić LayoutManager. Bez kodu nie da się powiedzieć dlaczego tego nie robi.

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