Tài trợ bài viết này và giới thiệu dịch vụ, sản phẩm, thương hiệu, nhu cầu tuyển dụng của doanh nghiệp đến với cộng đồng.
La Kiến Vinh Khi chúng tôi phát triển game Sins, tôi cũng có mục tiêu đưa đầy đủ tính năng mà trước đó đã vận hành tốt trên iOS và Android. Nhìn sâu hơn vào trong game của chúng tôi, nó chứa rất nhiều điều thú vị và các giải pháp mà chúng tôi đưa ra để giải quyết các vấn đề. Bài viết này là kinh nghiệm của chúng tôi trong việc xử lý background music mà Cocos2d-x còn thiếu sót.
Nội dung bài viết

Giới thiệu

Cocos2d-x hỗ trợ các nhà phát triển viết game đa nền tảng nhưng trước phiên bản 2.2.3 Cocos2d-x chưa hỗ trợ cho WP8-XAML, ở phiên bản 2.2.3 trở lên, các nhà phát triển đã có thể thoải mái đưa vào "bộ sưu tập" game của mình nền tảng Windows Phone 8 với XAML (Đồng nghĩa với việc có thể thực hiện gắn quảng cáo và thực hiện IAP cho game).

Khi chúng tôi phát triển game Sins - The Salvation, chúng tôi cũng có mục tiêu đưa đầy đủ tính năng mà trước đó đã vận hành tốt trên iOS và Android. Nhìn sâu hơn vào trong game của chúng tôi, nó chứa rất nhiều điều thú vị và các giải pháp mà chúng tôi đưa ra để giải quyết các vấn đề.

Không đơn giản để chơi 1 bài nhạc nền trong game này, để tạo sự ngẫu nhiên cho nhạc nền, chúng tôi chia nhạc nền ra nhiều phân đoạn, và khi KẾT THÚC phân đoạn 1, nó sẽ ngẫu nhiên chọn theo 1 tỷ lệ dựa trên sự thiết kế của nhạc sĩ cho biết rằng đoạn nhạc nào nên được chọn chơi nhiều nhất và đoạn nào nên ít chơi để tránh ảnh hưởng đến cảm xúc người nghe. Nói đơn giản là nó bao gồm nhiều đoạn nhạc cho 1 mode chơi. Nhưng vấn đề nảy sinh với tính năng này trên Cocos2d-x 2.2.3 + Windows Phone 8 ở Cocos2d-x khi chúng tôi dùng SimpleAudioEngine là không thể kiểm tra rằng 1 Background Music đã kết thúc chưa để tiến hành chọn ngẫu nhiên và Play 1 Background Music mới, mặc dù đã gọi các hàm đầy đủ như trên phiên bản iOS và Android.

Đối tượng hướng đến

Các nhóm phát triển game trên Cocos2d-x 2.2.3+ đang cần kiểm tra một Background Music đã kết thúc chưa khi các bạn dùng SimpleAudioEngine được hỗ trợ sẵn bởi Cocos2d-x. Cần lưu ý là chúng tôi đang dùng phiên bản 2.2.3 nên chưa kiểm tra lại trên 2.2.4, nếu các bạn đã kiểm tra, vui lòng comment xác nhận để chúng tôi có thể cập nhật bài viết tốt hơn.

Hướng giải quyết

Để giải quyết vấn đề, thì chúng ta cần tìm hiểu vấn đề phát sinh từ đâu, hiện tại SimpleAudioEngine của Cocos2d-x 2.2.3 hỗ trợ đang sử dụng những tính năng có sẵn trong DirectX và qua khảo sát tôi nhận thấy có sự xuất hiện của thư viện XAUDIO2 (một thư viện âm thanh nổi tiếng có sẵn của DirectX). Do đó, tôi sẽ giải quyết vấn đề với XAUDIO2 và cần tìm hiểu cách thức để kiểm tra 1 âm thanh (nhạc nền) được kiểm tra đã kết thúc như thế nào.

Trong CocosDenshion, tôi tìm ra được 1 class là Audio có hàm kiểm tra IsSoundEffectStarted nhằm kiểm tra xem 1 âm thanh đã (đang) được chơi hay không? Nhưng điều đáng nói là, hàm này trong phiên bản cho Windows Phone 8 lại không kiểm tra được việc đã chơi âm thanh thành công hay không, do đó tôi cần thêm 1 số code thông qua kiến thức từ XAUDIO2 vào.

Codes cũ có sẵn của CocosDenshion trong file Audio.cpp

bool Audio::IsSoundEffectStarted(unsigned int sound)
{
    if (m_soundEffects.end() == m_soundEffects.find(sound))
        return false;

    return m_soundEffects[sound].m_soundEffectStarted;
}

Codes mới mà tôi thêm vào để hàm này chạy đúng

bool Audio::IsSoundEffectStarted(unsigned int sound)
{
    if (m_soundEffects.end() == m_soundEffects.find(sound))
        return false;

// DETECT BACKGROUND MUSIC WAS FINISHED ON WINDOWS PHONE 8
#define STDIO_HACK

#ifdef STDIO_HACK
    XAUDIO2_VOICE_STATE state;
    m_soundEffects[sound].m_soundEffectSourceVoice->GetState(&state);

    if (state.pCurrentBufferContext == NULL)
    {
        m_soundEffects[sound].m_soundEffectStarted = false;
    }
#endif

    return m_soundEffects[sound].m_soundEffectStarted;
}
THẢO LUẬN
ĐÓNG