android - Android 启动黑屏,除非使用横向

标签 android eclipse cocos2d-android

使用 Nexus 5(以及任何后来的 Android 手机,如 Galaxy S5 等)我的游戏以前在其他设备上运行良好,只是在启动时显示黑屏,可以点击按钮(即使你看不到他们)和 sfx 播放。

在与这个问题进行了大量的斗争之后,我设法在某种程度上修复了它,这是与发布有关的代码;

mGLSurfaceView = new CCGLSurfaceView(this);        
        CCDirector.sharedDirector().setScreenSize(CCDirector.sharedDirector().winSize().width, 
                CCDirector.sharedDirector().winSize().height);
        CCDirector.sharedDirector().setDeviceOrientation(CCDirector.kCCDeviceOrientationPortrait);
        CCDirector.sharedDirector().getActivity().setContentView(mGLSurfaceView, createLayoutParams());
        InitParam();

使用上面的以下代码,在启动时显示黑屏(闪屏图形会显示但主游戏 Activity 屏幕不会显示)。

但是,通过改变这一行;

CCDirector.sharedDirector().setDeviceOrientation(CCDirector.kCCDeviceOrientationPortrait);

CCDirector.sharedDirector().setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft);

应用程序显示 - 尽管拉伸(stretch)了图形并且不理想!因此,由于更新的 Android 设备,这似乎是一个分辨率问题。 搜索后,我可以找到与“gluPerspective”相关的代码 fragment ,但我的代码中没有要更改的代码 fragment 。

我相信 Nexus/Galaxy 的分辨率高达 1920,因此需要以某种方式找到一种方法来将其设置为与现有代码一起使用。

可能有帮助的附加代码,来自 TitleLayer

public TitleLayer()
    {
        super();        
        CCSprite sprite = CCSprite.sprite(G._getImg("background"));
        G.setScale(sprite);
        sprite.setAnchorPoint(0, 0);
        sprite.setPosition(0, 0);
        addChild(sprite);
        isTouchEnabled_= true;

    }
    public static void setScale(){
        G._scaleX = CCDirector.sharedDirector().winSize().width / G.WIN_W; 
        G._scaleY = CCDirector.sharedDirector().winSize().height / G.WIN_H;
    }

它从这里获取值;

public static Activity      g_Context; 

    public static final float       DEFAULT_W       = 360f;
    public static final float       DEFAULT_H       = 480f;
    public static final float       WIN_W           = 720f; 
    public static final float       WIN_H           = 1280f;



public static void getScale(){          
        _scaleX = CCDirector.sharedDirector().winSize().width / WIN_W;
        _scaleY =  CCDirector.sharedDirector().winSize().height / WIN_H;        
    }
    public static float _getX(float x) {
        return _scaleX * x;
    }

    public static float _getY(float y) {
        return _scaleY * y;
    }

public static void setScale(CCNode node) {
    node.setScaleX(_scaleX);
    node.setScaleY(_scaleY);
}

public static void setScale(CCNode node, float scaleFactor) {
    node.setScaleX(_scaleX*scaleFactor);
    node.setScaleY(_scaleY*scaleFactor);
}


public static void setScale(CCNode node, boolean bSmall) {
    float scale = bSmall ?
        (_scaleX<_scaleY ? _scaleX : _scaleY) :
        (_scaleX>_scaleY ? _scaleX : _scaleY);
    node.setScale(scale);
}

最佳答案

这是cocos2d for Android 4.3及以上的问题Issue raised and answered at github forum

虽然有很多解决方法,例如将以下代码放在 onStart() 方法中。

app.metric = 1;
CGSize s = CCDirector.sharedDirector().winSize();
if (s.height > 1280) {
    app.metric = s.height / 1280;
    s.height = s.height / app.metric;
    s.width = s.width / app.metric;
    CCDirector.sharedDirector().setScreenSize((int) s.width, (int) s.height);
}

或者如果您有 cocos2d 的源代码,则更改下面提到的行。

public static final int kCCDirectorProjectionDefault = kCCDirectorProjection3D;

或者你可以实现这个解决方案

在CCDirector的setProjection方法中—— 将 gluPerspective 更改为 2000 而不是 1500 新线将是这样的 - GLU.gluPerspective(gl, 60, size.width/size.height, 0.5f, 2000.0f);

但所有这些都是解决问题的方法,所以如果你真的想要好的解决方案,那么你可以获取最新的 cocos2d jar 或源代码并在你的应用程序中实现。

关于android - Android 启动黑屏,除非使用横向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25137441/

相关文章:

java - 从可执行 JAR 中的 res 文件夹中提取文件(具体为 txt 文件)

android - 表面 View 作为 android 中的位图

java - 使用 SharedPreferences 保存字符串值,但由于某种原因未保存或由于其他问题

java - Hibernate配置文件和Eclipse项目导出

android - 在系统应用程序中使用 sendBroadcast

java - 如何将 Maven 项目转换为 Eclipse 中使用 Ant 构建的动态 Web 项目?

android - 选中 CCMenuItemToggle cocos2d-x

android - COCOS2D android中如何将图层保存为图片

android - iOS 通知本地化失败,使用 FCM(Firebase 云消息传递)

android - SharedPreferences 不工作 android