Tôi đang sử dụng HTML5 để lập trình trò chơi; trở ngại tôi gặp phải bây giờ là làm thế nào để phát hiệu ứng âm thanh.
Các yêu cầu cụ thể rất ít về số lượng:
- Chơi và trộn nhiều âm thanh,
- Phát cùng một mẫu nhiều lần, có thể phát lại chồng chéo,
- Phát lại gián đoạn một mẫu tại bất kỳ điểm nào,
- Tốt nhất là phát các tệp WAV chứa PCM thô (chất lượng thấp), nhưng tôi có thể chuyển đổi các tệp này, tất nhiên.
Cách tiếp cận đầu tiên của tôi là sử dụng <audio>
phần tử HTML5 và xác định tất cả các hiệu ứng âm thanh trong trang của tôi. Firefox chỉ phát các tệp WAV, nhưng gọi #play
nhiều lần không thực sự phát mẫu nhiều lần. Từ hiểu biết của tôi về thông số HTML5, <audio>
phần tử cũng theo dõi trạng thái phát lại, vì vậy điều đó giải thích tại sao.
Suy nghĩ trước mắt của tôi là sao chép các thành phần âm thanh, vì vậy tôi đã tạo thư viện JavaScript nhỏ sau đây để làm điều đó cho tôi (phụ thuộc vào jQuery):
var Snd = {
init: function() {
$("audio").each(function() {
var src = this.getAttribute('src');
if (src.substring(0, 4) !== "snd/") { return; }
// Cut out the basename (strip directory and extension)
var name = src.substring(4, src.length - 4);
// Create the helper function, which clones the audio object and plays it
var Constructor = function() {};
Constructor.prototype = this;
Snd[name] = function() {
var clone = new Constructor();
clone.play();
// Return the cloned element, so the caller can interrupt the sound effect
return clone;
};
});
}
};
Vì vậy, bây giờ tôi có thể làm Snd.boom();
từ bảng điều khiển Firebird và chơi snd/boom.wav
, nhưng tôi vẫn không thể chơi cùng một mẫu nhiều lần. Có vẻ như <audio>
yếu tố này thực sự là một tính năng phát trực tuyến hơn là một thứ gì đó để phát hiệu ứng âm thanh.
Có một cách thông minh để thực hiện điều này mà tôi đang thiếu, tốt nhất là chỉ sử dụng HTML5 và JavaScript?
Tôi cũng nên đề cập rằng, môi trường thử nghiệm của tôi là Firefox 3.5 trên Ubuntu 9.10. Các trình duyệt khác mà tôi đã thử - Opera, Midori, Chromium, Epiphany - tạo ra các kết quả khác nhau. Một số không chơi bất cứ điều gì, và một số ngoại lệ ném.