2012-06-16 70 views
4

当我退出程序,并重新进入它,我得到了一个错误:的cocos2d-x的OpenGL上下文在Android失踪(OK与iPhone)

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

+0

你在用什么设备?在特定设备上报告了OpenGL问题。 –

回答

1

这恰好是cocos2d-x的错误。固定在新版本v2.x上。 (看起来cocos2d-x会停止更新使用opengl 1.x的1.x版本),因此可悲地不支持iPhone和iPhone 3g。无论如何更新cocos2d-x 2.x现在工作。

+0

谢谢,我使用了一些OpenGL LIGHT,但是当我恢复游戏时,全部变成黑色。我认为这是相同的原因。后来我们需要考虑切换到2.x –