2013-04-30 3 views
0

Я разместил это раньше, но это не совсем соответствует стандарту stackoverflow. Я очистил код и сформулировал свой вопрос немного больше, так что вот так:Как создать и использовать объект внутри внутреннего класса вложенного класса?

Я делаю игру с двумя игроками астероидов в апплете для проекта CS1. Я пытаюсь понять, как реализовать звуковые эффекты, используя методы, которые я могу вызвать в определенное время. Я нашел этот учебник (http://www.dreamincode.net/forums/topic/14083-incredibly-easy-way-to-play-sounds/) при выполнении этого, но у меня возникли проблемы с синтаксисом вложенного цикла.

Как создать объект «Звук» в классе Sound из другого класса (в моем случае, AsteroidsGame.java)?

Из-за беспорядочности кода учебника, здесь для улучшения читаемости.

//Import Statements 
import java.applet.*; 
import javax.swing.*; 
import java.io.*; 
import java.net.*; 

public class Audioapp extends JApplet 
{ 
public class Sound // Holds one audio file 
{ 
    private AudioClip song; // Sound player 
    private URL songPath; // Sound path 

    Sound(String filename) 
    { 
     try 
     { 
      songPath = new URL(getCodeBase(),filename); // Get the Sound URL 
      song = Applet.newAudioClip(songPath); // Load the Sound 
     } 
     catch(Exception e){} // Satisfy the catch 
    } 

    //Loops audio file 
    public void playSound() 
    { 
    song.loop(); 
    } 


    //Stops audio file 
    public void stopSound() 
    { 
    song.stop(); 
    } 


    //Plays audio file once 
    public void playSoundOnce() 
    { 
    song.play(); 
    } 

} //Closes Sound() 


    public void init() 
    { 
    Sound testsong = new Sound("song.mid"); 
    testsong.playSound(); 
    } 

} //Closes Audioapp() 

Edit 1: Просто вспомнил кто-то из последней нитки предложил мне после того, что это делает, когда я скомпилировать/запустить его. Эта .java сама по себе ничего не делает; но он действительно компилируется без ошибок при размещении с остальной частью моего проекта.

Редактировать 2: Большое спасибо Zim-Zam за вашу помощь, если кто-нибудь найдет эту тему и имеет такую ​​же проблему, проконсультируйтесь с его комментариями.

+1

FYI 'поймать (Exception е) {}' никогда не является хорошей идеей. –

+0

* «апплет для проекта CS1» * См. [Почему преподаватели CS перестают преподавать апплеты?] (Http://programmers.stackexchange.com/questions/196499/why-should-cs-teachers-stop-teaching-applets) –

+1

* ".. кто-то из последней темы .." * В этом случае, пожалуйста, в будущем отредактируйте свой вопрос, а не удалите его и запустите новый. Люди, которые предлагают советы, обычно не любят повторять себя. –

ответ

1

Я рекомендую вам изменить свой внутренний класс на public static class Sound - это позволит вам создавать экземпляры класса без необходимости использования экземпляра Audioapp.

Затем, чтобы создать экземпляр Sound, вы просто обрабатываете его так, как если бы его имя было Audioapp.Sound, например. Audioapp.Sound sound = new Audioapp.Sound()

Если внутренний класс не является статическим, то вы бы использовать Audioapp.Sound sound = audioApp.new Sound(), где audioapp является экземпляром Audioapp

+0

Первая рекомендация почти сработала, но я получаю «нестатический метод getCodeBase() не может ссылаться на статический контекст». Есть идеи? – RonaldRaygun

+0

Статический внутренний класс может ссылаться только на статические методы и поля в охватывающем классе - вам нужно либо изменить метод на статический, либо изменить класс на нестатический –

+0

Я изменил класс Sound обратно на нестатические, и затем пошел со своей второй рекомендацией. Тем не менее, я получаю «не могу найти символ», и он указывает на audioapp, который в вашем OP был экземпляром Audioapp. – RonaldRaygun