android - Android 上缺少 cocos2d-x opengl 上下文(适用于 iPhone)

标签 android iphone opengl-es cocos2d-x

当我退出应用程序并重新进入时,出现错误:

libEGL   call to OpenGL ES API with no current context (logged once per thread)      (red warning text)
libc     Fatal signal 11 (SIGSEGV) at 0x5f012000 (code=2)                  (black text)

错误文件是:(不知道在哪里,但如果我不使用这个文件就可以)

.h:

#ifndef __CCMaskLayer__LAYER_H__
#define __CCMaskLayer__LAYER_H__

#include "cocos2d.h"
using namespace cocos2d;


class CCMaskLayer : public cocos2d::CCLayer
{
public:
    CCMaskLayer();

    ~CCMaskLayer();

    virtual bool initWithRGBASizeCenterPosition(float red, float green, float blue, float alpha, CCSize s, CCPoint p);  

    virtual void onExit();

    virtual void onEnterTransitionDidFinish();

    LAYER_NODE_FUNC(CCMaskLayer);


    static CCMaskLayer* layerWithCCColor4FSizeCenterPosition(ccColor4F c, CCSize s, CCPoint p);
    static CCMaskLayer* layerWithRGBASizeCenterPosition(float red, float green, float blue, float alpha, CCSize s, CCPoint p);

    void scratchOffCircle(CCPoint center, float radius);
    void scratchOffRect(CCRect rect);


    CC_SYNTHESIZE_RETAIN(CCRenderTexture* , masked, masked);
    CC_SYNTHESIZE(float, r, r);
    CC_SYNTHESIZE(float, g, g);
    CC_SYNTHESIZE(float, b, b);
    CC_SYNTHESIZE(float, a, a);

private:

    void setClear(float red, float green, float blue, float alpha);




};

#endif // __CCMaskLayer__LAYER_H__

.cpp:

#include "CCMaskLayer.h"

using namespace cocos2d;

CCMaskLayer::CCMaskLayer()
{
}

CCMaskLayer::~CCMaskLayer()
{

    masked->release();

}
bool CCMaskLayer::initWithRGBASizeCenterPosition(float red, float green, float blue, float alpha, CCSize s, CCPoint p) {

    if ( !CCLayer::init() )
    {
        return false;
    }

    this->setClear(red, green, blue, alpha);

    CCSize size = s;

    masked = CCRenderTexture::renderTextureWithWidthAndHeight(size.width, size.height);


    masked->getSprite()->setBlendFunc((ccBlendFunc){GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA});

    masked->setPosition(p);
    this->addChild(masked);

    this->setIsTouchEnabled(true);

    return true;
}

void CCMaskLayer::onEnterTransitionDidFinish()
{
    CCLayer::onEnterTransitionDidFinish();
}

void CCMaskLayer::onExit()
{
    CCLayer::onExit();
}



CCMaskLayer* CCMaskLayer::layerWithCCColor4FSizeCenterPosition(ccColor4F c, CCSize s, CCPoint p) {

    return CCMaskLayer::layerWithRGBASizeCenterPosition(c.r, c.g, c.b, c.a, s, p);
}

CCMaskLayer* CCMaskLayer::layerWithRGBASizeCenterPosition(float r, float g, float b, float a, CCSize s, CCPoint p) {
    CCMaskLayer* layer = new CCMaskLayer;
    layer->initWithRGBASizeCenterPosition(r, g, b, a, s, p);
    layer->autorelease();
    return layer;
}



void CCMaskLayer::setClear(float red, float green, float blue, float alpha) {
    r = red;
    g = green;
    b = blue;
    a = alpha;

}


void CCMaskLayer::scratchOffCircle(CCPoint center, float radius) {

    masked->beginWithClear(r, g, b, a);


    glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);

    glDisable(GL_TEXTURE_2D);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glColorMask(0.0f, 0.0f, 0.0f, 1.0f);

    glPointSize(radius * 2 * CC_CONTENT_SCALE_FACTOR());
    glEnable(GL_POINT_SMOOTH);
    glVertexPointer(2, GL_FLOAT, 0, &center);   
    glDrawArrays(GL_POINTS, 0, 1);    

    glColorMask(1.0f, 1.0f, 1.0f, 1.0f);    
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_TEXTURE_2D);        


    masked->end();

 } 

void CCMaskLayer::scratchOffRect(CCRect rect) {


    masked->beginWithClear(r, g, b, a);


    glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);

    glDisable(GL_TEXTURE_2D);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glColorMask(0.0f, 0.0f, 0.0f, 1.0f);

    CCPoint vertices[4] = {
         rect.origin,                                                                    // bottom, left
         CCPointMake(rect.origin.x, rect.origin.y + rect.size.height),                   // top, left
         CCPointMake(rect.origin.x + rect.size.width, rect.origin.y),                    // bottom, right
         CCPointMake(rect.origin.x + rect.size.width, rect.origin.y + rect.size.height), // top, right
    };
    glVertexPointer(2, GL_FLOAT, 0, &vertices); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);



    glColorMask(1.0f, 1.0f, 1.0f, 1.0f);    
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_TEXTURE_2D);        

    masked->end();

 }

请注意,它适用于 iOS,但适用于 Android。

编辑::

如果我注释掉最后一行刮掉圆形/矩形方法,则不会绘制任何内容,但不会崩溃。所以问题是行:masked->end() ?

最佳答案

这恰好是 cocos2d-x 的 bug。固定在新版本 v2.x 上。 (似乎 cocos2d-x 停止更新使用 opengl es 1.x 的 1.x 版本)因此很遗憾不支持 iPhone 和 iPhone 3g。无论如何更新 cocos2d-x 2.x 现在可以工作了。

关于android - Android 上缺少 cocos2d-x opengl 上下文(适用于 iPhone),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11061417/

相关文章:

iphone - iPhone sdk 支持 l2cap 蓝牙 socket 吗?

ios - 立方体贴图未显示纹理 (OpenGL ES)

opengl-es - 如何在 Swift 中通过 OpenGL 显示 RGB 纹理?

android - 我应该如何解析数组中的数组中的Json

iphone - 在应用程序更新时,自定义 plist 文件将得到更新,或者我们需要做些什么吗?

android - 对 'rindex' 的 undefined reference

iPhone(SDK 2.2): adusting playback volume while NOT actively playing music w/AVFoundation?

android - 尝试在 Android 模拟器上运行 mapsActivity 时出现 EGL 错误

android - 警报管理器未在某些设备上触发?

android - Activity状态丢失,部分设备Illegal state异常