Thursday, October 2, 2014

Cocos2d-x: Cấu hình Game AirHockey trên môi trường Android - Eclipse


Cấu hình Game AirHockey  trên Eclipse cho Android

- Chúng ta có thể tham khảo lại bài viết "Cocos2d-x: Làm game đầu tiên - Air Hockey" để nắm tiếp phần này.
- Mở lại dự án AirHockey mà ta đã Import ở các bài trước bằng Eclipse.

- Sau khi build dự án ta sẽ nhận được thông báo lỗi không tìm thấy các file class mà chúng ta định nghĩa thêm, ví dụ như: InGameScene chẳng hạn.





- Để khắc phục các lỗi này thì chúng ta cần phải khai báo thêm đường dẫn đến các file mã nguồn mà chúng ta đã thêm mới vào file Android.mk trong thư mục jni




- Ở LOCAL_SRC_FILES, chúng ta thêm đường dẫn đến tất cả các file *.cpp mà mình đã thêm mới

- Ở LOCAL_C_INCLUDES, chúng ta thêm đường dẫn đến cac thư mục có chứ các file *.h mà chúng ta đã thêm mới

- Trong file AndroidMainfest, chúng ta thiết lập để giới hạn cho game chỉ chạy trên Tablet


<supports-screens android:anyDensity="true"

android:smallScreens="false"

android:normalScreens="false"

android:largeScreens="true"

android:xlargeScreens="true" android:requiresSmallestWidthDp="600"/>

- Tiếp tục Build game thì sẽ không còn lỗi, tạo một AVD Table để Run game. Game build thành công, nhưng khi Run thì sẽ bị lỗi Force Close :D Lý do nó ở các file âm thanh trong game.

- Trong Android, việc thiết lập đường dẫn cho các file âm thanh không như của iOS, do vậy chúng ta phải viết lại mã nguồn cho đoạn thiết lập này, đồng thời, các file wav mà chúng ta đã dùng trên iOS hoạt động không ổn trên Android, chúng ta sẽ dùng mp3 thay vào.

- Định nghĩa hằng số đường dẫn cho các file âm thanh trong Constant.h


#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#define MUSIC "sound/music.mp3"

#define SFX_HIT "sound/hit.mp3"

#define SFX_GOAL "sound/goal.mp3"

#else

#define MUSIC "music.wav"

#define SFX_HIT "hit.wav"

#define SFX_GOAL "goal.wav"

#endif

- Dùng macro CC_TARGET_PLATFORM để xác định nền tảng đang chạy.

- Trong file AudioUtils.cpp chúng ta sẽ bổ sung lại các đoạn code sau

#include "AudioUtils.h"
#include "cocos2d.h"
#include "Constant.h"

using namespace cocos2d;
using namespace CocosDenshion;

void AudioUtils::prepare()
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC);
    SimpleAudioEngine::sharedEngine()->preloadEffect(SFX_HIT);
    SimpleAudioEngine::sharedEngine()->preloadEffect(SFX_GOAL);
#else
    SimpleAudioEngine::getInstance()->preloadBackgroundMusic(FileUtils::getInstance()->fullPathForFilename(MUSIC).c_str());
    SimpleAudioEngine::getInstance()->preloadEffect(FileUtils::getInstance()->fullPathForFilename(SFX_HIT).c_str());
    SimpleAudioEngine::getInstance()->preloadEffect(FileUtils::getInstance()->fullPathForFilename(SFX_GOAL).c_str());
#endif
}

Sửa lại hàm play âm thanh

void AudioUtils::play(AudioType type)
{
    switch (type) {
        case ATBackgroundMusic:
        {
            if (!SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()) {
                SimpleAudioEngine::getInstance()->playBackgroundMusic(MUSIC);
            }
        }
            break;
        case ATHit:
        {
            SimpleAudioEngine::getInstance()->playEffect(SFX_HIT);
        }
            break;
        case ATGoal:
        {
            SimpleAudioEngine::getInstance()->playEffect(SFX_GOAL);
        }
            break;
        default:
            break;
    }
}

- Run lại dự án và chúng ta có kết quả như sau 

No comments:

Post a Comment