【问题标题】:Cocos2d-x / control drawNode from functionCocos2d-x/从函数控制drawNode
【发布时间】:2014-06-19 02:15:36
【问题描述】:

我正在尝试为上面代码中的函数 "HelloWorld::touchDetector" 声明为 "dotNode" 的 drawNode 设置动画。

但是当我单击并触发该功能时,我总是得到 EXC_BAD_ACCESS。 (调试区显示:"dotNode cocos2d::DrawNode * NULL 0x0000000000000000" / "this cocos2d::Node * NULL 0x0000000000000000"之类的。)

有人知道为什么会这样吗?我认为这段代码可以工作,因为我在 HelloWorld.h 中声明了 drawNode 公用,但它没有。 (标签使用几乎相同的代码。)

谢谢,


HelloWorld.h

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::LayerGradient
{
public:
    static cocos2d::Scene* createScene();
    virtual bool init();

    CREATE_FUNC(HelloWorld);

    cocos2d::DrawNode *dotNode;

    void touchDetector(double locationX, double locationY);
};

#endif // __HELLOWORLD_SCENE_H__

HelloWorld.cpp

#include "HelloWorldScene.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    auto layer = HelloWorld::create();
    scene->addChild(layer);

    return scene;
}


bool HelloWorld::init(){

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


    Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();


    DrawNode *dotNode = DrawNode::create();
    dotNode->drawDot(Point(visibleSize.width*.5, visibleSize.height*.5), 10, Color4F(Color3B::WHITE));

    this->addChild(dotNode, 1);



    auto listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);
    listener->onTouchBegan = [=](Touch *touch, Event *event) mutable{
        Point location = touch->getLocation();

        HelloWorld::touchDetector(location.x, location.y);
        return true;
    };
    this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, dotNode);

    return true;
}



void HelloWorld::touchDetector(double locationX, double locationY){
    FiniteTimeAction* scale = EaseBounceOut::create(ScaleTo::create( 0.45f, 1.0f));
    dotNode->runAction(scale);

    return;
}

【问题讨论】:

    标签: cocos2d-x cocos2d-x-3.0


    【解决方案1】:

    错误是在HelloWorld.cpp的init方法中声明了一个局部变量DrawNode *dotNode = DrawNode::create();。 删除声明,应该可以工作。

    【讨论】:

      【解决方案2】:

      create 函数在内部自动释放对象。所以你必须保留那个对象。我认为这是问题所在。

      只需在创建后进行保留调用。

      dotNode->retain();

      【讨论】:

      • 似乎是由于声明问题引起的错误。但保留这个对象对我来说是一个新的见解。非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多