Bilder und Töne in .jar datei einbinden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bilder und Töne in .jar datei einbinden

    Alsooo

    Da wir im Unterricht grad 2D-arrays machen hab ich mir mal n Spiel zusammengecodet ...
    Läuft so weiter super und is auch ganz nett, basiert auf nem ziemlich einfachen Prinzip,
    2 Spieler (einer gesteuert mit WSAD und einer mit IJKL) rennen durch ein Labyrinth und
    der eine muss den anderen fangen, des Ziel des anderen ist es durch einen Ausgang ins nächste Level zu entkommen.
    Jetzt will ich das ganz als .jar archiv speichern. Gibt auch keinen Fehler oder so nur zeigt er wenn ichs dann start
    kein Bild an und spielt auch keinen Ton obwohl die Dateien im richtigen verzeichniss in der -jar datei liegen

    Der Quellcode is leider zu lang um ihn hier zu posten, aber Hier ! gibs den Link zum Ordner.
    und Hier ! die Bibliotheken.
    Hier mal die nicht-funktionierende exportierte Version:

    Vllt hat einer schon Erfahrung mit dem Problem oder einem ähnlichen Problem ... kann mir eigtl. keinen Grund vorstellen warums nich geht

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von möP ()

  • Sorry, ich habe jetzt nicht so viel Zeit in dein Programm zu schauen.
    Dein Problem kenne ich und ich habe es auch schon gehabt. Es ist allerdings schon eine Weile her.

    Soweit ich mich erinnere mussten die zusätzlichen Dateien mit in das JAR-File. Die Class-Klasse hat eine Methode getResource() bzw. getResourceAsStream(), die relativ von der Position der Klassen-Datei im Dateisystem eine andere Datei ansprechen können.

    Quellcode

    1. MeineHauptKlasse.class.getResource("bild.jpg");

    Diese solltest du verwenden um deine Datei zu adressieren (erstmal nur so, ohne JAR-File).

    Achte darauf, dass die Dateien auch alle vom source-Verzeichnis ins class-Verzeichnis kopiert werden. Beim ausführen werden natürlich die class-Files ausgeführt und deswegen müssen die Dateien relativ von diesen possitioniert werden.

    Wenn das erst einmal klappt, dann sollte es auch mit der JAR funktionieren.
  • Ich habs ausprobiert ... die Bilder sind in der .jar datei, aber er zeigt sie einfach nicht an, könnt mir vorstellen das es an der vorprogrammierten Ereignisstruktur liegt.
    In die kann man nämlich nur Klasse aus demselben Paket einbinden, die anderen Pakete scheinen irgendwie nicht kompatibel zu sein und die Bibliotek (sum.multimedia.*)
    gehört da halt nicht zu, hab aber nicht vollkommen getestet kann sein das es bei einigen klassen doch geht ...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von möP ()

  • mhh ...
    Es gibt eine Hauptklasse von allen Anwendung und in der sind abstrakte Methoden die dann von der Unterklasse überschrieben werden.
    Und in der Hauptklasse läuft die ganze Zeit eine Schleife ab bis eine boolean variable erfüllt is. Und in der Schleife gibs für die Ereignisse Bedingungen:
    z.B. für Wenn man die Muas klickt oder die Maus loslässt oder ne Taste drückt.
    Sieht dann ungefähr so aus :

    Quellcode

    1. public void fuehreAus()
    2. {
    3. do
    4. {
    5. if(this.maus().istGedrueckt() && !MausUnten)
    6. {
    7. MausUnten = true;
    8. this.bearbeiteMausDruck(this.maus().hPosition(),this.maus().vPosition());
    9. }
    10. else
    11. {
    12. if(!this.maus().istGedrueckt() && MausUnten)
    13. {
    14. MausUnten = false;
    15. this.bearbeiteMausLos(this.maus().hPosition(),this.maus().vPosition());
    16. }
    17. else
    18. {
    19. if(this.maus().doppelKlick())
    20. {
    21. this.bearbeiteMausDoppelKlick(this.maus().hPosition(),this.maus().vPosition());
    22. }
    23. else
    24. {
    25. if(this.maus().hPosition() != zX || this.maus().vPosition() != zY)
    26. {
    27. this.bearbeiteMausBewegt(this.maus().hPosition(),this.maus().vPosition());
    28. zX = this.maus().hPosition();
    29. zY = this.maus().vPosition();
    30. }
    31. else
    32. {
    33. if(this.tastatur().wurdeGedrueckt())
    34. {
    35. this.bearbeiteTaste(this.tastatur().zeichen());
    36. this.tastatur().weiter();
    37. }
    38. else
    39. {
    40. this.idle();
    41. }
    42. }
    43. }
    44. }
    45. }
    46. }while(zArbeit != false);
    47. }
    Alles anzeigen

    und diese Ereignisse werden dann an die Ereignisbearbeiter (die Oberklasse für alle Knöpfe und sowas) geschickt die senden dann über einen Ereignissverteiler (für jeden Bearbeiter gibs einen neuen)
    gesendet.
    Ungefähr so :

    Quellcode

    1. public void bearbeiteMausDruck(double pH,double pV) // Diese Methode wird in den Anwendung aufgerufen;
    2. {
    3. keb.bearbeiteMausDruck(pH,pV); // Dann wird der der zu dem Verteiler gehörige Bearbeiter ausgelöst;
    4. if(ev != null)
    5. {
    6. ev.bearbeiteMausDruck(pH,pV); // Hier wird das Ereignis an den nächsten Bearbeiter weitergereicht;
    7. }
    8. }

    In der Biblioteck gibs noch mehr wie fokus oder sowas, und irgendwie ham die das anders gemacht ...
    Wenne wills kann ich dir die version die wir inner Schule gemacht haben mal hochladen.

    Zu getResource
    Es gibt ne Klasse Bild mit der methode ladeBild(String pPfad) und ich denk mal das der des automatisch machn wird.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von möP ()

  • Dann ist die Begrifflichkeit einer Ereignisstruktur auch nicht falsch. :) Ihr habt ja scheinbar eine GUI-Bibliothek nachgebaut. Durftet ihr AWT oder Swing nicht verwenden? Da gibt es Events und die zugehörigen Eventlistener für diverse Anwendungsfälle bereits. Aber egal, das ist nicht das Problem.
    Was macht denn die Methode ladeBild(); Offenbar funktioniert sie in der JAR-Datei nicht. Höchstwahrscheinlich, weil sie dann auf einmal nichts mehr mit dem Pfad anfangen kann. Wäre sehr nützlich da mal rein zu schauen. Wenn es closed source ist, dann kannst du sie ja einmal mit dem Programm "jad" (für Eclipse gibt es auch das Plugin JadClipse) decompilieren. Liegt es wirklich an der Methode, dann muss man sie eventuell überschreiben. Was liefert sie denn für ein Objekt zurück?
  • Ich hab mal ein kleinen Programm geschrieben:

    Quellcode

    1. public class Main
    2. {
    3. public static void main(String[] args)
    4. {
    5. System.out.println(Main.class.getResource("test.txt"));
    6. }
    7. }


    Im selben Verzeichnis wie die Main-Klasse liegt auch die "test.txt".

    Wenn ich das Programm einfach starte ohne es vorher in eine Jar zu packen kommt als Ausgabe:

    Quellcode

    1. file:/home/hafner/workspace/Test/test.txt

    (bedenke das ich Linux habe, deswegen kein C:\... etc.)

    Wenn ich das Programm in eine Jar packe dann kommt:

    Quellcode

    1. jar:file:/home/hafner/Desktop/test.jar!/test.txt


    Es ist also möglich mit getResource() eine Datei in einem JAR-File ausfindig zu machen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Hafner ()

  • Versuche mal so etwas

    Quellcode

    1. try
    2. {
    3. URL url = SuMProgramm.class.getResource("sounds/step.wav");
    4. hatTon_SPo_step.ladeTon(new File(url.toURI()).getAbsolutePath());
    5. }
    6. catch (URISyntaxException e)
    7. {
    8. throw new RuntimeException(e);
    9. }

    statt

    Quellcode

    1. hatTon_SPo_step.ladeTon("sounds\\step.wav");


    Auch unter Windows müsste das mit dem Slash klappen. Ich konnte es leider nicht ausprobieren, da dein Programm bei mir nicht läuft.

    Ach ja, die ladeTon()-Methode macht das hier:

    Quellcode

    1. public boolean ladeTon(String pDatei)
    2. {
    3. File soundFile = new File(pDatei);
    4. AudioInputStream audioInputStream = null;
    5. try
    6. {
    7. audioInputStream = AudioSystem.getAudioInputStream(soundFile);
    8. }
    9. catch(Exception e)
    10. {
    11. System.out.println(e.toString());
    12. e.printStackTrace();
    13. return false;
    14. }
    15. hatFormat = audioInputStream.getFormat();
    16. int bufferSize = (int)hatFormat.getSampleRate() * hatFormat.getFrameSize();
    17. byte buffer[] = new byte[bufferSize];
    18. hatOutStream = new ByteArrayOutputStream();
    19. try
    20. {
    21. int nBytesRead = 0;
    22. do
    23. {
    24. if(nBytesRead == -1)
    25. break;
    26. nBytesRead = audioInputStream.read(buffer, 0, buffer.length);
    27. if(nBytesRead > 0)
    28. hatOutStream.write(buffer, 0, nBytesRead);
    29. } while(true);
    30. hatOutStream.close();
    31. }
    32. catch(Exception e)
    33. {
    34. System.out.println(e.toString());
    35. e.printStackTrace();
    36. return false;
    37. }
    38. return true;
    39. }
    Alles anzeigen