Schon. Aber warum sollte man sich ein thread-saves “Array” basteln, wenn es sowas schon gibt? Davon ab mag ich die Java-Array nicht und verwende eh lieber Collections.
[QUOTE=Crian]Schon. Aber warum sollte man sich ein thread-saves „Array“ basteln, wenn es sowas schon gibt? Davon ab mag ich die Java-Array nicht und verwende eh lieber Collections.[/QUOTE]:lol: Man kann sich keine Thread-Safe-Arrays bauen… Zu dem von mir erwähnten Mehraufwand gehört z.B. auch die Verwendung der von dir angeprochenen Collections und/oder das Erstellen von Array-/Collection-Copys in synchronisierten Blöcken.
Ich möchte hier mal nur so nebenbei auf die neuen Mediaklassen hinweisen, die mit JavaFX 2 Einzug in Java gehalten haben:
Klick!
Sich noch mit der Sound-API zu beschäftigen, um Geräusche in einem Spiel erklingen zu lassen, ist in meinen Augen kotlose Brunst, äh, brotlose Kunst. Wenn Du nicht vorhaben solltest, ein Sequencer-/Audioeditorprogramm zu schreiben, dann lass die Finger davon. Wie Du ja schon selbst feststellen musstest, läuft nicht jedes Audioformat auf jedem Rechner. Einige potentielle User werden also allein aus technischen Gründen nie in den Genuss deines Spiels kommen. Nur meine 2 Cent dazu.
@Hobelhai Was schlägst du vor?
Ich würde für Geräusche und Soundschnipsel die Klasse AudioClip nehmen. Für so einen Clip benötigst Du 3 Zeilen Code:
URL Resource = getClass().getResource("resources/Sound1.wav") //Spielt auch mp3
AudioClip clip1 = new AudioClip(resource.toString)
clip1.play();
Da Du wahrscheinlich in so einem Spiel einige Sounds benötigst, würde ich diese in einem Thread laden und mir in eine Collection (ArrayList bspw.) oder ein Array packen, wenn es nicht zu viele sind. Ansonsten immer nur die Sounds im Voraus laden, die für die gerade aktuelle Spielszene/-situation benötigt werden.
Die Edith fügt noch hinzu: Du kannst bei so einem Clip natürlich auch Dinge wie die Lautstärke und das Panning bestimmen, Du kannst sie stoppen oder pausieren lassen. Ich habe gerade noch festgestellt, dass der Link, den ich gepostet hatte, die komplette JavaFX-Api anzeigt. Ich wollte eigentlich speziell auf das Package javafx.scene.media hinweisen. Da sind die Soundsachen zu finden (und auch noch Video). Solltest Du Dir einfach mal anschauen, das Media-Package gehört zu den Einfacheren bei JavaFX.
[QUOTE=Hobelhai]Da Du wahrscheinlich in so einem Spiel einige Sounds benötigst, würde ich diese in einem Thread laden und mir in eine Collection (ArrayList bspw.) oder ein Array packen, wenn es nicht zu viele sind. Ansonsten immer nur die Sounds im Voraus laden, die für die gerade aktuelle Spielszene/-situation benötigt werden.[/QUOTE]Ok, ich weis jetzt nicht, wie das bei JavaFX ist, aber beim alten SoundAPI ists zumindest ratsam, dass nur die URLs zu den Sounds in Listen zu speichern (Im Gegensatz zu Bildern, wo es definitiv andersherum ist!) und zwar aus dem Grund, weil die WidergabeAPI ohnehin aus einem Stream encoded und aus diesem nur einzelne Frames benötigt werden. Deswegen den gesamten evtl. bereits vollständig gelesenen Stream im Speicher zu halten wäre nur Platzverschwendung. Anders sähe es natürlich bei Sequenz-Dateien aus (z.B. FastTracker-Mods). @Zombiepriester : Der von HobelHai verwendete AudioClip ist nicht jener aus „java.applet“!
@Hobelhai : Nächstes mal evtl. die imports dazu schreiben…
Ich ehrlich gesagt auch nicht. Ich persönlich handhabe das allerdings in 2 Anwendungen so, allerdings handelt es sich dabei nur um kurze, perkussive Sounds (< 1s), und davon auch nur 4 oder 5. Das funktioniert ganz gut. Das mit den imports werde ich mir merken, dann hätte ich mir nämlich auch den Hinweis auf das entsprechende package sparen können.
[QUOTE=Hobelhai]…allerdings handelt es sich dabei nur um kurze, perkussive Sounds (< 1s), und davon auch nur 4 oder 5…[/QUOTE]Was macht man denn mit solch kurzen Sounds? Sicher in 'nem Sequencer oder als Effekt abspielen. Das wäre auch in Ordnung so. Ich mach das mit besagten Pro-/FastTracker-Mods auch. Aber bei längeren Stücken… keinesfalls.
Ich benutze die in einer Pagination-Leiste in einer Datenbankmaske, also Aktionen wie nächster, vorheriger, neuer Datensatz usw. (per Button ausgelöst) werden mit diesen Sounds unterlegt. Das “Thema” dieser Anwendung ist nicht ganz ernst und, äh, halt etwas “merkwürdig”, die Sounds passen schon dazu. Ich bin da noch an den Feinheiten, aber ich möchte es dann hier im Projekte-Bereich präsentieren, da ich mir noch einiges an Verbesserungen durch eine Diskussion erhoffe und ich mir vorstellen kann, dass das Sujet durchaus noch Andere hier interessiert.
[QUOTE=Spacerat]Der von HobelHai verwendete AudioClip ist nicht jener aus „java.applet“!
[/QUOTE]
Ach so, damit hab ichs nämlich schon erfolglos probiert.
*** Edit ***
UND welchen import sonst?
Eclipse schlägt mir nur java.applet vor.
javafx.scene.media.AudioClip
Man sollte vielleicht erwähnen, dass JavaFX etwas ist, was nicht jeder installiert hat (wenn man z.B. nur ein 6er und kein 7er JDK hat…)
Wenn ein 7er SDK Java installiert ist, ist auch JavaFX installiert (jfxt.jar im Ordner jre/lib). Man muss dieses Package aber manuell in sein Projekt einbinden, wenn man es denn nutzen möchte.
ich hab jetzt den ordner jvafx aus der jar jfxrt in den ordner bin vom eclipse projekt gezogen und den import hingeschrieben aber er zeigt einen Fehler an:The Import javafx cannot be resolved.
Also den Ordner mit allen Unterordnern und Dateien drin.Was mache ich falsch, oder was ist der grund für euer schweigen ?
:o hier war noch 'ne Frage? gar nicht mitbekommen…
Du musst eigentlich nur die jfxrt.jar als externe Jar mit in dein Projekt einbinden, zumindest bei pre Java7-Umgebungen. Ab Java7 brauchst du JavaFX-Klassen nur noch importieren.
Ich kenne mich weder mit JavaFX noch mit Eclipse aus, aber ich denke das sollte helfen:
Wie bindet man fremde Bibliotheken in ein Java-Programm ein?
Danke, aber eine Frage hab ich noch, der Endbenutzer kann das Programm so einfach laufen lassen, ohne irgendwas zu tun, oder?
[QUOTE=Zombiepriester]Danke, aber eine Frage hab ich noch, der Endbenutzer kann das Programm so einfach laufen lassen, ohne irgendwas zu tun, oder?[/QUOTE]Wenn er Java7 verwendet (bzw. Java7 verwenden muss, weil deine Anwendung das vorschreibt) ja. Bei früheren Versionen muss er JavaFX explizit installieren.
Eins noch, hat eigentlich nix mit dem Thema zu tun, aber vorhin ist mir Eclipse abgestürzt und jetzt weigert er sich die Java dateien zu Compilieren, und einzeln geht ja auch nicht, weil er ja dann Fehler anzeigt, weil die Anderen nicht als Class vorhanden sind.
*** Edit ***
Hat sich erledigt, aber jetzt wo ichs ausprobiert hab bekomme ich folgende Exception:
Exception in thread „main“ java.lang.IllegalArgumentException: uri.getScheme() == null!
at com.sun.media.jfxmedia.locator.Locator.(Locator.java:232)
at com.sun.media.jfxmediaimpl.NativeMediaAudioClip.(NativeMediaAudioClip.java:32)
at com.sun.media.jfxmediaimpl.NativeMediaAudioClip.load(NativeMediaAudioClip.java:42)
at com.sun.media.jfxmediaimpl.AudioClipProvider.load(AudioClipProvider.java:47)
at com.sun.media.jfxmedia.AudioClip.load(AudioClip.java:172)
at javafx.scene.media.AudioClip.(AudioClip.java:61)
at Java.Soc.Socius.laden(Socius.java:123)
*** Edit ***
grad starte ich es erneut und die Exceptoin taucht nicht mehr auf.