cocos2d-x 触屏画线

cocos2d-x版本:2.1.3

原理:当出现屏幕触摸事件时,记录触摸点的坐标,然后通过重载draw()方法,这个方法每帧会画一次屏幕,我们在该方法中将记录的点画出来。

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

#include "Box2D/Box2D.h"

#include "SimpleAudioEngine.h"
USING_NS_CC;

class HelloWorld : public cocos2d::CCLayer
{
public:
    virtual bool init();  
    static cocos2d::CCScene* scene();
    void menuCloseCallback(CCObject* pSender);
    CREATE_FUNC(HelloWorld);
public :
    CCPointArray*pArray;
    virtual void draw();
    virtual bool ccTouchBegan(CCTouch*touch,CCEvent*event);//触摸开始
    virtual void ccTouchMoved(CCTouch*touch,CCEvent*event);//触摸移动
    virtual void ccTouchEnded(CCTouch*touch,CCEvent*event);//触摸结束
    virtual void registerWithTouchDispatcher(void);//注册单点触摸
};

#endif  // __HELLOWORLD_SCENE_H__
#include "HelloWorldScene.h"

using namespace cocos2d;

CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do 
    {
        scene = CCScene::create();
        CC_BREAK_IF(! scene);
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);
        scene->addChild(layer);
    } while (0);
    return scene;
}
bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        CC_BREAK_IF(! CCLayer::init());
        CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
            "CloseNormal.png",
            "CloseSelected.png",
            this,
            menu_selector(HelloWorld::menuCloseCallback));
        CC_BREAK_IF(! pCloseItem);
        pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
        pMenu->setPosition(CCPointZero);
        CC_BREAK_IF(! pMenu);
        this->addChild(pMenu, 1);
        pArray=CCPointArray::create(20);
        pArray->retain();//增加引用计数,不然会被自动释放
        this->setTouchEnabled(true);
        bRet = true;
    } while (0);

    return bRet;
}
void HelloWorld::draw(){
    //画直线
    glLineWidth(5);
    ccDrawColor4B(0,255,255,255);
    //是不是最后一个点
    bool isFirstPoint=false;
    if(pArray!=NULL){
        int count=pArray->count();
        for(int i=0;i<count;i++){
            //取出一个坐标
            CCPoint point=pArray->getControlPointAtIndex(i);
            //判断是不是松手时的坐标
            if(point.equals(ccp(-1,-1))){
                isFirstPoint=true;
            }else{
                //如果是第一个坐标点或松手时的坐标点画点,否则画直线
                if(i==0||isFirstPoint){
                    ccDrawPoint(ccp(point.x,point.y));
                    isFirstPoint=false;
                }else{
                    CCPoint ps=pArray->getControlPointAtIndex(i-1);
                    ccDrawLine(ccp(point.x,point.y),ccp(ps.x,ps.y )); 
                }
            }
        }
    }

};
//触摸开始
bool HelloWorld::ccTouchBegan(CCTouch*touch,CCEvent*event){
    CCPoint point=touch->getLocationInView();
    point=CCDirector::sharedDirector()->convertToGL(point);
    pArray->addControlPoint(point);
    return true;
};
//触摸移动
void HelloWorld::ccTouchMoved(CCTouch*touch,CCEvent*event){
    CCPoint point =touch->getLocationInView();
    point=CCDirector::sharedDirector()->convertToGL(point);
    pArray->addControlPoint(point);
};
//触摸结束
void HelloWorld::ccTouchEnded(CCTouch*touch,CCEvent*event){
    pArray->addControlPoint(ccp(-1,-1));
};
//注册单点触摸
void HelloWorld::registerWithTouchDispatcher(void){
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
};
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    //pArray->removeAllObjects(); 
}



最后想清除所有的点,实现清空画板的效果,但是没完成。

posted @ 2013-10-23 15:09  唯美坏少  阅读(687)  评论(0编辑  收藏  举报