cocos2dx 2.2.6 hitWidget->onTouchEnded(pTouch, pEvent); 异常

今天在调试控件A处于TOUCH_EVENT_BEGAN状态下的时候,控件A被删除或是主动删除,报hitWidget->onTouchEnded(pTouch, pEvent); 异常的问题。

查看源代码如下:

void TouchGroup::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
    ccArray* selectedWidgetArray = m_pSelectedWidgets->data;
    int length = selectedWidgetArray->num;
    for (int i=0; i<length; ++i)
    {
        Widget* hitWidget = (Widget*)(selectedWidgetArray->arr[0]);
        m_pSelectedWidgets->removeObject(hitWidget);
	hitWidget->onTouchEnded(pTouch, pEvent);
        
    }
}

在使用hitWidget 的时候,被removeObject了,也就是说对象已经被释放了,

hitWidget的释放方式是autorelease,若没有其他的地方用到,也就会被彻底释放了。



现在有两种方式来尝试解决这个问题(一)
使用retain 和 release把m_pSelectedWidgets->removeObject(hitWidget);
        hitWidget->onTouchEnded(pTouch, pEvent);
包含起来,已保证在使用onTouchEnded的时候,hitWidget没有被释放。
包含起来,已保证在使用onTouchEnded的时候,hitWidget没有被释放。



 
void TouchGroup::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
    ccArray* selectedWidgetArray = m_pSelectedWidgets->data;
    int length = selectedWidgetArray->num;
    for (int i=0; i<length; ++i)
    {
        Widget* hitWidget = (Widget*)(selectedWidgetArray->arr[0]);
	hitWidget->retain();   <span style="color:#ff0000;">// add 
        m_pSelectedWidgets->removeObject(hitWidget);
        hitWidget->onTouchEnded(pTouch, pEvent);
	hitWidget->release();   <span style="color:#ff0000;">// add
    }
}


第二种方式(二)
把onTouchEnded和removeObject换一下位置

void TouchGroup::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
    ccArray* selectedWidgetArray = m_pSelectedWidgets->data;
    int length = selectedWidgetArray->num;
    for (int i=0; i<length; ++i)
    {
        Widget* hitWidget = (Widget*)(selectedWidgetArray->arr[0]);
<span style="white-space:pre">	</span>    hitWidget->onTouchEnded(pTouch, pEvent);   // modify
        m_pSelectedWidgets->removeObject(hitWidget);  // modify
    }
}

经过验证两种方式都能解决以上问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cocos2d-x 中的富文本可以通过 RichText 类来实现。RichText 类提供了一种简单的方式来创建并渲染富文本。通过 RichText 可以添加不同的字体、颜色、大小和对齐方式等属性,同时还支持添加图片和超链接等元素。 以下是一个简单的使用 RichText 的示例: ``` auto label = cocos2d::ui::RichText::create(); label->ignoreContentAdaptWithSize(false); label->setContentSize(Size(200, 100)); // 添加文字 auto text = cocos2d::ui::RichElementText::create(1, Color3B::WHITE, 255, "Hello World", "Arial", 12); label->pushBackElement(text); // 添加图片 auto image = cocos2d::ui::RichElementImage::create(2, Color3B::WHITE, 255, "path/to/image.png"); label->pushBackElement(image); // 添加超链接 auto link = cocos2d::ui::RichElementText::create(3, Color3B::YELLOW, 255, "click me", "Arial", 12); link->setUnderline(true); link->setUrl("http://www.example.com"); label->pushBackElement(link); label->setPosition(Vec2(100, 100)); addChild(label); ``` 在上面的示例中,我们创建了一个 RichText 对象,并添加了一些不同类型的元素:文本、图片和超链接。可以通过设置 setContentSize() 方法来指定 RichText 的大小,并使用 pushBackElement() 方法添加元素。元素的类型可以通过创建不同类型的 RichElement 对象来实现。在示例中,我们创建了 RichElementText 、RichElementImage 和 RichElementText 对象,分别表示文本、图片和超链接。 在创建 RichElementText 和 RichElementImage 对象时,需要指定一些属性,例如字体、颜色、大小和路径等。对于超链接,可以使用 setUrl() 方法来指定链接地址,同时还可以设置下划线等样式。 最后,我们将 RichText 添加到场景中,并设置其位置。通过这种方式,就可以轻松地创建和渲染富文本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值