2013-04-04 3 views
0
import java.awt.*; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
public class Images extends JFrame { 
    public static void main(String[] args) { 
    DisplayMode dm = new DisplayMode(800,600,32, DisplayMode.REFRESH_RATE_UNKNOWN); 
    Images I = new Images(); 
    I.run(dm); 
} 

private Screen s; 
private Image bg; 
private Image pic; 
private boolean nLoaded; 
Animation a; 

    public void run(DisplayMode dm) 
    { 

     nLoaded = false; 
     s = new Screen(); 
     try{ 

       s.Setfullscreen(dm, this); 
       LoadPics(); 
       MovieLoop(); 
       try{ 
       Thread.sleep(50000);  
       }catch(Exception ex){} 
     }finally{ 
      s.restoreScreen(); 
     } 

    } 

    public void MovieLoop(){ 
     long startingtime = System.currentTimeMillis(); 
     long cumTime = startingtime; 

     while(cumTime-startingtime < 5000) 
     { 
      long timepassed = System.currentTimeMillis() - cumTime; 
      cumTime += timepassed; 

      a.update(timepassed); 

      Graphics g = s.getFullScreenWindow().getGraphics(); 
      draw(g); 
      g.dispose(); 

      try{ 
      Thread.sleep(20); 
      }catch(Exception ex){} 

     } 
    } 

    public void draw(Graphics g) 
    { 
     g.drawImage(bg, 0,0, null); 
     g.drawImage(a.getImage(),0,0,null); } 


    //Create Load Pictures 
    public void LoadPics() 
    { 
     bg = new ImageIcon("C:\\Gamepics\\BackgroundImage.jpg").getImage(); 
     pic = new ImageIcon("C:\\Gamepics\\SmileyIcon3.png").getImage(); 
     nLoaded = true; 
     repaint(); 


    } 


    public void paint(Graphics g){ 
     if(g instanceof Graphics2D){ 
      Graphics2D g2 = (Graphics2D)g; 
      g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     } 

     if(nLoaded) 
     { 
      g.drawImage(bg, 0, 0, null); 
      g.drawImage(pic, 300,300, null); 
     } 
    } 
} 

Im не понимая, что я сделал неправильно, я обошел все самое лучшее, что могу. Я просто практиковал простую анимацию, и я продолжаю получать 3 исключения нулевого указателя. Ive исследовал лучшее, что я могу, и, видимо, NullPointerExceptions в java связаны с попыткой получить размер нулевых массивов? Компилятор не помещал ни одного из моих списков в качестве проблем, поэтому я немного смутился. Любая помощь будет принята с благодарностью. Все ошибки закомментированы. Есть три из них, и они находятся в классе изображенияJava Lang nullpointer исключение в примере анимации?

Ошибки:

Exception in thread "main" java.lang.NullPointerException 
at Images.MovieLoop(Images.java:45) 
at Images.run(Images.java:26) 
at Images.main(Images.java:8) 

Анимация Класс

import java.awt.Image; 
import java.util.*; 
public class Animation { 

private ArrayList scenes; 
private int sceneindex; 
private long movietime; 
private long totaltime; 
//CONSTRUCTOR 
public Animation(){ 
    scenes = new ArrayList(); 
    totaltime =0; 
    start(); 

} 
//Add scene to array list and sets time for each scene 
//For example. If you have 3 scenes you would add t to total time three times. So if you had 
//3 Scenes, one for 1s, one for 2s, one for 3s. Total time would be 6s. and you would call addscene 3 times 
public synchronized void addScene(Image i, long t) 
{ 
    totaltime+=t; 
    scenes.add(new OneScene(i, totaltime)); 

} 
//start animation from beggininign inignngingingnig 
public synchronized void start(){ 
movietime = 0; 
sceneindex = 0; 
} 
//change scenes 


//movie time is the sum of all the time passed from last update 
//If you have more than one scene. timepassed gets added to movietime. 
//if movietime is greater than or equal to total time(ie. animation is complete) restart the animation 
public synchronized void update(long timepassed) 
{ 
    if(scenes.size() > 1){ 
     movietime += timepassed; 
     if(movietime >= totaltime) 
     { 
      movietime = 0; 
      sceneindex = 0; 

     } 
     while(movietime > getScene(sceneindex).endTime) 
     { 
      sceneindex++; 
     } 
    } 
} 

public synchronized Image getImage(){ 
    if(scenes.size() == 0){ 
     return null;} 
    else{ 
     return getScene(sceneindex).pic; 
    } 
} 
//Getscene 
private OneScene getScene(int x){ 
    return (OneScene)scenes.get(x); 
} 
//Scenes are gonna be 
private class OneScene{ 
    Image pic; 
    long endTime; 

    public OneScene(Image pic, long endTime) 
    { 
     this.pic = pic; 
       this.endTime = endTime; 

    } 
} 
} 

Я включил класс анимации, потому что компилятор выдвигает на первый план эти три метода требует как источник проблемы

a.update(timepassed); 
    MovieLoop(); 
    I.run(dm); 
+2

Сообщите нам об ошибке –

+2

Добро пожаловать в StackOverflow! Чтобы другие могли найти ошибку, это помогло бы, если бы вы добавили stacktrace ваших сообщений об ошибках. – GameDroids

ответ

1

Please Примечание: Это очень длинный комментарий

Давайте начнем с Graphics g = s.getFullScreenWindow().getGraphics(); - getGraphics никогда не является хорошей идеей, это может вернуть null.

Вы НИКОГДА не пытаетесь обновить какой-либо компонент пользовательского интерфейса из любой другой другой EDT, и вы НИКОГДА не должны рисовать непосредственно на ней таким образом, вместо этого вы должны использовать paintComponent.

Вы должны НИКОГДА не должны dispose какого-либо Graphics контекста, который вы сами не создали, это предотвратит окраску других компонентов.

Вы должны избегать переопределения paint, особенно контейнера верхнего уровня, если не по какой-либо другой причине, это не двойной буфер (контейнер верхнего уровня), и вы также будете рисовать поверх любых других дочерних компонентов.

Отъезд Performing Custom Painting для более подробной информации.

Вы должны попробовать использовать ImageIO вместо ImageIcon. ImageIO будет генерировать исключения, если он не может прочитать файл, где ImageIcon просто терпит неудачу, не очень полезно.

+0

«Исключение в потоке "основного" java.lang.NullPointerException \t на Images.MovieLoop (Images.java:45) \t в Images.run (Images.java:26) \t на Images.main (Images.java: 8) ' – moonbeamer2234

+0

Я предполагаю, что это 'Графика g = s.getFullScreenWindow(). GetGraphics();' – MadProgrammer

+0

Фактически это дает ошибки из этих трех строк: – moonbeamer2234

Смежные вопросы