簡體   English   中英

如何在Android的cocos2d x中檢測設備方向變化

[英]How to detect device orientation change in cocos2d x for Android

我正在為cocos2dx 2.2.3應用程序尋找一種檢測設備方向是否從橫向更改為縱向或以其他方式更改的方法。

我已經在這個主題上搜索了幾個小時,但無濟於事。

我想在CCScene中檢測方向更改事件。 我可以訂閱一個活動嗎?

我對您如何在Android上執行此操作很感興趣,但是歡迎使用iOS和Windows!

謝謝!

我找到了一個解決方案,但這不是很好,因為您必須修改lib。 無論如何

1.轉到cocos2dx / platform / android / java / src / org / cocos2dx / lib

2.在Cocos2dxRenderer.java中,將以下內容添加到onSurfaceChanged方法中

@Override
public void onSurfaceChanged(final GL10 pGL10, final int pWidth, final int pHeight) {
    nativeInit(pWidth, pHeight);
}

3.轉到您的項目文件夾,然后在proj.android/jni/[prjcpp]/main.cpp中修改Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit方法

void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h)
{
    if (!CCDirector::sharedDirector()->getOpenGLView())
    {
        //...
    }
    else
    {
        //...
        CCEGLView *view = CCEGLView::sharedOpenGLView();        
        if (view->getFrameSize().width != w || view->getFrameSize().height != h) {
            view->setFrameSize(w, h);
            view->setDesignResolutionSize(w, h, kResolutionShowAll);
            CCNotificationCenter::sharedNotificationCenter()->postNotification(EVENT_ORIENTATION_CHANGED, NULL);
        }   
    }
}

4.在訂閱EVENT_ORIENTATION_CHANGED之前,必須在CCEventType.h中聲明它:

#define EVENT_ORIENTATION_CHANGED  "event_orientation_changed"

5.您可以訂閱活動:

CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(Scene::orientationChangedCallback), EVENT_ORIENTATION_CHANGED, NULL);

您可以通過檢查任何CCScene或CCLayer對象的更新方法的方向來避免使用事件。 我通過比較屏幕的寬度和高度來做到這一點:

bool Scene::isLandscape()
{
    CCSize _screenSize = CCDirector::sharedDirector()->getWinSize();
    if (_screenSize.width > _screenSize.height)
        return true;
    return false;
}

必須有一個更好的解決方案! 請分享!

警告:

我沒有在cocos2x 2.x api中尋找正式的實現(它們可能已經有一個?)。

如果必須自己實現,我能想到的最干凈的解決方案是使用JNI 對JNI的完整解釋不在此答案的范圍內。 是與cocos2d-x一起工作的示例。

執行:

  1. 編寫Java可以使用JNI調用的本機C ++函數。
  2. 像檢測任何Android應用一樣,可以檢測 Java 方向的變化。
  3. 更改方向時,請從Java中觸發本機C ++方法,並傳遞您所需的任何其他信息(“風景”,“人像”等)。 為簡單起見,您可以改用兩個void方法。
  4. 在C ++端處理適當的回調。

提示:

  1. 不要自己編寫相應的完全限定的函數名( Java_com_mycompany_mygame_MyGame ):使用javah自動為您生成它; JNI容易出錯,並且難以調試,尤其是對於未啟動的用戶。
  2. 隨意散布日志語句以幫助調試。

優點:為了獲得更大的靈活性和代碼重用,請將游戲特定的回調與C ++定義分離,而使用訂戶模型(就像您在答案中一樣)。

這樣,您無需修改​​引擎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM