如何在Android的cocos2d x中检测设备方向更改

时间:2014-07-29 11:52:07

标签: android c++ cocos2d-x

对于cocos2dx 2.2.3 app,我正在寻找一种方法来检测设备方向是否从横向变为纵向或相反。

我现在用谷歌搜索了这个主题几个小时,但无济于事。

我想在CCScene中检测方向更改事件。我可以订阅一个活动吗?

我很感兴趣如何为Android做这件事,但欢迎使用iOS和Windows!

谢谢!

2 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,但它不是很好,因为你必须修改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;
}

必须有更好的解决方案!请分享!

答案 1 :(得分:0)

<强>警告:

我没有在cocos2x 2.x api中查看官方实施(他们可能已经有一个?)。

如果您必须自己实施,我能想到的最简洁的解决方案是使用JNI。 JNI的完整解释超出了本答案的范围。 Here是一个如何使用cocos2d-x的示例。

<强>实施

  1. 编写Java可以使用JNI调用的本机C ++函数。
  2. Java方面的
  3. Detect orientation更改就像您使用任何Android应用程序一样。
  4. 在方向更改时,从Java中激活本机C ++方法,传递您需要的任何额外信息(&#34; landscape&#34;,&#34; portrait&#34;等)。为简单起见,您可以使用两种void方法。
  5. 在C ++方面的定义中处理适当的回调。
  6. <强>提示:

    1. 不要自己编写相应的完全限定的函数名称(Java_com_mycompany_mygame_MyGame):使用javah自动生成它; JNI可能非常容易出错并且难以调试,特别是对于没有经验的人。
    2. 自由地填充日志语句以帮助调试。
    3. 加分:为了获得额外的灵活性和代码重用,请从C ++定义中分离特定于游戏的回调,而不是使用订阅者模型(就像您在答案中一样)。

      这样您就不必对引擎进行修改。