**** drawNode 的问题, 这是一个bug 吗 ??? ****

void HelloWorld::onTouchEnded(Touch* touch, Event  *event)
{
    Vec2 p = touch->getLocation();
    
    log("touchend  x = %f y = %f ", p.x,p.y);

    drawCrater->drawCircle(p, 15, CC_DEGREES_TO_RADIANS(90),30, false, Color4F::Color4F::GRAY);

}

```



我的本意是点击哪里 ,哪里就是圆心,然后画一个圆, 但是实现时,发现圆心不是我点的位置, 且只有第一次点击会画一个圆,再点不画了。 代码是执行的。 不懂。请教!

图片如下。

void HelloWorld::onTouchEnded(Touch* touch, Event  *event)
{
    Vec2 p = touch->getLocation();
    
    log("touchend  x = %f y = %f ", p.x,p.y);

    drawCrater->drawCircle(p, 15, CC_DEGREES_TO_RADIANS(90),50, false, Color4F::Color4F::GRAY);
    drawCrater->drawLine(Vec2(100,100), p, Color4F::Color4F::GREEN);


}


```


我再多画一根线,就都出来了。更不懂了! 

多次点击如图

看到Bug我就屁颠屁颠跑进来了,稍后我将测试下,版本能告知下吗?

ver 3.3

能解答下,为什么我的画的圆是偏的,不是点击的位置 :)

drawCrater->setPosition(Vec2(left,top)); 这个的原因。 靠 这个坐标系还是没搞清楚。

额,问题搞定了?

没有 , 画空心圆那个问题还是存在。

楼主代码里这个drawCrater是什么东西…应该不是DrawNode吧…DrawNode在3.3里面就没那个接口…
然后我画了实心圆…代码如下
void HelloWorld::onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event)
{
auto drawC = CCDrawNode::create();
Vec2 p = touch->getLocation();
drawC->drawDot(p, 15, Color4F::GRAY);
this->addChild(drawC);
}
一切是正常的…

是drawNode

你用 drawCircle ,我的问题是出在这儿。

我画实心圆也没问题。 画空心圆有问题

好吧,我弄错了…不过3.3里面我也实现了…
void HelloWorld::onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event)
{
auto drawC = DrawNode::create();
Vec2 P = touch->getLocation();
drawC->drawCircle(P, 15, CC_DEGREES_TO_RADIANS(90),30, false, Color4F::Color4F::GRAY);
this->addChild(drawC);
}

你的代码我也试了没问题,那区别就是变量定义域不一样了。 奇怪啊,只是一个类成员变量而以,只有这个区别的

class HelloWorld : public cocos2d::Layer
{
public:
    // there's no 'id' in cpp, so we recommend returning the class instance pointer
    static cocos2d::Scene* createScene();

    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();
    
    // a selector callback
    void menuCloseCallback(cocos2d::Ref* pSender);
    void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event  *event);
    bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event  *event);
    void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event  *event);
    cocos2d::DrawNode *drawCrater;                                            
    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);
};


bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    drawCrater = DrawNode::create();
    this->addChild(drawCrater);

.......
}


void HelloWorld::onTouchEnded(Touch* touch, Event  *event)
{
    Vec2 p = touch->getLocation();
    
    log("touchend  x = %f y = %f ", p.x,p.y);

    drawCrater->drawCircle(p2, 15, CC_DEGREES_TO_RADIANS(90),100,false, Color4F::Color4F::YELLOW);
}


```

我觉得你那样写才是正确的,我们两个的区别其实主要是我点一下,创建一个节点,而你一直在一个节点里面画。明显你那种方法更好。
但是这种方法不知道为什么画空心圆无法实现,实心圆却可以。
我会反馈下,可能是个Bug

哈哈 好,终于重现问题。 版主的耐心值得佩服!:14:

你可以关注下这个issuse https://github.com/cocos2d/cocos2d-x/issues/10393

这边已经通知我了,说空心圆那个,你第二次调用的时候要drawCrater->clear ,但是这样只能画一个,如果你要画多个的话,就需要创建多个DrawNode,看来我的用法还是没错的= =!

哦 这样子啊。这个用法有点奇怪 。 谢谢 新年快乐 !