twb: Audio-Objekt, Eventhandler canplaythrough

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

  1. 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

    1. 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?