草庐IT

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

coder 2023-12-23 原文

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

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/

有关android - Android 上缺少 cocos2d-x opengl 上下文(适用于 iPhone)的更多相关文章

  1. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby - 如何使用适用于 ruby​​ 的 aws sdk 创建 route53 记录集? - 2

    EC2会在实例停止然后重新启动时为其提供新的IP地址,因此我需要能够自动管理route53记录集,以便我可以一致地访问内容。遗憾的是,sdk的route53部分的文档远不如ec2的文档那么健壮(可以理解),所以我有点卡住了。到目前为止,从我所看到的情况来看,似乎change_resource_record_sets(link)是可行的方法,但我对:chages需要什么感到困惑>因为它提到了一个Change对象,但没有提供指向所述对象描述的链接。这是我的代码目前的样子:r53.client.change_resource_record_sets(:hosted_zone_id=>'MY_

  4. 适用于Web开发的Python还是Ruby? - 2

    Asitcurrentlystands,thisquestionisnotagoodfitforourQ&Aformat.Weexpectanswerstobesupportedbyfacts,references,orexpertise,butthisquestionwilllikelysolicitdebate,arguments,polling,orextendeddiscussion.Ifyoufeelthatthisquestioncanbeimprovedandpossiblyreopened,visitthehelpcenter提供指导。11年前关闭。我是一位精通HTML

  5. ruby - 从 Ruby 连接到适用于 Windows Phone 8 的 Microsoft 推送通知服务 - 2

    我们正在开发一个需要推送通知的WP8应用程序。为了测试它,我们使用CURL命令行运行推送通知POST请求,确保它实际连接,使用客户端SSL证书进行身份验证并发送正确的数据。我们确实知道,当我们收到对设备的推送时,这项工作是有效的。这是我们一直用于测试目的的CURL命令:curl--certclient_cert.pem-v-H"Content-Type:text/xml"-H"X-WindowsPhone-Target:Toast"-H"X-NotificationClass:2"-XPOST-d"MytitleMysubtitle"https://db3.notify.live.ne

  6. ruby-on-rails - rspec Mongoid 范围适用于开发而不是测试 - 2

    我有一个适用于Rails中的Mongoid对象的作用域,它在开发时效果很好,但在运行测试时效果不佳。它实际上在测试中根本不起作用。这是一个嵌入式文档。父级:classPersonincludeMongoid::Documentdefself.with_appointmentswhere(:appointments.not=>{'$size'=>0})endembeds_many:appointments,store_as:'Appointments',class_name:'Appointment'end嵌入的child:classAppointmentincludeMongoid::

  7. ruby-on-rails - 我应该使用哪个适用于 Ruby 的 CouchDB 适配器? - 2

    一些我找到的选项是ActiveCouchCouchRESTCouchPotatoRelaxDBcouch_foo我更喜欢GitHub上的项目,因为这让我更容易fork和推送修复。所有这些都符合该要求。我习惯了Rails,所以我喜欢像ActiveRecord模型一样工作的东西。另一方面,我也不希望我和Couch之间太多--毕竟我使用它作为我的数据库是有原因的。最后,它们似乎都得到了相当积极的维护(couch_foo可能是个异常(exception))。所以我想这归结为(不可否认和不幸的)主观:有没有人对他们有过好的或坏的经历? 最佳答案

  8. ruby - 如何获取适用于 ruby​​ 1.9.1 的 to_yaml 方法的格式化选项? - 2

    根据YAML文档,可以传递hashofoptions到.to_yaml方法。目前,当我按照文档中的建议传递选项时,它不起作用,哈希被忽略。irb(main):001:0>require'yaml'=>trueirb(main):002:0>user={"1"=>{"name"=>"john","age"=>44}}user.to_yaml=>"---\n\"1\":\nname:john\nage:44\n"现在,传递一些选项:irb(main):014:0>user.to_yaml(:Indent=>4,:UseHeader=>true,:UseVersion=>true)=>"--

  9. ruby - 为什么这段代码适用于 ruby​​ 1.8 而不是 ruby​​ 1.9? - 2

    这段代码:deffunc*;end[func"hello"]在Ruby1.8.7中解析没有错误,但返回语法错误:syntaxerror,unexpected']',expecting'}'在Ruby中>=1.9。我浏览了WhatisthedifferencebetweenRuby1.8andRuby1.9,但找不到对此的引用。有谁知道是什么变化导致了这种情况? 最佳答案 这是为了避免歧义。请考虑以下事项:deffoo(a,b=1)#footakesanoptionalsecondargumentend[foo1,2]这可以解释为[(

  10. ruby - 您如何指定适用于英语以外的欧洲语言的正则表达式字符范围? - 2

    我正在使用Ruby的正则表达式引擎。我需要编写一个执行此操作的正则表达式WIKI_WORD=/\b([a-z][\w_]+\.)?[A-Z][a-z]+[A-Z]\w*\b/但也可以使用除英语以外的其他欧洲语言。我认为字符范围[a-z]不会涵盖德语等的小写字母。 最佳答案 WIKI_WORD=/\b(\p{Ll}\w+\.)?\p{Lu}\p{Ll}+\p{Lu}\w*\b/u应该在Ruby1.9中工作。\p{Lu}和\p{Ll}是大写和小写Unicode字母的简写。(\w已经包含下划线)另见thisanswer-您可能需要在UTF

随机推荐