Witajcie,
każą mi pisać gry, a jestem całkowitym noobem w programowaniu, ale piszę. Jest problem w ruszeniu apki po umieszczeniu w kodzie animacji ruchu obiektu... Wykazuje mi taki błąd(a później lawina z nim związana):
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at pakiet.panel.paintComponent(panel.java:147)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at java.awt.Window.paint(Unknown Source)
at javax.swing.RepaintManager$4.run(Unknown Source)
at javax.swing.RepaintManager$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1300(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
...itd.
Odwołanie błędu jest do tej linijki(funkcji):
for(int i=0;i<fbomba.length;i++)
{
fbomba[i].calculatePathPos(param.MoveMODE);
if(!fbomba[i].hit)
g.drawImage
(
fbomba[i].icon,
fbomba[i].currX,
sHeight-fbomba[i].currY,
(int)(fbomba[i].icon.getWidth(null)*(1.0-fbomba[i].currY/(double)sHeight)),
(int)(fbomba[i].icon.getHeight(null)*(1.0-fbomba[i].currY/(double)sHeight)),
null
);
}
Która to znajduje się w klasie Fallout:
public class Fallout
{
/** Zmienne */
public int x;
/** Początkowa współrzędna y obiektu */
public int y;
/** Aktualna współrzędna x obiektu */
public int currX;
/** Aktualna współrzędna y obiektu */
public int currY;
/** Szerokość ikony obiektu */
public int width;
/** Wysokość ikony obiektu */
public int height;
/** Krok przesunięcia obiektu z góry do dołu*/
public int dy;
public int rodzajbomby;
/** Szerokość pola graficznego*/
public int sWidth;
/** Wysokość pola graficznego*/
public int sHeight;
/** Czy trafiono bombe */
public boolean hit;
/** Ikona obiektu - bomby */
public Image icon;
public void calculatePathPos(int mode)
{
int tmpX=0;
currY=currY+dy;
if(currY>sHeight)
{
currY=0;
}
tmpX=0;
currX=x+tmpX;
}//calculatePathPos()
Funkcja mode służy do określenia czy obiekt(bomba) się porusza, czy też nie(0-1). Próbowałem zmienić typ MoveMode na boolean z inta, ale to nic nie daje.
Ogólnie błąd jest przy funkcji rysowania, czyli:
/* Zmienne */
public int shiftBL;
public status gStatus;
public int barHeight;
/* Tablica obiektów pierwszego planu - bomby*/
private Fallout [] fbomba;
private static final long serialVersionUID = 1L;
/** Szerokość pola graficznego gry*/
public int sWidth;
/** Wysokość pola graficznego gry*/
public int sHeight;
/** Liczba obiektów w linii */
public int objectsInLine=4;
public status gstatus;
public cannon pcannon;
//i funkcja
protected void paintComponent(Graphics gs)
{
Graphics2D g=(Graphics2D)gs;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.drawImage(param.bgImage, 0, 0, null);
//g.drawImage(param.cannon,pozx-110,545,null);
for(int i=0;i<fbomba.length;i++)
{
fbomba[i].calculatePathPos(param.MoveMODE);
if(!fbomba[i].hit)
g.drawImage
(
fbomba[i].icon,
fbomba[i].currX,
sHeight-fbomba[i].currY,
(int)(fbomba[i].icon.getWidth(null)*(1.0-fbomba[i].currY/(double)sHeight)),
(int)(fbomba[i].icon.getHeight(null)*(1.0-fbomba[i].currY/(double)sHeight)),
null
);
}
Obrazki wczytuję osobną klasą:
public class param
{
public static int MoveMODE=1;
/** Zmienna pomocnicza określająca maksymalną liczę obiektów pierwszego planu */
public static int noOfObjects=12;
/** Szerokość pola graficznego gry */
public static int gWidth=1024;
/** Wysokość pola graficznego gry */
public static int gHeight=768;
public static Image[] bomba;
public static BufferedImage cannon;
public static void zaladujobrazy()
{
cannon= new BufferedImage(181, 158, BufferedImage.TYPE_INT_RGB);
File urlcannon= new File("img/dzialo.png");
try
{
cannon = ImageIO.read(urlcannon);
} catch (IOException e)
{
e.printStackTrace();
}
bomba= new Image[4];
bomba[0]=loadImage("images/bomba0.png");
bomba[1]=loadImage("images/bomba1.png");
bomba[2]=loadImage("images/bomba2.png");
bomba[3]=loadImage("images/bomba3.png");
bgImage=loadImage("img/screen.png");
menuImage=loadImage("img/pausescreen.png");
menuGameImage=loadImage("img/pausescreen.png");
cursorImage=loadImage("img/target.png");
}
public static Image loadImage(String fileName)
{
return new ImageIcon(fileName).getImage();
}
}