Rotacja wielu obiektów image i zapisanie ich do tablicy

0

Cześć, piszę grę, w której używam kafelkowania mapy. Każdy kafelek zapisuje do tablicy
Image tablica[][]
I wszystko bylo by dobrze gdyby nie to, że chcialem sbie ułatwic zycie i nie robic kolejno rysunków obuconych o pewien kat ktore potem sie by mialy złozyc na mape tylko chcialem miec jedna grafike ktra wczytuje obracam ja w programie o wskazany kat i tak obrócona łąduje do tablicy.
Napisalem cos takiego:

public Image odwroc_obraz(int kat, String nazwa) throws IOException
	{
		BufferedImage bufor_obrazu = wczytaj_buforowany_obraz(nazwa);
								
		//odwracanie grafiki
		AffineTransform zmien = new AffineTransform();						
		zmien.rotate(Math.toRadians(kat),WIELKOSC_KAFLA/2,WIELKOSC_KAFLA/2);

		//odwracanie naszego bufora
		AffineTransformOp op = new AffineTransformOp (zmien, AffineTransformOp.TYPE_BILINEAR); 
     	bufor_obrazu  = op.filter( bufor_obrazu , null); 
		Image obraz = (Image)bufor_obrazu;
		return obraz;
	}
	public BufferedImage wczytaj_buforowany_obraz(String nazwa) throws IOException
	{
		File plik = new File("grafika/"+nazwa);
		BufferedImage bufor = ImageIO.read(plik);
		
		return bufor;
	}

Ale niestety to dziala przy jednym kaflu. Jak chce wiecej kafli wczytac wywala wyjatek:

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
    at Plansza.Plansza.paintComponent(Plansza.java:95)
    at javax.swing.JComponent.paint(JComponent.java:1027)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5122)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:277)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1217)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5070)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

I pytanie brzmi co poprawic by dzialalo dla wielu kafli ?:>

Edit:

Oki zauwazylem ze błąd czynilo zupelnie co innego w kodzie gry, ale za to stawiam takie pytanie.. czy istnieje inne rozwiazanie tego problemu?
Gdyz przy wiekszej ilosci kafli strasznie długo trawa ich ustawianie a przy tym łądowanie mapki

Edit:

Rozwiazalem to w ten sposob:

public BufferedImage odwroc_obraz(int kat, String nazwa) throws IOException
	{
		BufferedImage bufor_obrazu=null;// = wczytaj_buforowany_obraz(nazwa);
		Image image = wczytaj_obraz(nazwa);
								
		//odwracanie grafiki
		AffineTransform zmien = new AffineTransform();						
		zmien.rotate(Math.toRadians(kat),WIELKOSC_KAFLA/2,WIELKOSC_KAFLA/2);


     	GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
		try 
		{
            //tworzenie buforowanego obrazu
            GraphicsDevice gs = ge.getDefaultScreenDevice();
            GraphicsConfiguration gc = gs.getDefaultConfiguration();
            bufor_obrazu = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null));
        }
        catch (HeadlessException e) {} 

    	Graphics2D gg = bufor_obrazu.createGraphics ();
    	gg.transform(zmien);
		gg.drawImage ( image, 0 , 0 , null ) ;
		gg.dispose();
		
		return bufor_obrazu;
	}
	
	public Image wczytaj_obraz(String nazwa)
	{
		return new ImageIcon("grafika/"+nazwa).getImage();
	}

Chyba rozwiazanie jest skuteczne, bo wczytywanie grafiki i jej obracanie znacznie sie przyspieszylo, ale jezeli ktos by mial jeszcze inne pomysly to prosze pisac:P

0

Ja mam tylko taką sugestię, że bawiąc się w rysowanie lub gry - zapomnij o operacji dzielenia i reszcie z dzielenia (a już zupełnie o pierwiastkowaniu).
Jeżeli masz dzielenie przez potęgę dwójki zamienia się to na kilkaset razy szybsze przesuwanie bitów. x / 2 to to samo co x >> 1, x / 4, to x >> 2, x / 8 to x >>3 itd. Natomiast reszta z dzielenia, to maskowanie liczbą bitów. Np. x % 8, to x & ( 1 << 3 ) czyli x & 3.

0

Hmm.. dobra rada, dzieki

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