Java: Frage zur URL

Gadget2

PC-Selbstbauer(in)
Nabend, ich bastel Grad an einem neuen Java-Programm.

Habs nun auch geschafft Töne mit einzuspielen, das sieht dann wie folgt aus:

Code:
public void youLose() { //Absturzton
  try {
    URL u = new URL("file:/D:/INFO/INWO_JANUAER/Breakout003_meins/Game_Over.wav");

    clip = Applet.newAudioClip(u);
    clip.play();
  } catch (MalformedURLException e) {
      e.printStackTrace();
    }
}

Meine Farge ist nun, kann ich die URL auch irgendwie verallgemeinern ([...]/Breakout003_meins/Game_Over.wav)
  • weil zum einen kann meinem USB-Stick ja an jedem Rechner eine andere Systemvariable zugewiesen werden
  • und zum anderen zieht sich mein Info-Lehrer den Ordner Breakout sowieso auf seinen Rechner
  • alle Klassen und Audio Daten sind und bleiben aber in dem einen Ordner

Kann man jetzt irgendwie für alles was vor dem Ordner steht([...]) auch was Verallgemeinertes schreiben, so das sich Java selbst den richtigen Pfad sucht?

MfG
 
hm ja gut, wenn die ganze Gesichte nun auch einen eigenen Namen hat, vereinfacht das natürlich die Suche...

ändert aber leider nichts daran, dass mein bisheriges Java-Wissen nur in der Schule erlerntes beinhaltet!:schief:

mein Java Buch sagt mir zu dem Thema was von getCodeBase() und getDocumentBase(), ist aber nicht ersichtlich wie ich das an meinem Beispiel einsetze:(

Google sagt mir wieder was vom Anlegen einer JAR-Datei, in die die Audiodateien sollen:huh:

so wirklich bekomme ich's jedenfalls nicht hin, könnte man mir also vielleicht erklären wie das denn nun genau geht!
 
du gibst die pfade halt relativ zu der ausführenden datei an, oder bestimmst mit den Funktionen den Pfad und packstdas z.b. In einen string an den du dann noch etwas dran hängst.

Ich versteh ehrlich gesagt dein Problem jetzt nicht :ka:

Ist doch jetzt eigentlich alles klar oder nicht? :ugly:
 
hm nein sry leider versteh ich's noch nicht!:D:schief:

Gibt es dafür vielleicht mal ein Beispiel, wie ich das machen kann?

Bzw wie bestimme ich denn mit den Funktionen den Pfad und wie/was soll ich in einen String packen?:huh:
 
-.-

Ok, kleines Beispiel:

Dein Programm befindet sich direkt in D:
Du kannst dann entweder:
D:/INFO/INWO_JANUAER/Breakout003_meins/Game_Over.wav
schreiben, oder aber

./INFO/INWO_JANUAER/Breakout003_meins/Game_Over.wav

PS: kann auch sein, dass du das ./ weglassen musst am Anfang
Wenn sich dein Programm allerdings in D:/INFO/INWO_JANUAER befindet, dann würde der absolute Pfad immer noch
D:/INFO/INWO_JANUAER/Breakout003_meins/Game_Over.wav
lauten, aber der relative Pfad nun

./Breakout003_meins/Game_Over.wav

PS: hier halt wieder eventuell das ./ weg lassen
Sollte doch jetzt klar sein oder?
 
Code:
  public void youLose() { //Absturzton
    try {
      URL u = new URL("file:/D:/INFO/INWO_JANUAER/Breakout003_meins/Game_Over.wav");
      //URL u = new URL("Breakout003_meins/Game_Over.wav");
      //URL u = new URL("./Breakout003_meins/Game_Over.wav");
      //URL u = new URL("file:Breakout003_meins/Game_Over.wav");
      //URL u = new URL("file:./Breakout003_meins/Game_Over.wav");

      clip = Applet.newAudioClip(u);
      clip.play();
    } catch (MalformedURLException e) {
        e.printStackTrace();
      }
  }

ja soweit hatte ich das ja schon probiert, erfolglos!:huh:
...alle 4 auskommentierten Versionen habe ich probiert, spielt aber keinen Ton! -.-
 
Wird denn der catch Zweig ausgelöst?

Und vor allem, von wo aus wird dein Programm gestartet?

Das musst du schon bedenken.

Äh... Moment mal...

Ich hab grad nach Applet.newAudioClip gegoogelt, und da kommt mir dein Code doch SEHR verdächtig bekannt vor.
Könnte es vielleicht im Bereich des Möglichen liegen, das du schlicht vergessen hast clip zu deklarieren???

Also ein "Applet.newAudioClip clip" fehlt dir würde ich mal behaupten.

Da kann dann nämlich klarer weise nichts abgespielt werden.

Wenns das nicht ist, schau mal hier rein: newAudioClip(URL url) - java.applet.Applet - Java Examples

Ich vermute mal aber stark, dass du die Deklaration vergessen hast.
 
...nö läuft einfach ohne den einen Ton zu spielen weiter.

Gestartet wird von der MainFrame aus, zur Info, ich arbeite mit Java-Editor
hier mal der komplette Quelltext, falls das was hilft

Code:
import java.awt.*;
import java.awt.event.*;

/**
  *
  * Hauptfenster zur Demnonstraion der grundlegenden 2d-Graphik
  *
  * @version fn_1.1 vom 01.03.2012
  * @author Felix Koch & Nick Rauter
  * ©by henry.freye@mcgym.de
  */

public class MainFrame extends Frame {
  // Anfang Attribute
  Zeichenflaeche zf;
  Button b1;
  Panel p_main,p_links;
  TextField tf_z1,tf_n1,tf_l1;
  // Ende Attribute


  public MainFrame(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 900;
    int frameHeight = 600;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Panel cp = new Panel(new BorderLayout());
    Panel p1 = new Panel (new GridLayout(4,1)); //gesamtes linkes Feld
    Panel p2 = new Panel ();
    Panel p3 = new Panel (); //oberes kl.pinkes Feld mit Geschwindigkeits-TF
    Panel p4 = new Panel (); //mittleres kl.blaues Feld mit Button
    Panel p5 = new Panel (); //mittleres kl.pinkes Feld mit Zaehler-TF
    Panel p6 = new Panel (); //unteres kl.blaues Feld mit Level-TF
    Label l_z1 = new Label("Schwierigkeit");
    l_z1.setForeground(Color.BLUE);
    Label l_n1 = new Label("Punkte");
    l_n1.setForeground(Color.BLUE);
    Label l_l1 = new Label("Level");
    l_l1.setForeground(new Color( 255,130,171));
    tf_z1 = new TextField(10); //Geschwindigkeits-TF
    tf_n1 = new TextField(10); //Zaehler-TF
    tf_l1 = new TextField(10); //Level-TF
    b1 = new Button("Start");

    p2.setSize(500,550);
    tf_z1.setText("");
    tf_n1.setText("");
    p3.add(l_z1);
    p3.add(tf_z1);
    p5.add(l_n1);
    p5.add(tf_n1);
    p6.add(l_l1);
    p6.add(tf_l1);
    p4.add(b1);

    p1.setBackground(new Color( 255,130,171));
    //p2.setBackground(new Color(   255,192,203));
    p3.setBackground(new Color( 255,130,171));
    p4.setBackground(Color.BLUE);
    p5.setBackground(new Color( 255,130,171));
    p6.setBackground(Color.BLUE);

    p1.add(p3);
    p1.add(p4);
    p1.add(p5);
    p1.add(p6);
    Action a = new Action(this);
    
    b1.addActionListener(a);
    


    cp.add(p1,"West");
    zf = new Zeichenflaeche (this);
    cp.add(zf,"Center"); //nur rechtes Feld ist Zeichenflaeche/Spielfeld

    add(cp);
    // Anfang Komponenten

    // Ende Komponenten

    cp.addKeyListener(a);
    zf.addKeyListener(a);
    b1.addKeyListener(a); // Schlaeger laeuft von Anfang an ohne in Feld zu klicken
    setResizable(false);
    setVisible(true);
  }



  // Anfang Methoden
  // Ende Methoden

  public static void main(String[] args) {
    new MainFrame("Malen");
  }
}
Code:
import java.awt.event.*;

/**
 * @version fn_1.1 vom 01.03.2012
 * @author Felix Koch & Nick Rauter
 * ©by henry.freye@mcgym.de
 *
 */


public class Action implements ActionListener, KeyListener {
  public void keyPressed(KeyEvent ke){
    if(ke.getKeyCode()==37){ //linke Pfeiltaste
      myFrame.zf.nachLinks();
    }
    if(ke.getKeyCode()==39){ //rechte Pfeiltaste
      myFrame.zf.nachRechts();
    }
    //System.out.println("Pressed"+ke.getKeyCode());
  }
  public void keyReleased(KeyEvent ke){
  
    //System.out.println("Released"+ke.getKeyCode());
  }
  public void keyTyped(KeyEvent ke){
  
    //System.out.println("Typed"+ke.getKeyCode());
  }

  public MainFrame myFrame;
  
   public Action(MainFrame myFrame){
    this.myFrame = myFrame;
   }
  
  public void actionPerformed(ActionEvent ae) { //zeichne Ball im Geschwindigkeits-Level(s)
    int s=(int) new Integer (myFrame.tf_z1.getText()).intValue();
    /**
    * s-Wert=Eingabewert in Textfeld
    * getText holt den Eingabewert und übergibt ihn der Klasse "Zeichenflaeche"
    */
    //System.out.println("S="+s);
    myFrame.zf.zeichne(s);
   }
 }
Code:
import java.awt.*;

/**
 * @version fn_1.1 vom 01.03.2012
 * @author Felix Koch & Nick Rauter
 * ©by henry.freye@mcgym.de
 *
 */
public class Ball extends Thread {
  Zeichenflaeche zf;
  int s,x,y,d,dx,dy,zaehler;
  Graphics pinsel;
  
  public void run(){
    while (!isInterrupted()){
      pinsel = zf.getGraphics();
        pinsel.setColor(new Color ( 0,0,205));
        pinsel.fillOval(x,y,d,d);
        zf.pause(1); // Pause-->Ballgeschwindigkeit
        pinsel.setColor(Color.WHITE);
        pinsel.fillOval(x,y,d,d);
        //System.out.println(x+","+y);
        x += dx;
        y += dy;
          
        if (x < 0){dx = s; //Ball schlaegt links an->x-Werte steigen wieder
          this.zf.pongBande(); // Geraeusch wird bei Beruehrung des Spielfeldrandes gespielt
        }
        if (y < 0){dy = s;  //Ball schlaegt oben an->y-Werte steigen wieder
          this.zf.pongBande();
          zaehler++; // wenn Ball oben anschlaegt zaehlt Zaehler 1 Pkt.
          zf.mf.tf_n1.setText(""+zaehler);
          if(zaehler<10){
            zf.mf.tf_l1.setText(""+1); //unter 10 Punkten ist Level 1
          }
          if(zaehler>9&&zaehler<11){
            zf.mf.tf_l1.setText(""+2); //alle 10 zaehler.Punkte erhoeht sich die Level-Anzeige
            this.zf.levelUp(0);
          }
          if(zaehler>19&&zaehler<21){
            zf.mf.tf_l1.setText(""+3);
            this.zf.levelUp(0);
          }
          if(zaehler>29&&zaehler<31){
            zf.mf.tf_l1.setText(""+4);
            this.zf.levelUp(0);
          }
          if(zaehler>39&&zaehler<41){
            zf.mf.tf_l1.setText(""+5);
            this.zf.levelUp(0);
          }
        }
        if (x+d > zf.breite){dx = -s;
          this.zf.pongBande();
        } //Ball schlaegt rechts an->x-Werte sinken wieder
        if (y+d > zf.hoehe-20) { //wenn Ball auf Schaegerhöhe ist
          if (x>zf.x&&x<zf.x+zf.b){ //Pruefung ob Ball ueber dem Schlaeger ist(x-Werte)
            dy = -s; // wenn Ball ueber Schlaeger->y-Werte sinken wieder/sonst stopp
            this.zf.pongSchlaeger(); // Geraeusch wird bei Beruehrung des Schlaegers gespielt
          }else{
             this.zf.youLose(); //Game_Over-Geraeusch beim Verlieren des Balls
             this.zf.meldung(0); //Absturzmeldung beim Verlieren des Balls
             this.stop();
           }
        }
        if(x>150 - (d)&&x<500&&y==150 - d){ //Ball stoeßt von oben an Hindernis
          dy = -s;
          this.zf.pongBande();
        }
        if(x>149 - (d)&&x<501&&y==181){ //Ball stoeßt von unten an Hindernis
          dy = s;
          this.zf.pongBande();
        }
        if(y>150 - (d)&&y<181&&x==150 - d){ //Ball stoeßt von links an Hindernis
          dx = -s;
          this.zf.pongBande();
        }
        if(y>150 - (d)&&y<180&&x==501){ //Ball stoeßt von rechts an Hindernis
          dx = s;
          this.zf.pongBande();
        }
    }
  }
  
  public Ball(Zeichenflaeche zf, int s){
    this.zf = zf;
    this.s = s;
    x = 100;
    y = 100;
    d = 20; //Balldurchmesser
    dx = s;
    dy = -s;
    zaehler = 0;
  }
  public Ball(){
    this.zf = null;
    s = 1;
    x = 100;
    y = 100;
    d = 20; //Balldurchmesser
    dx = s;
    dy = -s;
    zaehler = 0;
  }
}
Die Audio-Dateien werden hier in der Zeichenfläche abgerufen!
Code:
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.MalformedURLException;
import java.net.URL;
import java.awt.*;
import java.awt.event.*;

/**
  *
  * Zeichenflaeche zur Demnonstraion der grundlegenden 2d-Graphik
  *
  * @version fn_1.1 vom 01.03.2012
  * @author Felix Koch & Nick Rauter
  * ©by henry.freye@mcgym.de
  */
public class Zeichenflaeche extends Canvas {
  int x, d, b, s;
  MainFrame mf;
  int hoehe, breite; 
  Color c;
  Ball ball;
  private AudioClip clip;
  
  public void zeichne(int s){
    Graphics pinsel=this.getGraphics();
    hoehe = this.getHeight();
    breite = this.getWidth();
    if(!ball.isAlive()){
      ball = new Ball(this, s);
      ball.start();
    }
    pinsel.setColor(Color.BLUE);
    pinsel.fillRect(x,hoehe-20,b,d);
  }
  
  public void meldung(int x){ //Absturzmeldung
    Graphics pinsel=this.getGraphics();
    hoehe = this.getHeight();
    breite = this.getWidth();
    int fontSize = 50;
    while(x<3){
      x++;
      pinsel.setFont(new Font("TimesRoman", Font.PLAIN, fontSize));
      pinsel.setColor(Color.BLUE);
      pinsel.drawString("You lose!",230,270);
      this.pause(90);
      pinsel.setFont(new Font("TimesRoman", Font.PLAIN, fontSize));
      pinsel.setColor(Color.WHITE);
      pinsel.drawString("You lose!",230,270);
      this.pause(30);
    }
  }

  public void youLose() { //Absturzton
    try {
      URL u = new URL("file:/D:/INFO/INWO_JANUAER/Breakout003_meins/Game_Over.wav");
      //URL u = new URL("Breakout003_meins/Game_Over.wav");

      clip = Applet.newAudioClip(u);
      clip.play();
    } catch (MalformedURLException e) {
        e.printStackTrace();
      }
  }
  
  public void levelUp(int l) { //Signal bei Erreichen des naechsten Levels
    if(l<1){
      l++;
      try {
        URL u = new URL("file:/D:/INFO/INWO_JANUAER/Breakout003_meins/Power_Up.wav");

        clip = Applet.newAudioClip(u);
        clip.play();
      } catch (MalformedURLException e) {
          e.printStackTrace();
        }
    }
  }

  public void pongSchlaeger() { //Geraeusch wenn der Ball den Schlaeger beruehrt
    try {
      URL u = new URL("file:/D:/INFO/INWO_JANUAER/Breakout003_meins/PONG_Schlaeger.wav");

      clip = Applet.newAudioClip(u);
      clip.play();
    } catch (MalformedURLException e) {
        e.printStackTrace();
      }
  }
  
  public void pongBande() {  //Geraeusch wenn der Ball die Bande beruehrt
    try {
      URL u = new URL("file:/D:/INFO/INWO_JANUAER/Breakout003_meins/pong_Bande.wav");

      clip = Applet.newAudioClip(u);
      clip.play();
    } catch (MalformedURLException e) {
        e.printStackTrace();
      }
  }

  public Zeichenflaeche(MainFrame mf){
      x=200; //x-Wert bei dem der Schlaeger beim Start gezeichnet wird
      d=10; //Höhe vom Schlaeger
      b=200; //Schlaegerbreite
      s=30; //Schlaeger bewegt sich pro Tastendruck s-Pixel nach links/rechts
      this.mf=mf;
      int frameWidth = 600;
      int frameHeight = 580;
      setSize(frameWidth, frameHeight);
      ball = new Ball ();
  }
  
  public void paint(Graphics pinsel){ //tuerkises Hindernis
    pinsel.setColor(Color.CYAN);
    pinsel.fillRect(150,150,350,30);
    pinsel.setColor(Color.BLACK);
    pinsel.drawRect(150,150,350,30);
  }
  
  public void nachRechts(){ //Schlaeger nach rechts bewegen
    Graphics pinsel = getGraphics();
    int hoehe = getHeight();
    int breite = getWidth();
    if(x+b<breite){ //wenn Schlaeger nicht am rechten Rand weiter zeichnen sonst stopp
      pinsel.setColor(Color.WHITE);
      pinsel.fillRect(x,hoehe-20,b,d);
      if(ball.zaehler>=10&&ball.zaehler<20){ //wenn 10 Punkte erreicht erhöht sich die Schlaeger-Geschwindigkeit
        x +=s+10;}else{x +=s;}
      if(ball.zaehler>=20&&ball.zaehler<30){ //wenn 20 Punkte erreicht erhöht sich die Schlaeger-Geschwindigkeit
        x +=s+30;
      }
      if(ball.zaehler>=30&&ball.zaehler<40){ //wenn 30 Punkte erreicht erhöht sich die Schlaeger-Geschwindigkeit
        x +=s+30;
      }
      if(ball.zaehler>=40){ //wenn 40 Punkte erreicht erhöht sich die Schlaeger-Geschwindigkeit
        x +=s+40;
      }
      //x +=s;
      pinsel.setColor(Color.RED);
      pinsel.fillRect(x,hoehe-20,b,d);
    }
  }

  public void nachLinks(){  //Schlaeger nach links bewegen
    Graphics pinsel = getGraphics();
    int hoehe = getHeight();
    int breite = getWidth();
    if(x>0){ //wenn Schlaeger nicht am linken Rand weiter zeichnen sonst stopp
      pinsel.setColor(Color.WHITE);
      pinsel.fillRect(x,hoehe-20,b,d);
      if(ball.zaehler>=10&&ball.zaehler<20){ //wenn 10 Punkte erreicht erhöht sich die Schlaeger-Geschwindigkeit
        x -=s+10;}else{x -=s;}
      if(ball.zaehler>=20&&ball.zaehler<30){ //wenn 20 Punkte erreicht erhöht sich die Schlaeger-Geschwindigkeit
        x -=s+20;
      }
      if(ball.zaehler>=30&&ball.zaehler<40){ //wenn 30 Punkte erreicht erhöht sich die Schlaeger-Geschwindigkeit
        x -=s+30;
      }
      if(ball.zaehler>=40){ //wenn 40 Punkte erreicht erhöht sich die Schlaeger-Geschwindigkeit
        x -=s+40;
      }
      //x -=s;
      pinsel.setColor(Color.BLUE);
      pinsel.fillRect(x,hoehe-20,b,d);
    }
  }
  
  public void pause(int i) {
    try {
      int l = 5;
      if(ball.zaehler>=10&&ball.zaehler<20){ //wenn 10 Punkte erreicht erhöht sich die Ballgeschwindigkeit
        l = l-1;
      }
      if(ball.zaehler>=20&&ball.zaehler<30){ //wenn 20 Punkte erreicht erhöht sich die Ballgeschwindigkeit
        l = l-2;
      }
      if(ball.zaehler>=30&&ball.zaehler<40){ //wenn 30 Punkte erreicht erhöht sich die Ballgeschwindigkeit
        l = l-3;
      }
      if(ball.zaehler>=40){ //wenn 40 Punkte erreicht erhöht sich die Ballgeschwindigkeit
        l = l-4;
      }
      Thread.sleep(i*l); //Pause-->Ballgeschwindigkeit
    } catch (InterruptedException e) {
        e.printStackTrace();
      }
    Thread.yield();
  }
  
  //Zufallszahl 0..e
  public int zufall(int e){
    return (int) Math.floor(Math.random()*e);
  }
  //Zufallszahl a..e
  public int zufall(int a, int e){
    return (int) Math.floor(Math.random()*(e-a+1)+a);
  }
  //Zufallsfarbe
  public Color zufallsColor(){
    return new Color(zufall(255),zufall(255),zufall(255));
  }
}

naja ich hab
Code:
clip = Applet.newAudioClip(u);
oder wie/wo soll ich da was deklarieren?
 
Zurück