Android启动时出现黑屏,除非使用横向方向

3

使用Nexus 5(以及后来的安卓手机,如Galaxy S5等),我之前在其他设备上运行良好的游戏,在启动时只显示黑屏,虽然按钮可以被点击(尽管你看不见它们),声音效果也能播放。

由于这个问题给我带来了巨大的困扰,我终于在某种程度上解决了它。以下是与启动相关的代码:

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();

使用上述代码时,启动时会显示黑屏(启动画面图形确实会显示,但主游戏活动屏幕不会显示)。

然而,通过更改以下行;

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

to

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

该应用程序显示图形,但是它们被拉伸了且不理想!因此,这似乎是由于较新的Android设备而引起的分辨率问题。经过搜索,我找到了与'gluPerspective'相关的代码片段,但我没有在我的代码中找到它来更改。
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);
}

有人能帮忙吗? - user3355723
1个回答

0

这是关于Cocos2d在Android 4.3及以上版本的问题 在Github论坛上提出并得到解答

虽然有很多解决方法,比如将以下代码放入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或源代码,并在你的应用程序中实施。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接