Audio-Objekt, Eventhandler canplaythrough
twb
- javascript
Liebe alle
Für ein kleines Memoryspiel versuche ich, sowohl Bilder als auch Sounds vorzuladen, damit sie bei der Anzeige des Spiels unmittelbar bereitstehen. Bei den Bildern funktioniert das auch, bei den Sounds dagegen nicht. Weshalb nicht?
Mein Versuch sieht so aus: Ich erzeuge zwei Arrays mit den Mediendateien (images, sounds), und mittels Onload-Event (für Bilder) bzw. dem Oncanplaythrough-Event (für Sounds) zähle ich die in den Cache geladenen Dateien. Das Spiel startet mit der Setup-Funktion, sobald alle Files geladen sind.
var file_no, images, sounds, pics, snds;
// preload sounds and images
function preload_files() {
file_no=0;
images=["bild_1.png","bild_2.png","bild_x.png"];
sounds=["ton_1.mp3","ton_2.mp3","ton_x.mp3"];
// prevent game setup while files are loading
pics=[];
for (i=0;i<images.length;i++) {
pics[i]=new Image();
pics[i].onload=check_preload();
pics[i].src=images[i];
}
snds=[];
for (i=0;i<sounds.length;i++) {
snds[i]=new Audio();
snds[i].oncanplaythrough=check_preload();
snds[i].src=sounds[i];
}
}
function check_preload() {
// count files, setup when preload complete
file_no++;
if (file_no==images.length+sounds.length) setup();
}
Diese Lösung ist wacklig, und namentlich auf iOS (iPad) scheint sie nicht robust. Was ist hier falsch?
Herzlich und mit Dank, twb
Hallo,
pics[i].onload=check_preload();
snds[i].oncanplaythrough=check_preload();
Siehe: Traditionelles Event-Handling, Häufiger Fehler: Handler-Funktion direkt aufrufen
Das Schema ist:
objekt.onevent = handler;
NICHT
objekt.onevent = handler();
(Es sei denn, der Aufruf gibt ein Funktionsobjekt zurück… was hier nicht der Fall ist.)
Grüße
Mathias
Das Schema ist:
objekt.onevent = handler;
NICHT
objekt.onevent = handler();
(Es sei denn, der Aufruf gibt ein Funktionsobjekt zurück… was hier nicht der Fall ist.)
Das ist richtig, danke! Meine korrigierte Testversion läuft, doch auf iOS 7 (Safari für iPhone, iPad) funktioniert die Preload-Funktion bei den Sounds nicht (im Gegensatz zu den Images, wo sie läuft).
snds[i].oncanplaythrough=check_preload; // tut nicht
Woran das liegen mag? Kennt iOS 7 die Eventhandler canplay oder canplaythrough nicht?