4

アプリを終了して再入力すると、エラーが発生しました。

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の場合はクラッシュすることに注意してください。

編集::

スクラッチオフサークル/rectメソッドの最後の行をコメントアウトすると、何も描画されませんが、クラッシュしません。したがって、問題は次の行です:masked-> end()?

4

1 に答える 1

1

これはたまたま cocos2d-x のバグです。新しいバージョン v2.x で修正されました。(cocos2d-x は、opengl es 1.x を使用する 1.x バージョンの更新を停止しているようです) したがって、残念ながら iPhone および iPhone 3g はサポートされていません。いずれにせよ、cocos2d-x 2.x のアップデートは現在動作しています。

于 2012-06-19T09:12:20.533 に答える