2017-02-03 5 views
-3

Правильное движение змеи работает нормально, но когда я нажал любую другую клавишу (вверх или вниз), чтобы изменить направление движения, он выдает ошибку, и змея не двигается. Ниже приведены ошибки:Движение змей в 2d-игре

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at GamePlay.paint(GamePlay.java:76) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210) 
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1272) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5158) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4969) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:831) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:814) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) 
    at javax.swing.RepaintManager.access$1200(RepaintManager.java:64) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class GamePlay extends JPanel implements KeyListener, ActionListener{ 
    private ImageIcon titleImage; 

    private int[] snakexlength= new int[750]; 
    private int[] snakeylength= new int[750]; 
    int lengthOfSnake= 3; 
    int moves=0; 


    private boolean left= false; 
    private boolean right= false; 
    private boolean up= false; 
    private boolean down= false; 

    private ImageIcon rightmouth; 
    private ImageIcon upmouth; 
    private ImageIcon downmouth; 
    private ImageIcon leftmouth; 

    private Timer timer; 
    private int delay= 100; 
    private ImageIcon snakeimage; 

    public GamePlay(){ 
     addKeyListener(this); 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 
     timer= new Timer(delay, this); 
     timer.start(); 

    } 

    public void paint(Graphics g){ 

     if(moves==0){ 
      snakexlength[2]=50; 
      snakexlength[1]= 75; 
      snakexlength[0]=100; 

      snakeylength[2]= 100; 
      snakeylength[1]=100; 
      snakeylength[0]= 100; 
      } 

     //draw title image border 
     g.setColor(Color.WHITE); 
     g.drawRect(25, 100, 851, 55); 

     //draw the title image 
     titleImage= new ImageIcon("snaketitle.jpg"); 
     titleImage.paintIcon(this, g, 25, 13); 

     //draw border for gameplay 
     g.setColor(Color.black); 
     g.drawRect(25, 75, 850, 575); 

     //draw background for the gameplay 
     g.setColor(Color.black); 
     g.fillRect(25,75,850,580); 

     rightmouth= new ImageIcon("rightmouth.png"); 
     rightmouth.paintIcon(this, g, snakexlength[0], snakeylength[0]); 

     for(int a=0; a<lengthOfSnake; a++){ 

      if(a==0 && down){ 
       downmouth.paintIcon(this, g, snakexlength[a], snakeylength[a]); 
      } 

      if(a==0 && up){ 
       upmouth.paintIcon(this, g, snakexlength[a], snakeylength[a]); 
      } 

      if(a==0 && right){ 
       rightmouth.paintIcon(this, g, snakexlength[a], snakeylength[a]); 
      } 

      if(a==0 && left){ 
       leftmouth.paintIcon(this, g, snakexlength[a], snakeylength[a]); 
      } 

      if(a!=0){ 
      snakeimage= new ImageIcon("snakeimage.png"); 
      snakeimage.paintIcon(this, g,snakexlength[a], snakeylength[a]) ; 
       } 
      } 


     g.dispose(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     timer.start(); 
     if(right){ 
      for(int r= lengthOfSnake-1; r>=0; r--){ 
       snakeylength[r+1]= snakeylength[r]; 
      } 
      for(int r=lengthOfSnake; r>=0; r--){ 
        if(r==0){ 
         snakexlength[r]= snakexlength[r]+25; 

        } 
        else{ 
        snakexlength[r]= snakexlength[r-1]; 

        } 

       if(snakexlength[r]> 850){ 
        snakexlength[r]= 25; 
       } 
      } 

      repaint(); 
     } 
      if(left){ 
       for(int r= lengthOfSnake-1; r>=0; r--){ 
        snakeylength[r+1]= snakeylength[r]; 
       } 
       for(int r=lengthOfSnake; r>=0; r--){ 
         if(r==0){ 
          snakexlength[r]= snakexlength[r]-25; 

         } 
         else{ 
         snakexlength[r]= snakexlength[r-1]; 

         } 

        if(snakexlength[r]> 25){ 
         snakexlength[r]= 850; 
        } 
       } 

       repaint(); 
      } 

      if(up){ 
       for(int r= lengthOfSnake-1; r>=0; r--){ 
        snakexlength[r+1]= snakexlength[r]; 
       } 
       for(int r=lengthOfSnake; r>=0; r--){ 
         if(r==0){ 
          snakeylength[r]= snakeylength[r]+25; 

         } 
         else{ 
         snakeylength[r]= snakeylength[r-1]; 

         } 

        if(snakeylength[r]< 75){ 
         snakeylength[r]= 625; 
        } 
       } 

       repaint(); 
      } 
      if(down){ 
       for(int r= lengthOfSnake-1; r>=0; r--){ 
        snakexlength[r+1]= snakexlength[r]; 
       } 
       for(int r=lengthOfSnake; r>=0; r--){ 
         if(r==0){ 
          snakeylength[r]= snakeylength[r]+25; 

         } 
         else{ 
         snakeylength[r]= snakeylength[r-1]; 

         } 

        if(snakeylength[r]> 625){ 
         snakeylength[r]= 75; 
        } 
       } 

       repaint(); 
      } 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode()== KeyEvent.VK_RIGHT){ 
      moves++; 
      right= true; 
      if(!left){ 
       right=true; 
      } 
      else{ 
       right= false; 
       left= true; 
      } 

     } 

     if(e.getKeyCode()== KeyEvent.VK_LEFT){ 
      moves++; 
      left= true; 
      if(!right){ 
       left=true; 
      } 
       else{ 
        left= false; 
        right= true; 
       } 
      up=false; 
      down=false; 
     } 
     if(e.getKeyCode()== KeyEvent.VK_UP){ 
      moves++; 
      up= true; 
      if(!down){ 
       up=true; 
      } 
      else{ 
       up= false; 
       down= true; 
      } 

      left=false; 
      right=false; 
     } 

     if(e.getKeyCode()== KeyEvent.VK_DOWN){ 
      moves++; 
      down= true; 
      if(!up){ 
       down=true; 
      } 
      else{ 
       down= false; 
       up= true; 
      } 

      left=false; 
      right=false; 
     } 


    } 
} 
+0

нет не о нулевом указателе исключение @ A –

+4

Вы только инициализируете один «ImageIcon», но вызываете «paintIcon» на 4 разных (по одному на направление). Превращение в ** Исключение в потоке «AWT-EventQueue-0» java.lang.NullPointerException ** Так что не говорите, что это не NPE .... – AxelH

+0

no ImageIcon был инициализирован 4 различными переменными –

ответ

1

Вы никогда не инициализировать другие текстуры

private ImageIcon upmouth; 
private ImageIcon downmouth; 
private ImageIcon leftmouth; 

добавить это:

rightmouth = new ImageIcon("rightmouth.png"); 
leftmouth= new ImageIcon("leftmouth.png"); 
upmouth = new ImageIcon("upmouth.png"); 
downmouth = new ImageIcon("downmouth.png"); 

желательно в вашем конструкторе, поэтому вы не загружаете изображения при каждом вызове paint().

+0

Позвольте мне попробовать ..... ok –

+0

он решил запрос, но движение змеи стало очень странным. тело змеи не следует за головой –

+0

@ gramsci_11 ну, это ошибка в вашей логике игры, но исключение NullPointerException исправлено. Попробуйте подключить отладчик и выполнить код шаг за шагом, наблюдая за всеми переменными, чтобы узнать, что происходит не так. –

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