2013-11-22 3 views
0

Я пытаюсь воспроизвести звуки в своей игре, например, когда я нажимаю клавишу ВВЕРХ, чтобы услышать звук лазерного огня, но я получаю сообщение об ошибке, и я не понимаю почему. Скорее всего, я назвал код неправильным в моем методе, или я неправильно понял источник.Звуки на Java. Ошибки

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Could not initialize class SpaceInvadersPanel$SoundEffect 
at SpaceInvadersPanel$4.keyPressed(SpaceInvadersPanel.java:69) 
at java.awt.Component.processKeyEvent(Unknown Source) 
at javax.swing.JComponent.processKeyEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$200(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

-

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Color; 
import javax.sound.sampled.*; 
import java.io.*; 
import java.net.URL; 
import java.applet.*; 
import java.awt.*; 
import java.io.File; 
import java.net.MalformedURLException; 


public class SpaceInvadersPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private Timer timer; 
    private Player1 player1; 
    private Player1weapon player1weapon; 
    private Player2 player2; 
    private Player2weapon player2weapon; 
    public Image background; 
    public ImageIcon bg; 
    int width, height; 

    public SpaceInvadersPanel() { 
     bg = new ImageIcon("src/resources/BG.png"); 
     background = bg.getImage(); 
     ActionListener action = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       if (player1 != null && player2 != null) { 
        player1.updateForNewFrame(); 
        player1weapon.updateForNewFrame(); 
        player2.updateForNewFrame(); 
        player2weapon.updateForNewFrame(); 
       } 
       repaint(); 
      } 
     };//end Actionlistener() 

     timer = new Timer(10, action); 

     addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent evt) { 
       requestFocus(); 
      } 
     }); 

     addFocusListener(new FocusListener() { 
      public void focusGained(FocusEvent evt) { 
       timer.start(); 
       repaint(); 
      } 
      public void focusLost(FocusEvent evt) { 
       timer.stop(); 
       repaint(); 
      } 
     }); 

     addKeyListener(new KeyAdapter() { 
      public void keyPressed(KeyEvent evt) { 
       int code = evt.getKeyCode(); 

       if (code == KeyEvent.VK_LEFT) { 
        player1.centerX -= 10; 
       } 
       if (code == KeyEvent.VK_RIGHT) { 
        player1.centerX += 10; 
       } 
       if (code == KeyEvent.VK_UP) { 
        if (!player1weapon.isFalling) 
         player1weapon.isFalling = true; 
        SoundEffect.SHOOT.play(); 
       } 

       if (code == KeyEvent.VK_A) { 
        player2.centerX -= 10; 
       } 
       if (code == KeyEvent.VK_D) { 
        player2.centerX += 10; 
       } 
       if (code == KeyEvent.VK_S) { 
        if (!player2weapon.isFalling) 
         player2weapon.isFalling = true; 
        SoundEffect.SHOOT.play(); 
       } 
      }//end KeyPressed() 
     });//end KeyAdapter() 
    }//end SpaceInvadersPanel 


    public void paintComponent(Graphics g) { 
     g.drawImage(background,0,0,700,700,null); 
      if (player1 == null && player2 == null) { 
      width = 700; 
      height = 700; 
      player1 = new Player1(); 
      player2 = new Player2(); 
      player1weapon = new Player1weapon(); 
      player2weapon = new Player2weapon(); 
     } 

     if (hasFocus()) 
      g.setColor(Color.BLACK); 
     else { 
      g.setColor(Color.GREEN); 
      g.drawString("CLICK TO START THE GAME", 270, 350); 
      g.drawString("Player1", 550, 500); 
      g.drawString("Right arrow - Move Right", 550, 515); 
      g.drawString("Left arrow - Move Left", 550, 530); 
      g.drawString("Up arrow - Fire", 550, 545); 
      g.drawString("Player2", 50, 150); 
      g.drawString("D key - Move Right", 50, 165); 
      g.drawString("A key - Move Left", 50, 180); 
      g.drawString("S key - Fire", 50, 195); 
     } 
     player1weapon.draw(g); 
     player2weapon.draw(g); 
     player1.draw(g); 
     player2.draw(g);  

} // end paintComponent() 

    public enum SoundEffect { 
      SHOOT("sounds/Laser.wav");  // bullet 

      // Nested class for specifying volume 
      public static enum Volume { 
       MUTE, LOW, MEDIUM, HIGH 
      } 

      public static Volume volume = Volume.LOW; 

      // Each sound effect has its own clip, loaded with its own sound file. 
      private Clip clip; 

      // Constructor to construct each element of the enum with its own sound file. 
      SoundEffect(String soundFileName) { 
       try { 
       // Use URL (instead of File) to read from disk and JAR. 
       URL url = this.getClass().getClassLoader().getResource(soundFileName); 
       // Set up an audio input stream piped from the sound file. 
       AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); 
       // Get a clip resource. 
       clip = AudioSystem.getClip(); 
       // Open audio clip and load samples from the audio input stream. 
       clip.open(audioInputStream); 
       } catch (UnsupportedAudioFileException e) { 
       e.printStackTrace(); 
       } catch (IOException e) { 
       e.printStackTrace(); 
       } catch (LineUnavailableException e) { 
       e.printStackTrace(); 
       } 
      } 

      // Play or Re-play the sound effect from the beginning, by rewinding. 
      public void play() { 
       if (volume != Volume.MUTE) { 
       if (clip.isRunning()) 
        clip.stop(); // Stop the player if it is still running 
       clip.setFramePosition(0); // rewind to the beginning 
       clip.start();  // Start playing 
       } 
      } 

      // Optional static method to pre-load all the sound files. 
      static void init() { 
       values(); // calls the constructor for all the elements 
      } 
     } 


    public class Player1{ 
     int centerX, centerY; 
     int width, height; 
     int explosionFrameNumber; 
     int score = 0; 
     boolean isExploding; 
     public Image p1; 
     public ImageIcon p1stock; 
     public Image explodep1; 
     public ImageIcon explodep1icon; 

     Player1() { 
      centerX = 500; 
      centerY = 600; 
      isExploding = false; 
     } 

     void updateForNewFrame() { 
      if (isExploding) { 
        explosionFrameNumber++; 
        if (explosionFrameNumber == 15) { 
         width = 700; 
         centerX = (int)(width*Math.random()); 
         centerY = 600; 
         isExploding = false; 
        } 
       } 
      if(centerX <= -30) 
       centerX = -10; 
      else if(centerX > 640) 
       centerX = 630; 
     }//end updateForNewFrame 

     void draw(Graphics g) { 
      p1stock = new ImageIcon("src/resources/player1.png"); 
      p1 = p1stock.getImage(); 
      explodep1icon = new ImageIcon("src/resources/explosion.png"); 
      explodep1 = explodep1icon.getImage(); 
      g.setColor(Color.RED); 
      g.drawString("Score: " + score, 20, 450); 
      g.drawImage(p1, centerX, centerY, p1.getWidth(null), p1.getHeight(null),null); 
      if (isExploding) { 
       g.drawImage(explodep1, centerX - 4*explosionFrameNumber + 40, centerY - 2*explosionFrameNumber + 10, 
          8*explosionFrameNumber, 4*explosionFrameNumber,null); 
      } 
     }//end draw() 

    }//end Player1 


    public class Player2{ 
     int centerX, centerY; 
     int width, height; 
     boolean isExploding; 
     int explosionFrameNumber; 
     int score = 0; 
     public Image p2; 
     public Image explodep2; 
     public ImageIcon p2stock; 
     public ImageIcon explodep2icon; 

     Player2() { 
      centerX = 50; 
      centerY = 30; 
      isExploding = false; 
     } 

     void updateForNewFrame() { 
      if (isExploding) { 
       explosionFrameNumber++; 
       if (explosionFrameNumber == 15) { 
        isExploding = false; 
        width = 700; 
        centerX = (int)(width*Math.random()); 
        centerY = 30; 
       } 
      } 
      if(centerX <= -30) 
       centerX = -10; 
      else if(centerX > 640) 
       centerX = 630; 
     }//end updateForNewFrame() 

     void draw(Graphics g) { 
      p2stock = new ImageIcon("src/resources/player2.png"); 
      p2 = p2stock.getImage(); 
      explodep2icon = new ImageIcon("src/resources/explosion.png"); 
      explodep2 = explodep2icon.getImage(); 
      g.setColor(Color.RED); 
      g.drawString("Score: " + (score), 20, 250); 
      g.drawImage(p2, centerX, centerY, p2.getWidth(null), p2.getHeight(null),null); 
      if (isExploding) { 
       g.drawImage(explodep2, centerX - 4*explosionFrameNumber + 40, centerY - 2*explosionFrameNumber + 10, 
          8*explosionFrameNumber, 4*explosionFrameNumber,null); 
      } 
     }//end draw() 

    } //end Player2 


    public class Player1weapon{ 
     int centerX, centerY; 
     boolean isFalling; 
     public Image laserp1; 
     public ImageIcon lp1icon; 


     public Player1weapon() { 
      isFalling = false; 
     } 

     void updateForNewFrame() { 
      if (isFalling) { 
       if (centerY < player2.centerY - 50) { 
        isFalling = false; 
       } 
       else 
        if (Math.abs(centerX - player2.centerX - 40) <= 30 && Math.abs(centerY - player2.centerY + 35) <= 70) { 
         player2.isExploding = true; 
         player2.explosionFrameNumber = 1; 
         isFalling = false; 
         player1.score+=10; 
        } 
        else 
         centerY -= 20; 
      }//end if 
     }//end updateForNewFrame() 

     void draw(Graphics g) { 
      lp1icon = new ImageIcon("src/resources/laserplayer1.png"); 
      laserp1 = lp1icon.getImage(); 
      if (!isFalling) { 
       centerX = player1.centerX + 37; 
       centerY = player1.centerY + 23; 
      } 
      g.drawImage(laserp1, centerX, centerY - 8, laserp1.getWidth(null), laserp1.getHeight(null),null); 
     }//end Draw() 

    }//end player1weapon 


    public class Player2weapon{ 
      int centerX, centerY; 
      boolean isFalling; 
      public Image laserp2; 
      public ImageIcon lp2icon; 

      public Player2weapon() { 
       isFalling = false; 
      } 

      void updateForNewFrame() { 
       if (isFalling) { 
        if (centerY > player1.centerY + 50) { 
         isFalling = false; 
        } 
        else 
         if (Math.abs(centerX - player1.centerX) <= 20 && Math.abs(centerY - player1.centerY + 20) <= 20) { 
          player1.isExploding = true; 
          player1.explosionFrameNumber = 1; 
          isFalling = false; 
          player2.score+=10; 
         } 
         else 
          centerY += 20; 
       }//end if 
      }//end updateForNewFrame() 

      void draw(Graphics g) { 
       lp2icon = new ImageIcon("src/resources/laserplayer2.png"); 
       laserp2 = lp2icon.getImage(); 
       if (!isFalling) { 
        centerX = player2.centerX + 1; 
        centerY = player2.centerY + 15; 
       } 
       if (isFalling) { 
        g.drawImage(laserp2, centerX + 36, centerY - 8, laserp2.getWidth(null), laserp2.getHeight(null),null); 
       } 
      }//end Draw() 

     }//end player2weapon 


    /*public class Asteroid{ 
     int centerX, centerY; 
     boolean isFalling; 
     public Image asteroid; 
     public ImageIcon icon; 

     public Asteroid() { 
      isFalling = false; 
      icon = new ImageIcon("src/resources/laserplayer2.png"); 
      asteroid = icon.getImage(); 
     } 

     void updateForNewFrame() { 
      if (isFalling) { 
       if (centerY > player1.centerY + 50) { 
        isFalling = false; 
       } 
       else 
        if (Math.abs(centerX - player1.centerX) <= 20 && Math.abs(centerY - player1.centerY + 20) <= 20) { 
         player1.isExploding = true; 
         player1.explosionFrameNumber = 1; 
         isFalling = false; 
         player2.score+=10; 
        } 
        else 
         centerY += 50; 
      }//end if 
     }//end updateForNewFrame() 

     void draw(Graphics g) { 
      if (!isFalling) { 
       centerX = player2.centerX + 1; 
       centerY = player2.centerY + 15; 
       g.drawImage(asteroid, centerX + 36, centerY - 8, asteroid.getWidth(null), asteroid.getHeight(null),null); 
      } 
      if (isFalling) { 
       g.drawImage(asteroid, centerX + 36, centerY - 8, asteroid.getWidth(null), asteroid.getHeight(null),null); 
      } 
     }//end Draw() 

    }//end asteroid*/ 

}//end SpaceInvadersPanel 
+0

Скорее всего, так вы могли бы включать в себя ваш код, пожалуйста? Это важная часть любого вопроса :) – Ryan

+2

Я вижу «java.lang.NoClassDefFoundError», пожалуйста, проверьте javadocs: http://docs.oracle.com/javase/7/docs/api/java/lang/NoClassDefFoundError. HTML. Возможно, вы не включили все необходимые библиотеки в путь к классам. – home

+0

@minitech Я добавил код. – MrSilent

ответ

1

The StackTrace точек, что класс не инициализируется, когда программа попыталась получить доступ к нему во время выполнения. В таком случае в стеке должно быть ExceptionInInitializerError. Если да, то вы можете поставить исключение или Throwable блок в SoundEffect конструктора, чтобы увидеть, что именно происходит не так:

catch (Exception e) { 
    e.printStackTrace(); 
} 

Для дальнейших сомнений, вы можете пройти через это - Debugging a NoClassDefFoundError

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