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